From ac5953f856afe05adc620cca15e9b582166ee124 Mon Sep 17 00:00:00 2001 From: Thespica Date: Sun, 12 Jul 2026 02:29:36 +0800 Subject: [PATCH 01/68] feat(hubble): support hubble 2.0 alpha client & backend base Co-authored-by: yeaury --- .github/workflows/hubble-ci.yml | 41 + .../apache/hugegraph/api/auth/UserAPI.java | 6 + .../apache/hugegraph/driver/AuthManager.java | 4 + .../apache/hugegraph/driver/HugeClient.java | 13 +- .../hugegraph/driver/HugeClientBuilder.java | 6 +- .../org/apache/hugegraph/BaseClientTest.java | 1 + .../hugegraph/api/auth/LoginApiTest.java | 1 + .../hugegraph/api/auth/LogoutApiTest.java | 1 + .../hugegraph/api/auth/TokenApiTest.java | 1 + .../hugegraph/functional/AuthManagerTest.java | 1 + .../scripts/dependency/known-dependencies.txt | 150 +- hugegraph-hubble/README.md | 6 +- hugegraph-hubble/hubble-be/pom.xml | 287 +- .../org/apache/hugegraph/HugeGraphHubble.java | 8 +- .../org/apache/hugegraph/common/AppName.java | 54 + .../org/apache/hugegraph/common/AppType.java | 55 + .../org/apache/hugegraph/common/Constant.java | 13 +- .../apache/hugegraph/common/Mergeable.java | 1 - .../apache/hugegraph/common/OptionType.java | 57 + .../apache/hugegraph/config/CacheConfig.java | 5 +- .../apache/hugegraph/config/HubbleConfig.java | 11 +- .../config/IngestionProxyServlet.java | 72 + .../hugegraph/config/JacksonConfig.java | 53 +- .../apache/hugegraph/config/MetaConfig.java | 60 + .../config/ProxyServletConfiguration.java | 57 + .../hugegraph/config/TomcatServletConfig.java | 14 +- .../apache/hugegraph/config/WebMvcConfig.java | 51 +- .../hugegraph/controller/AboutController.java | 24 +- .../hugegraph/controller/BaseController.java | 202 +- .../controller/ConfigController.java | 49 + .../controller/GraphConnectionController.java | 236 - .../controller/SettingController.java | 11 +- .../algorithm/OlapAlgoController.java | 46 + .../algorithm/OltpAlgoController.java | 257 +- .../algorithm/VermeerAlgoController.java | 90 + .../controller/auth/AccessController.java | 82 + .../controller/auth/AuthController.java | 24 + .../controller/auth/BelongController.java | 117 + .../auth/GraphSpaceUserController.java | 115 + .../controller/auth/GroupController.java | 102 + .../controller/auth/LoginController.java | 86 + .../controller/auth/RoleController.java | 116 + .../controller/auth/TargetController.java | 90 + .../controller/auth/UserController.java | 229 + .../auth/WhiteIpListController.java | 58 + .../controller/graph/GraphController.java | 270 +- .../controller/graphs/GraphsController.java | 381 + .../controller/ingest/IngestController.java | 346 + .../langchain/LangChainController.java | 678 + .../load/FileMappingController.java | 87 +- .../controller/load/FileUploadController.java | 89 +- .../controller/load/JobManagerController.java | 71 +- .../controller/load/LoadTaskController.java | 98 +- .../controller/op/AuditController.java | 91 + .../controller/op/DashboardController.java | 53 + .../controller/op/HStoreController.java | 156 + .../controller/op/K8sTokenController.java | 87 + .../controller/op/LogController.java | 98 + .../controller/op/MonitorController.java | 57 + .../hugegraph/controller/op/PDController.java | 38 + .../query/ApplicationInfoController.java | 118 + .../controller/query/CypherController.java | 143 + .../query/EditElementHistoryController.java | 260 + .../query/ExecuteHistoryController.java | 41 +- .../query/GremlinCollectionController.java | 51 +- .../controller/query/GremlinController.java | 4 +- .../query/GremlinQueryController.java | 166 +- .../saas/GraphMetricsController.java | 473 + .../saas/GraphSpaceMetricsController.java | 148 + .../saas/SaaSMetricsController.java | 348 + .../saas/SaasGraphViewController.java | 176 + .../schema/EdgeLabelController.java | 139 +- .../schema/PropertyIndexController.java | 23 +- .../schema/PropertyKeyController.java | 90 +- .../controller/schema/SchemaController.java | 208 +- .../schema/VertexLabelController.java | 238 +- .../sketch/GraphSketchController.java | 169 + .../space/ComputerDisController.java | 75 + .../space/GraphSpaceController.java | 244 + .../space/SchemaTemplateController.java | 118 + .../controller/space/ServiceController.java | 182 + .../controller/space/VermeerController.java | 134 + .../controller/task/AsyncTaskController.java | 62 +- .../hugegraph/entity/GraphConnection.java | 37 +- .../entity/algorithm/AdamicadarEntity.java | 51 + .../algorithm/AllShortestPathsEntity.java | 58 + .../entity/algorithm/CrossPointsEntity.java | 58 + .../algorithm/JaccardSimilarityEntity.java | 48 + .../entity/algorithm/KneighborEntity.java | 51 + .../entity/algorithm/KoutEntity.java | 61 + .../entity/algorithm/OlapEntity.java | 44 + .../entity/algorithm/PathsEntity.java | 58 + .../entity/algorithm/RaysEntity.java | 55 + .../algorithm/ResourceallocationEntity.java | 51 + .../entity/algorithm/RingsEntity.java | 58 + .../entity/algorithm/SameNeighborsEntity.java | 52 + ...rtestPath.java => ShortestPathEntity.java} | 8 +- .../SingleSourceShortestPathEntity.java | 61 + .../algorithm/WeightedShortestPathEntity.java | 61 + .../hugegraph/entity/auth/AccessEntity.java | 68 + .../hugegraph/entity/auth/BelongEntity.java | 57 + .../hugegraph/entity/auth/PasswordEntity.java | 40 + .../hugegraph/entity/auth/RoleEntity.java | 40 + .../hugegraph/entity/auth/UserEntity.java | 82 + .../hugegraph/entity/auth/UserView.java | 48 + .../entity/auth/WhiteIpListEntity.java | 39 + .../hugegraph/entity/enums/ExecuteType.java | 31 +- .../hugegraph/entity/enums/LoadStatus.java | 5 +- .../hugegraph/entity/graph/EdgeEntity.java | 8 +- .../hugegraph/entity/graph/VertexEntity.java | 1 - .../entity/graph/VertexQueryEntity.java | 73 + .../entity/graphs/GraphCloneEntity.java | 67 + .../hugegraph/entity/graphs/GraphEntity.java | 34 + .../entity/graphs/GraphStatisticsEntity.java | 58 + .../hugegraph/entity/load/Datasource.java | 60 + .../hugegraph/entity/load/EdgeMapping.java | 8 +- .../hugegraph/entity/load/ElementMapping.java | 14 +- .../entity/load/FieldMappingItem.java | 1 - .../hugegraph/entity/load/FileMapping.java | 35 +- .../hugegraph/entity/load/FileSetting.java | 18 +- .../entity/load/FileUploadResult.java | 3 +- .../hugegraph/entity/load/JobManager.java | 22 +- .../hugegraph/entity/load/JobManagerItem.java | 1 - .../entity/load/JobManagerReasonResult.java | 1 - .../hugegraph/entity/load/ListFormat.java | 7 +- .../hugegraph/entity/load/LoadParameter.java | 6 +- .../hugegraph/entity/load/LoadTask.java | 25 +- .../hugegraph/entity/load/NullValues.java | 1 - .../entity/load/ValueMappingItem.java | 1 - .../hugegraph/entity/load/VertexMapping.java | 5 +- .../hugegraph/entity/op/AuditEntity.java | 71 + .../apache/hugegraph/entity/op/LogEntity.java | 69 + .../hugegraph/entity/query/AdjacentQuery.java | 1 - .../entity/query/ApplicationInfo.java | 71 + .../hugegraph/entity/query/EgonetView.java | 46 + .../entity/query/ElementEditHistory.java | 111 + .../entity/query/ExecuteHistory.java | 49 +- .../entity/query/FusiformsimilarityView.java | 48 + .../hugegraph/entity/query/GraphView.java | 182 +- .../entity/query/GremlinCollection.java | 15 +- .../hugegraph/entity/query/GremlinQuery.java | 20 +- .../hugegraph/entity/query/GremlinResult.java | 4 +- .../entity/query/JaccardsimilarityView.java | 35 + .../hugegraph/entity/query/JsonView.java | 5 +- .../hugegraph/entity/query/OlapView.java | 34 + .../hugegraph/entity/query/RanksView.java | 40 + .../entity/query/SameneighborsbatchView.java | 38 + .../entity/schema/ConflictDetail.java | 20 +- .../entity/schema/EdgeLabelEntity.java | 25 +- .../entity/schema/EdgeLabelStyle.java | 10 +- .../entity/schema/LabelUpdateEntity.java | 7 +- .../hugegraph/entity/schema/Property.java | 9 +- .../entity/schema/PropertyIndex.java | 10 +- .../entity/schema/PropertyKeyEntity.java | 1 - .../entity/schema/SchemaConflict.java | 22 +- .../entity/schema/SchemaLabelEntity.java | 2 +- .../hugegraph/entity/schema/SchemaStyle.java | 1 - .../hugegraph/entity/schema/SchemaType.java | 2 +- .../entity/schema/VertexLabelEntity.java | 3 +- .../entity/schema/VertexLabelStyle.java | 12 +- .../schema/vertexlabel/ParamEntity.java | 96 + .../entity/schema/vertexlabel/ParamStyle.java | 63 + .../hugegraph/entity/space/BuiltInEntity.java | 39 + .../entity/space/ComputerServiceEntity.java | 50 + .../entity/space/GraphSpaceEntity.java | 58 + .../hugegraph/entity/task/AsyncTask.java | 1 - .../entity/task/AsyncTaskResult.java | 1 - .../hugegraph/exception/HugeException.java | 25 + ...eption.java => UnauthorizedException.java} | 15 +- .../handler/CustomApplicationRunner.java | 12 +- .../hugegraph/handler/CustomInterceptor.java | 67 +- .../handler/EdgeMappingTypeHandler.java | 11 +- .../hugegraph/handler/ErrorCodeMessage.java | 193 + .../hugegraph/handler/ExceptionAdvisor.java | 109 +- .../handler/HubbleDisposableBean.java | 3 +- .../hugegraph/handler/LoadTaskExecutor.java | 11 +- .../hugegraph/handler/LoginInterceptor.java | 43 + .../handler/MessageSourceHandler.java | 10 +- .../hugegraph/handler/ResponseAdvisor.java | 27 +- .../handler/VertexMappingTypeHandler.java | 13 +- .../license/CommonLicenseManager.java | 119 + .../apache/hugegraph/license/ExtraParam.java | 132 + .../license/LicenseVerifyManager.java | 163 + .../hugegraph/license/LicenseVerifyParam.java | 61 + .../apache/hugegraph/license/MachineInfo.java | 123 + .../mapper/GraphConnectionMapper.java | 50 - .../hugegraph/mapper/UserInfoMapper.java | 4 +- .../mapper/algorithm/AsyncTaskMapper.java | 4 +- .../mapper/load/DatasourceMapper.java | 26 + .../mapper/load/FileMappingMapper.java | 3 +- .../mapper/load/JobManagerMapper.java | 6 +- .../hugegraph/mapper/load/LoadTaskMapper.java | 4 +- .../mapper/query/ApplicationInfoMapper.java | 68 + .../query/EditElementHistoryMapper.java | 73 + .../mapper/query/ExecuteHistoryMapper.java | 22 +- .../mapper/query/GremlinCollectionMapper.java | 12 +- .../hugegraph/options/HubbleOptions.java | 193 +- .../service/HugeClientPoolService.java | 199 +- .../hugegraph/service/SettingSSLService.java | 9 +- .../service/algorithm/AsyncTaskService.java | 66 +- .../service/algorithm/OlapAlgoService.java | 65 + .../service/algorithm/OltpAlgoService.java | 1334 +- .../hugegraph/service/auth/AccessService.java | 173 + .../hugegraph/service/auth/AuthService.java | 22 + .../hugegraph/service/auth/BelongService.java | 229 + .../service/auth/GraphSpaceUserService.java | 175 + .../hugegraph/service/auth/GroupService.java | 89 + .../service/auth/ManagerService.java | 31 + .../hugegraph/service/auth/RoleService.java | 109 + .../hugegraph/service/auth/TargetService.java | 76 + .../hugegraph/service/auth/UserService.java | 546 + .../service/auth/WhiteIpListService.java | 53 + .../hugegraph/service/graph/GraphService.java | 221 +- .../service/graphs/GraphsService.java | 666 + .../service/license/LicenseService.java | 351 +- .../DatasourceService.java} | 70 +- .../service/load/FileMappingService.java | 34 +- .../service/load/JobManagerService.java | 43 +- .../service/load/LoadTaskService.java | 184 +- .../hugegraph/service/op/AuditService.java | 273 + .../hugegraph/service/op/ESService.java | 124 + .../hugegraph/service/op/LogService.java | 284 + .../service/query/ApplicationInfoService.java | 56 + .../query/EditElementHistoryService.java | 172 + .../service/query/ExecuteHistoryService.java | 87 +- .../query/GremlinCollectionService.java | 57 +- ...linQueryService.java => QueryService.java} | 147 +- .../service/saas/PrometheusService.java | 201 + .../service/schema/EdgeLabelService.java | 167 +- .../service/schema/PropertyIndexService.java | 55 +- .../service/schema/PropertyKeyService.java | 63 +- .../service/schema/SchemaService.java | 163 +- .../service/schema/VertexLabelService.java | 103 +- .../service/space/ComputerService.java | 92 + .../service/space/GraphSpaceService.java | 335 + .../service/space/HStoreService.java | 45 + .../service/space/OLTPServerService.java | 113 + .../service/space/SchemaTemplateService.java | 68 + .../service/space/VermeerService.java | 121 + .../org/apache/hugegraph/util/ESUtil.java | 60 + .../org/apache/hugegraph/util/EntityUtil.java | 4 +- .../java/org/apache/hugegraph/util/Ex.java | 4 +- .../org/apache/hugegraph/util/FileUtil.java | 2 +- .../apache/hugegraph/util/GremlinUtil.java | 229 + .../org/apache/hugegraph/util/HubbleUtil.java | 176 +- .../apache/hugegraph/util/HugeClientUtil.java | 60 +- .../org/apache/hugegraph/util/PageUtil.java | 21 +- .../org/apache/hugegraph/util/SQLUtil.java | 1 + .../org/apache/hugegraph/util/UrlUtil.java | 74 + .../hugegraph/version/HubbleVersion.java | 6 +- .../src/main/resources/application.properties | 20 +- .../src/main/resources/database/data.sql | 19 +- .../src/main/resources/database/schema.sql | 125 +- .../resources/hugegraph-hubble.properties | 39 + .../main/resources/i18n/messages.properties | 9 + .../resources/i18n/messages_zh_CN.properties | 6 + .../hubble-be/src/main/resources/log4j2.xml | 107 +- .../apache/hugegraph/unit/EntityUtilTest.java | 53 - .../unit/FileUploadControllerTest.java | 269 + .../apache/hugegraph/unit/FileUtilTest.java | 5 +- .../hugegraph/unit/GraphConnectionTest.java | 56 - .../hugegraph/unit/HubbleOptionsTest.java | 35 + .../unit/OltpAlgoControllerTest.java | 52 + .../hugegraph/unit/OltpAlgoServiceTest.java | 189 + .../apache/hugegraph/unit/UnitTestSuite.java | 8 +- .../test/python/steps/check_server_status.py | 5 +- .../src/test/resources/application.properties | 13 +- .../src/test/resources/database/data.sql | 1 + .../src/test/resources/database/schema.sql | 100 +- .../hubble-be/src/test/resources/log4j2.xml | 75 - .../travis/run_algorithm_api_inventory.py | 360 + .../assembly/travis/run_live_hubble_smoke.py | 705 + .../assembly/travis/run_ui_browser_smoke.js | 153 + .../assembly/travis/run_ui_full_acceptance.js | 95 + .../travis/run_ui_i18n_switch_smoke.js | 124 + .../travis/verify-hubble-issue-694.sh | 148 + hugegraph-hubble/hubble-dist/pom.xml | 23 +- .../{hubble-fe => hubble-fe-old(legacy)}/.env | 0 .../CHANGELOG.md | 0 .../CHANGELOG.zh-CN.md | 0 .../hubble-fe-old(legacy)/README.md | 3 + .../add-license.js | 0 .../config-overrides.js | 0 .../hubble-fe-old(legacy)/package.json | 78 + .../hubble-fe-old(legacy)/public/favicon.ico | Bin 0 -> 4286 bytes .../hubble-fe-old(legacy)/public/index.html | 38 + .../public/manifest.json | 15 + .../src/assets/imgs/ic_add.svg | 2 +- .../src/assets/imgs/ic_add_node.svg | 2 +- .../src/assets/imgs/ic_arrow.svg | 2 +- .../src/assets/imgs/ic_arrow_16.svg | 2 +- .../src/assets/imgs/ic_arrow_blue.svg | 2 +- .../src/assets/imgs/ic_arrow_selected.svg | 2 +- .../src/assets/imgs/ic_arrow_white.svg | 2 +- .../src/assets/imgs/ic_back_32.svg | 2 +- .../src/assets/imgs/ic_back_32_normal.svg | 2 +- .../src/assets/imgs/ic_back_32_pressed.svg | 2 +- .../src/assets/imgs/ic_biaoge_hover.svg | 2 +- .../src/assets/imgs/ic_biaoge_normal.svg | 2 +- .../src/assets/imgs/ic_biaoge_pressed.svg | 2 +- .../src/assets/imgs/ic_cebianshouqi.svg | 2 +- .../src/assets/imgs/ic_cebianzhankai.svg | 2 +- .../src/assets/imgs/ic_close_16.svg | 2 +- .../src/assets/imgs/ic_close_white.svg | 2 +- .../src/assets/imgs/ic_daorushuju_normal.svg | 2 +- .../src/assets/imgs/ic_daorushuju_pressed.svg | 2 +- .../src/assets/imgs/ic_done_144.svg | 2 +- .../src/assets/imgs/ic_error_12.svg | 2 +- .../src/assets/imgs/ic_fail.svg | 2 +- .../src/assets/imgs/ic_fangda_16.svg | 2 +- .../src/assets/imgs/ic_json_hover.svg | 2 +- .../src/assets/imgs/ic_json_normal.svg | 2 +- .../src/assets/imgs/ic_json_pressed.svg | 2 +- .../src/assets/imgs/ic_liebiaomoshi_black.svg | 2 +- .../src/assets/imgs/ic_liebiaomoshi_white.svg | 2 +- .../src/assets/imgs/ic_loading@2x.svg | 2 +- .../src/assets/imgs/ic_loading_back.svg | 2 +- .../src/assets/imgs/ic_loading_front.svg | 2 +- .../src/assets/imgs/ic_middle_16.svg | 2 +- .../src/assets/imgs/ic_pass.svg | 2 +- .../src/assets/imgs/ic_progress_done.svg | 2 +- .../src/assets/imgs/ic_quanping_16.svg | 2 +- .../src/assets/imgs/ic_question_mark.svg | 2 +- .../src/assets/imgs/ic_refresh.svg | 2 +- .../src/assets/imgs/ic_renwuguanli_normal.svg | 2 +- .../assets/imgs/ic_renwuguanli_pressed.svg | 2 +- .../src/assets/imgs/ic_shuju_normal.svg | 2 +- .../src/assets/imgs/ic_shuju_pressed.svg | 2 +- .../src/assets/imgs/ic_sousuo_empty.svg | 2 +- .../src/assets/imgs/ic_straight.svg | 2 +- .../src/assets/imgs/ic_straight_selected.svg | 2 +- .../src/assets/imgs/ic_suoxiao_16.svg | 2 +- .../src/assets/imgs/ic_topback.svg | 2 +- .../src/assets/imgs/ic_tuichuquanping_16.svg | 2 +- .../src/assets/imgs/ic_tumoshi_black.svg | 2 +- .../src/assets/imgs/ic_tumoshi_white.svg | 2 +- .../src/assets/imgs/ic_tuzhanshi_hover.svg | 2 +- .../src/assets/imgs/ic_tuzhanshi_normal.svg | 2 +- .../src/assets/imgs/ic_tuzhanshi_pressed.svg | 2 +- .../src/assets/imgs/ic_xiazai_16.svg | 2 +- .../src/assets/imgs/ic_yingshe_16.svg | 2 +- .../src/assets/imgs/ic_yuanshuju_normal.svg | 2 +- .../src/assets/imgs/ic_yuanshuju_pressed.svg | 2 +- .../assets/imgs/icon_clickarrow_left_grey.svg | 2 +- .../imgs/icon_clickarrow_rigth_grey.svg | 2 +- .../src/assets/imgs/logo.png | Bin .../src/components/App.tsx | 0 .../src/components/common/AppBar.less | 0 .../src/components/common/AppBar.tsx | 0 .../components/common/LoadingDataView.less | 0 .../src/components/common/LoadingDataView.tsx | 0 .../src/components/common/Tooltip.tsx | 0 .../src/components/common/index.ts | 0 .../graph-management/GraphManagement.less | 0 .../graph-management/GraphManagement.tsx | 0 .../GraphManagementEmptyList.tsx | 0 .../GraphManagementHeader.tsx | 0 .../GraphManagementLimitHint.tsx | 0 .../graph-management/GraphManagementList.tsx | 0 .../GraphManagementSidebar.tsx | 0 .../graph-management/NewGraphConfig.tsx | 0 .../async-tasks/AsyncTaskList.less | 0 .../async-tasks/AsyncTaskList.tsx | 0 .../async-tasks/AsyncTaskResult.less | 0 .../async-tasks/AsyncTaskResult.tsx | 0 .../graph-management/async-tasks/index.ts | 0 .../data-analyze/DataAnalyze.less | 0 .../data-analyze/DataAnalyze.tsx | 0 .../data-analyze/DataAnalyzeContent.tsx | 0 .../data-analyze/DataAnalyzeInfoDrawer.tsx | 0 .../data-analyze/DynamicAddEdge.tsx | 0 .../data-analyze/DynamicAddNode.tsx | 0 .../ExecLogAndQueryCollections.tsx | 0 .../data-analyze/GremlinKeyWords.ts | 0 .../data-analyze/QueryAndAlgorithmLibrary.tsx | 0 .../data-analyze/algorithm/AllPath.tsx | 0 .../data-analyze/algorithm/CustomPath.tsx | 0 .../data-analyze/algorithm/FocusDetection.tsx | 0 .../data-analyze/algorithm/Jaccard.tsx | 0 .../data-analyze/algorithm/KHop.tsx | 0 .../data-analyze/algorithm/KStepNeighbor.tsx | 0 .../data-analyze/algorithm/LoopDetection.tsx | 0 .../algorithm/ModelSimilarity.tsx | 0 .../data-analyze/algorithm/NeighborRank.tsx | 0 .../data-analyze/algorithm/PersonalRank.tsx | 0 .../algorithm/RadiographicInspection.tsx | 0 .../data-analyze/algorithm/SameNeighbor.tsx | 0 .../data-analyze/algorithm/ShortestPath.tsx | 0 .../algorithm/ShortestPathAll.tsx | 0 .../SingleSourceWeightedShortestPath.tsx | 0 .../algorithm/WeightedShortestPath.tsx | 0 .../data-analyze/common/Favorite.tsx | 0 .../graph-management/data-analyze/index.ts | 0 .../query-result/GraphPopOver.tsx | 0 .../query-result/GraphQueryResult.tsx | 0 .../query-result/JSONQueryResult.tsx | 0 .../query-result/QueryFilterOptions.tsx | 0 .../data-analyze/query-result/QueryResult.tsx | 0 .../query-result/TableQueryResult.tsx | 0 .../data-analyze/query-result/index.ts | 0 .../data-import/import-tasks/ImportFinish.tsx | 0 .../import-tasks/ImportManager.less | 0 .../import-tasks/ImportManager.tsx | 0 .../import-tasks/ImportTaskList.tsx | 0 .../data-import/import-tasks/ImportTasks.less | 0 .../data-import/import-tasks/ImportTasks.tsx | 0 .../data-import/import-tasks/UploadEntry.less | 0 .../data-import/import-tasks/UploadEntry.tsx | 0 .../datamap-configs/DataMapConfigs.less | 0 .../datamap-configs/DataMapConfigs.tsx | 0 .../import-tasks/datamap-configs/EdgeMap.tsx | 0 .../datamap-configs/FileConfigs.tsx | 0 .../TypeConfigManipulations.tsx | 0 .../datamap-configs/TypeConfigs.tsx | 0 .../import-tasks/datamap-configs/TypeInfo.tsx | 0 .../datamap-configs/VertexMap.tsx | 0 .../import-tasks/datamap-configs/index.ts | 0 .../import-tasks/error-logs/JobErrorLogs.less | 0 .../import-tasks/error-logs/JobErrorLogs.tsx | 0 .../error-logs/TaskErrorLogs.less | 0 .../import-tasks/error-logs/TaskErrorLogs.tsx | 0 .../import-tasks/error-logs/index.ts | 0 .../data-import/import-tasks/index.ts | 0 .../job-details/BasicSettings.tsx | 0 .../job-details/DataImportDetails.tsx | 0 .../import-tasks/job-details/DataMaps.tsx | 0 .../import-tasks/job-details/JobDetails.less | 0 .../import-tasks/job-details/JobDetails.tsx | 0 .../job-details/UploadedFiles.tsx | 0 .../import-tasks/job-details/index.ts | 0 .../server-data-import/ImportConfigs.tsx | 0 .../server-data-import/ServerDataImport.less | 0 .../server-data-import/ServerDataImport.tsx | 0 .../import-tasks/server-data-import/index.ts | 0 .../graph-management/data-import/index.ts | 0 .../src/components/graph-management/index.ts | 0 .../metadata-configs/MetadataConfigs.less | 0 .../metadata-configs/MetadataConfigs.tsx | 0 .../metadata-configs/common/EmptyDataView.tsx | 0 .../edge-type/EdgeTypeList.less | 0 .../edge-type/EdgeTypeList.tsx | 0 .../edge-type/NewEdgeType.less | 0 .../edge-type/NewEdgeType.tsx | 0 .../edge-type/ReuseEdgeTypes.less | 0 .../edge-type/ReuseEdgeTypes.tsx | 0 .../metadata-configs/edge-type/index.ts | 0 .../graph-view/CheckAndEditEdge.tsx | 0 .../graph-view/CheckAndEditVertex.tsx | 0 .../graph-view/CheckProperty.tsx | 0 .../graph-view/CreateEdge.tsx | 0 .../graph-view/CreateProperty.tsx | 0 .../graph-view/CreateVertex.tsx | 0 .../graph-view/GraphView.less | 0 .../metadata-configs/graph-view/GraphView.tsx | 0 .../metadata-configs/graph-view/index.ts | 0 .../metadata-configs/index.ts | 0 .../property-index/PropertyIndex.less | 0 .../property-index/PropertyIndex.tsx | 0 .../metadata-configs/property-index/index.ts | 0 .../property/MetadataProperties.less | 0 .../property/MetadataProperties.tsx | 0 .../property/ReuseProperties.less | 0 .../property/ReuseProperties.tsx | 0 .../metadata-configs/property/index.ts | 0 .../vertex-type/NewVertexType.less | 0 .../vertex-type/NewVertexType.tsx | 0 .../vertex-type/ReuseVertexTypes.less | 0 .../vertex-type/ReuseVertexTypes.tsx | 0 .../vertex-type/VertexTypeList.less | 0 .../vertex-type/VertexTypeList.tsx | 0 .../metadata-configs/vertex-type/index.ts | 0 .../src/components/hubble-ui/index.tsx | 0 .../src/components/hubble-ui/src/index.less | 0 .../src/hooks/index.ts | 0 .../src/hooks/useInitDataImport.tsx | 0 .../src/hooks/useLocationWithConfirmation.tsx | 0 .../src/hooks/useMultiKeyPress.tsx | 0 .../src/i18n/index.ts | 0 .../en-US/graph-managment/AsyncTasks.json | 0 .../GraphManagementSidebar.json | 0 .../en-US/graph-managment/addition.json | 0 .../en-US/graph-managment/common.json | 0 .../data-import/import-tasks/ImportTasks.json | 0 .../en-US/graph-managment/dataAnalyze.json | 0 .../resources/en-US/graph-managment/index.ts | 0 .../src/i18n/resources/en-US/index.ts | 0 .../src/i18n/resources/index.ts | 0 .../zh-CN/graph-managment/AsyncTasks.json | 64 + .../GraphManagementSidebar.json | 5 + .../zh-CN/graph-managment/addition.json | 348 + .../zh-CN/graph-managment/common.json | 5 + .../data-import/import-tasks/ImportTasks.json | 0 .../zh-CN/graph-managment/dataAnalyze.json | 0 .../resources/zh-CN/graph-managment/index.ts | 0 .../src/i18n/resources/zh-CN/index.ts | 0 .../src/index.less | 0 .../src/index.tsx | 0 .../src/react-app-env.d.ts | 0 .../GraphManagementStore/asyncTasksStore.ts | 0 .../algorithmAnalyzerStore.ts | 0 .../dataAnalyzeStore/dataAnalyzeStore.ts | 0 .../dataImportStore/ImportManagerStore.ts | 0 .../dataImportStore/dataImportRootStore.ts | 0 .../dataImportStore/dataMapStore.ts | 0 .../dataImportStore/serverDataImportStore.ts | 0 .../graphManagementStore.ts | 0 .../metadataConfigsStore/edgeTypeStore.ts | 0 .../metadataConfigsStore/graphViewStore.ts | 0 .../metadataConfigsStore.ts | 0 .../metadataPropertyIndexStore.ts | 0 .../metadataPropertyStore.ts | 0 .../metadataConfigsStore/vertexTypeStore.ts | 0 .../src/stores/appStore.ts | 0 .../src/stores/factory/asyncTasksStore.ts | 0 .../dataAnalyzeStore/algorithmStore.ts | 0 .../dataAnalyzeStore/dataAnalyzeStore.ts | 0 .../dataImportStore/dataImportRootStore.ts | 0 .../factory/dataImportStore/dataMapStore.ts | 0 .../dataImportStore/importManagmentStore.ts | 0 .../dataImportStore/serverDataImportStore.ts | 0 .../src/stores/index.ts | 0 .../GraphManagementStore/asyncTasksStore.ts | 0 .../GraphManagementStore/dataAnalyzeStore.ts | 0 .../GraphManagementStore/dataImportStore.ts | 0 .../graphManagementStore.ts | 0 .../metadataConfigsStore.ts | 0 .../src/stores/types/common.ts | 0 .../src/stores/utils/index.ts | 0 .../src/third-party.d.ts | 0 .../src/utils/calcAlgorithmFormWidth.ts | 0 .../src/utils/convertStringToJSON.ts | 0 .../src/utils/filterEmptyAlgorightmParams.ts | 0 .../src/utils/formatAlgorithmStatement.ts | 0 .../src/utils/getUnicodeLength.ts | 0 .../src/utils/index.ts | 0 .../src/utils/isDataTypeNumeric.ts | 0 .../tsconfig-extend.json | 0 .../tsconfig.json | 0 .../hubble-fe-old(legacy)/yarn.lock | 13380 ++++++ hugegraph-hubble/hubble-fe/.eslintrc.js | 49 + hugegraph-hubble/hubble-fe/README.md | 71 +- hugegraph-hubble/hubble-fe/package-lock.json | 39632 ++++++++++++++++ hugegraph-hubble/hubble-fe/package.json | 115 +- hugegraph-hubble/hubble-fe/public/index.html | 74 +- hugegraph-hubble/hubble-fe/public/logo192.png | Bin 0 -> 5347 bytes hugegraph-hubble/hubble-fe/public/logo512.png | Bin 0 -> 9664 bytes .../hubble-fe/public/manifest.json | 10 + hugegraph-hubble/hubble-fe/public/robots.txt | 3 + .../hubble-fe/scripts/check-i18n.js | 559 + .../hubble-fe/scripts/react-app-rewired.js | 63 + hugegraph-hubble/hubble-fe/src/App.css | 92 + hugegraph-hubble/hubble-fe/src/App.js | 34 + hugegraph-hubble/hubble-fe/src/App.scss | 44 + hugegraph-hubble/hubble-fe/src/App.test.js | 26 + .../hubble-fe/src/api/analysis.js | 203 + hugegraph-hubble/hubble-fe/src/api/auth.js | 217 + hugegraph-hubble/hubble-fe/src/api/cloud.js | 54 + hugegraph-hubble/hubble-fe/src/api/config.js | 25 + hugegraph-hubble/hubble-fe/src/api/index.js | 28 + hugegraph-hubble/hubble-fe/src/api/manage.js | 368 + hugegraph-hubble/hubble-fe/src/api/request.js | 108 + .../hubble-fe/src/api/request2.js | 127 + .../hubble-fe/src/assets/canvas_bg.png | Bin 0 -> 980 bytes .../hubble-fe/src/assets/ic_arrow.svg | 33 + .../src/assets/ic_arrow_selected.svg | 31 + .../hubble-fe/src/assets/ic_biaoge_normal.svg | 27 + .../src/assets/ic_biaoge_pressed.svg | 27 + .../hubble-fe/src/assets/ic_done_144.svg | 73 + .../hubble-fe/src/assets/ic_fail.svg | 70 + .../hubble-fe/src/assets/ic_json_normal.svg | 31 + .../hubble-fe/src/assets/ic_json_pressed.svg | 31 + .../hubble-fe/src/assets/ic_loading_back.svg | 69 + .../hubble-fe/src/assets/ic_loading_front.svg | 47 + .../hubble-fe/src/assets/ic_sousuo_empty.svg | 78 + .../hubble-fe/src/assets/ic_straight.svg | 31 + .../src/assets/ic_straight_selected.svg | 31 + .../src/assets/ic_tuzhanshi_normal.svg | 32 + .../src/assets/ic_tuzhanshi_pressed.svg | 30 + .../hubble-fe/src/assets/layout_circular.svg | 19 + .../src/assets/layout_concentric.svg | 19 + .../hubble-fe/src/assets/layout_dagre.svg | 19 + .../hubble-fe/src/assets/layout_force.svg | 19 + .../hubble-fe/src/assets/layout_grid.svg | 26 + .../hubble-fe/src/assets/layout_radial.svg | 25 + .../hubble-fe/src/assets/logo.png | Bin 0 -> 2037 bytes .../hubble-fe/src/assets/logo_img.png | Bin 0 -> 37853 bytes .../hubble-fe/src/assets/logo_new.png | Bin 0 -> 79524 bytes .../hubble-fe/src/assets/logo_text.png | Bin 0 -> 85845 bytes .../src/components/CodeEditor/index.js | 100 + .../components/CodeEditor/syntax/cypher.js | 131 + .../components/CodeEditor/syntax/gremlin.js | 176 + .../src/components/CodeEditor/syntax/index.js | 22 + .../src/components/ColorSelect/index.js | 81 + .../components/ColorSelect/index.module.scss | 65 + .../src/components/ERView/EditLayer.js | 91 + .../hubble-fe/src/components/ERView/config.js | 307 + .../src/components/ERView/data/edge.json | 232 + .../src/components/ERView/data/group.json | 95 + .../src/components/ERView/data/property.json | 32 + .../src/components/ERView/data/test.json | 295 + .../src/components/ERView/data/vertex.json | 123 + .../hubble-fe/src/components/ERView/index.js | 361 + .../src/components/ERView/index.module.scss | 31 + .../hubble-fe/src/components/ERView/utils.js | 118 + .../src/components/ExecutionContent/index.js | 70 + .../ExecutionContent/index.module.scss | 22 + .../src/components/GraphinView/index.js | 67 + .../src/components/IconSelect/index.js | 107 + .../components/IconSelect/index.module.scss | 47 + .../src/components/ListButton/index.js | 39 + .../src/components/SelectUser/index.js | 72 + .../src/components/Sidebar/index.ant.js | 124 + .../src/components/Sidebar/index.module.scss | 21 + .../src/components/SlideComponent/index.js | 45 + .../SlideComponent/index.module.scss | 40 + .../hubble-fe/src/components/Status/index.js | 69 + .../src/components/Status/index.module.scss | 44 + .../src/components/TableHeader/index.js | 29 + .../components/TableHeader/index.module.scss | 21 + .../src/components/Topbar/index.ant.js | 97 + .../src/components/Topbar/index.module.scss | 51 + .../hubble-fe/src/customHook/useCustomEdge.js | 68 + .../hubble-fe/src/customHook/useCustomGrid.js | 303 + .../hubble-fe/src/customHook/useCustomNode.js | 177 + .../src/customHook/useDownloadJson.js | 42 + hugegraph-hubble/hubble-fe/src/i18n/index.js | 38 + .../resources/en-US/components/ERView.json | 30 + .../resources/en-US/components/board.json | 15 + .../resources/en-US/components/common.json | 19 + .../i18n/resources/en-US/components/index.js | 26 + .../src/i18n/resources/en-US/index.js | 46 + .../resources/en-US/modules/analysis.json | 192 + .../i18n/resources/en-US/modules/home.json | 9 + .../src/i18n/resources/en-US/modules/index.js | 30 + .../i18n/resources/en-US/modules/manage.json | 8 + .../i18n/resources/en-US/modules/modules.json | 262 + .../i18n/resources/en-US/modules/pages.json | 470 + .../hubble-fe/src/i18n/resources/index.js | 22 + .../resources/zh-CN/components/ERView.json | 30 + .../resources/zh-CN/components/board.json | 15 + .../resources/zh-CN/components/common.json | 19 + .../i18n/resources/zh-CN/components/index.js | 26 + .../zh-CN/graph-managment/AsyncTasks.json | 64 - .../GraphManagementSidebar.json | 5 - .../zh-CN/graph-managment/addition.json | 348 - .../zh-CN/graph-managment/common.json | 5 - .../src/i18n/resources/zh-CN/index.js | 46 + .../resources/zh-CN/modules/analysis.json | 192 + .../i18n/resources/zh-CN/modules/home.json | 9 + .../src/i18n/resources/zh-CN/modules/index.js | 30 + .../i18n/resources/zh-CN/modules/manage.json | 8 + .../i18n/resources/zh-CN/modules/modules.json | 262 + .../i18n/resources/zh-CN/modules/pages.json | 470 + hugegraph-hubble/hubble-fe/src/index.css | 36 + hugegraph-hubble/hubble-fe/src/index.js | 45 + hugegraph-hubble/hubble-fe/src/layout.ant.js | 41 + hugegraph-hubble/hubble-fe/src/logo.svg | 19 + .../hubble-fe/src/modules/Context/index.js | 37 + .../src/modules/GraphAnalysis/index.js | 149 + .../algorithm/AlgorithmSearch/index.js | 55 + .../AlgorithmSearch/index.module.scss | 27 + .../GraphResult/GraphMenuBar/index.js | 188 + .../GraphResult/GraphToolBar/index.js | 72 + .../algorithm/GraphResult/Home/index.js | 542 + .../GraphResult/Home/index.module.scss | 29 + .../algorithm/GraphResult/JaccView/index.js | 41 + .../GraphResult/JaccView/index.module.scss | 31 + .../GraphResult/NeighborRankView/index.js | 63 + .../NeighborRankView/index.module.scss | 43 + .../GraphResult/RankApiView/index.js | 63 + .../GraphResult/RankApiView/index.module.scss | 31 + .../algorithm/GraphResult/utils/index.js | 134 + .../src/modules/algorithm/Home/index.js | 319 + .../modules/algorithm/Home/index.module.scss | 24 + .../algorithm/LogsDetail/ExecuteLog/index.js | 185 + .../LogsDetail/ExecuteLog/index.module.scss | 24 + .../algorithm/LogsDetail/Favorite/index.js | 226 + .../LogsDetail/Favorite/index.module.scss | 40 + .../algorithm/LogsDetail/Home/index.js | 177 + .../LogsDetail/Home/index.module.scss | 46 + .../AlgorithmNameHeader/index.js | 154 + .../AlgorithmNameHeader/index.module.scss | 66 + .../algorithmsForm/BoolSelectItem/index.js | 50 + .../algorithmsForm/CapacityItem/index.js | 43 + .../algorithmsForm/DirectionItem/index.js | 53 + .../algorithm/algorithmsForm/Home/index.js | 69 + .../algorithmsForm/Home/index.module.scss | 74 + .../algorithmsForm/LabelItem/index.js | 41 + .../algorithmsForm/LimitItem/index.js | 44 + .../algorithmsForm/MaxDegreeItem/index.js | 45 + .../algorithmsForm/MaxDepthItem/index.js | 44 + .../algorithmsForm/NearestItem/index.js | 46 + .../Olap/BetweennessCentrality/index.js | 179 + .../BetweennessCentralityVermeer/index.js | 175 + .../Olap/ClosenessCentrality/index.js | 184 + .../Olap/ClosenessCentralityVermeer/index.js | 179 + .../Olap/ClusterCoefficient/index.js | 160 + .../Olap/DegreeCentrality/index.js | 175 + .../Olap/DegreeCentralityVermeer/index.js | 172 + .../Olap/FilterSubGraphMatching/index.js | 168 + .../Olap/FilteredRingsDetection/index.js | 194 + .../algorithmsForm/Olap/KCore/index.js | 160 + .../algorithmsForm/Olap/KCoreVermeer/index.js | 171 + .../Olap/LabelPropagationAlgorithm/index.js | 149 + .../LabelPropagationAlgorithmVermeer/index.js | 172 + .../algorithmsForm/Olap/Links/index.js | 175 + .../algorithmsForm/Olap/Louvain/index.js | 175 + .../Olap/OlapComputerItem/index.js | 90 + .../algorithmsForm/Olap/OlapItem/index.js | 153 + .../algorithmsForm/Olap/PageRank/index.js | 178 + .../Olap/PageRankVermeer/index.js | 179 + .../Olap/PersonalPageRank/index.js | 210 + .../Olap/RingsDetection/index.js | 158 + .../algorithmsForm/Olap/SSSPVermeer/index.js | 163 + .../Olap/TriangleCount/index.js | 179 + .../Olap/TriangleCountVermeer/index.js | 154 + .../Olap/WeaklyConnectedComponent/index.js | 158 + .../WeaklyConnectedComponentVermeer/index.js | 165 + .../algorithmsForm/OlapHome/index.js | 140 + .../algorithmsForm/OlapHome/index.module.scss | 22 + .../algorithmsForm/Oltp/AdamicAdar/index.js | 192 + .../algorithmsForm/Oltp/AllPaths/index.js | 239 + .../algorithmsForm/Oltp/Crosspoints/index.js | 216 + .../Oltp/CustomizedCrosspoints/Home/index.js | 180 + .../PathPatternForm/index.js | 162 + .../Oltp/CustomizedPaths/Home/index.js | 200 + .../Oltp/CustomizedPaths/StepItem/index.js | 198 + .../algorithmsForm/Oltp/Egonet/index.js | 285 + .../Oltp/Egonet/index.module.scss | 58 + .../Oltp/FindShortestPath/index.js | 216 + .../Oltp/FindShortestPathWithWeight/index.js | 217 + .../Oltp/FusiformSimilarity/index.js | 256 + .../Oltp/JaccardSimilarityGet/index.js | 153 + .../Oltp/JaccardSimilarityPost/index.js | 292 + .../algorithmsForm/Oltp/KneighborGet/index.js | 153 + .../Oltp/KneighborPost/index.js | 302 + .../algorithmsForm/Oltp/KoutGet/index.js | 170 + .../Oltp/KoutPost/Home/index.js | 238 + .../Oltp/KoutPost/StepFormItem/index.js | 129 + .../Oltp/MultiNodesShortestPath/index.js | 267 + .../Oltp/NeighborRankApi/index.js | 308 + .../algorithmsForm/Oltp/OltpItem/index.js | 154 + .../Oltp/OltpItem/index.module.scss | 67 + .../algorithmsForm/Oltp/Paths/index.js | 197 + .../algorithmsForm/Oltp/RankApi/index.js | 229 + .../algorithmsForm/Oltp/Rays/index.js | 208 + .../Oltp/ResourceAllocation/index.js | 173 + .../algorithmsForm/Oltp/Rings/index.js | 152 + .../Oltp/SameNeighbors/index.js | 156 + .../Oltp/SameNeighborsBatch/index.js | 175 + .../algorithmsForm/Oltp/ShortestPath/index.js | 169 + .../Oltp/SingleSourceShortestPath/index.js | 211 + .../Oltp/TemplatePaths/Home/index.js | 204 + .../Oltp/TemplatePaths/StepFormItem/index.js | 189 + .../algorithmsForm/OltpHome/index.js | 131 + .../algorithmsForm/OltpHome/index.module.scss | 22 + .../algorithmsForm/StepsItems/index.js | 139 + .../StepsItems/index.module.scss | 50 + .../algorithmsForm/VerticesItems/index.js | 106 + .../VerticesItems/index.module.scss | 60 + .../algorithm/algorithmsForm/utils/index.js | 288 + .../src/modules/analysis/Home/index.js | 416 + .../analysis/LogsDetail/ExecuteLog/index.js | 216 + .../LogsDetail/ExecuteLog/index.module.scss | 23 + .../analysis/LogsDetail/Favorite/index.js | 249 + .../LogsDetail/Favorite/index.module.scss | 39 + .../modules/analysis/LogsDetail/Home/index.js | 193 + .../LogsDetail/Home/index.module.scss | 46 + .../analysis/QueryBar/ContentCommon/index.js | 240 + .../QueryBar/ContentCommon/index.module.scss | 71 + .../modules/analysis/QueryBar/Home/index.js | 106 + .../analysis/QueryBar/Home/index.module.scss | 42 + .../GraphResult/GraphMenubar/index.js | 181 + .../GraphResult/GraphToolBar/index.js | 72 + .../QueryResult/GraphResult/Home/index.js | 570 + .../GraphResult/Home/index.module.scss | 23 + .../QueryResult/GraphResult/utils/index.js | 131 + .../analysis/QueryResult/Home/index.js | 127 + .../QueryResult/Home/index.module.scss | 127 + .../analysis/QueryResult/JsonView/index.js | 97 + .../QueryResult/JsonView/index.module.scss | 24 + .../analysis/QueryResult/TableView/index.js | 105 + .../QueryResult/TableView/index.module.scss | 23 + .../src/modules/asyncTasks/Detail/index.js | 295 + .../asyncTasks/Detail/index.module.scss | 39 + .../src/modules/asyncTasks/Home/index.js | 155 + .../modules/asyncTasks/Home/index.module.scss | 33 + .../src/modules/asyncTasks/Result/index.js | 75 + .../asyncTasks/Result/index.module.scss | 22 + .../src/modules/component/Canvas3D/index.js | 166 + .../component/Canvas3D/index.module.scss | 73 + .../src/modules/component/ClearGraph/index.js | 77 + .../component/ClosePanelButton/index.js | 54 + .../ClosePanelButton/index.module.scss | 33 + .../src/modules/component/Context/index.js | 34 + .../modules/component/DynamicAddEdge/index.js | 362 + .../DynamicAddEdge/index.module.scss | 57 + .../modules/component/DynamicAddNode/index.js | 254 + .../DynamicAddNode/index.module.scss | 39 + .../modules/component/EditElement/index.js | 441 + .../component/EditElement/index.module.scss | 82 + .../src/modules/component/ExportData/index.js | 173 + .../src/modules/component/FitCenter/index.js | 50 + .../src/modules/component/FixNode/index.js | 80 + .../src/modules/component/FullScreen/index.js | 72 + .../src/modules/component/Graph/index.css | 40 + .../src/modules/component/Graph/index.js | 225 + .../modules/component/Graph/index.module.scss | 66 + .../GraphRenderModeSwitcher/index.js | 47 + .../GraphRenderModeSwitcher/index.module.scss | 87 + .../component/GraphStatusView/index.js | 156 + .../GraphStatusView/index.module.scss | 58 + .../src/modules/component/ImportData/index.js | 88 + .../modules/component/JaccRankView/index.js | 51 + .../component/JaccRankView/index.module.scss | 64 + .../modules/component/LayoutConfig/index.js | 56 + .../modules/component/Legend/customLegend.js | 314 + .../src/modules/component/Legend/index.js | 97 + .../src/modules/component/Menu/index.js | 149 + .../src/modules/component/MenuBar/index.js | 61 + .../component/MenuBar/index.module.scss | 28 + .../src/modules/component/MiniMap/index.js | 46 + .../src/modules/component/NewConfig/index.js | 84 + .../src/modules/component/NumberCard/index.js | 79 + .../component/NumberCard/index.module.scss | 53 + .../src/modules/component/RedoUndo/index.js | 173 + .../modules/component/RefreshGraph/index.js | 50 + .../src/modules/component/Search/index.js | 297 + .../modules/component/SettingConfig/index.js | 56 + .../component/SettingConfigPanel/index.js | 451 + .../SettingConfigPanel/index.module.scss | 41 + .../src/modules/component/Statistics/index.js | 50 + .../BarChartComponent/index.js | 113 + .../GraphStatistics/Header/index.js | 47 + .../GraphStatistics/Header/index.module.scss | 27 + .../GraphStatistics/Home/index.js | 223 + .../GraphStatistics/Home/index.module.scss | 23 + .../component/StatisticsPanel/Home/index.js | 66 + .../StatisticsPanel/Home/index.module.scss | 44 + .../StatisticsPanel/LabelStatistics/index.js | 96 + .../LabelStatistics/index.module.scss | 30 + .../component/TaskNavigateView/index.js | 62 + .../TaskNavigateView/index.module.scss | 29 + .../src/modules/component/ToolBar/index.js | 78 + .../component/ToolBar/index.module.scss | 40 + .../src/modules/component/Tooltip/index.js | 91 + .../component/Tooltip/index.module.scss | 41 + .../src/modules/component/TopBar/index.js | 309 + .../component/TopBar/index.module.scss | 88 + .../modules/component/ZeroDegreeNode/index.js | 60 + .../src/modules/component/ZoomGraph/index.js | 58 + .../filter/FilterDrawer/FilterForm.js | 229 + .../component/filter/FilterDrawer/config.js | 51 + .../component/filter/FilterDrawer/index.js | 236 + .../filter/FilterDrawer/index.module.scss | 29 + .../modules/component/filter/Home/index.js | 87 + .../layoutConfigPanel/Circular/index.js | 96 + .../Circular/index.module.scss | 53 + .../layoutConfigPanel/Concentric/index.js | 100 + .../layoutConfigPanel/Dagre/index.js | 97 + .../layoutConfigPanel/Force/index.js | 81 + .../component/layoutConfigPanel/Grid/index.js | 72 + .../component/layoutConfigPanel/Home/index.js | 309 + .../layoutConfigPanel/Home/index.module.scss | 85 + .../layoutConfigPanel/Radial/index.js | 109 + .../styleConfig/ConfigModal/index.js | 604 + .../styleConfig/ConfigModal/index.module.scss | 26 + .../component/styleConfig/Home/index.js | 85 + .../src/modules/navigation/AdminItem/index.js | 53 + .../navigation/AdminItem/index.module.scss | 26 + .../modules/navigation/AnalyseItem/index.js | 45 + .../navigation/AnalyseItem/index.module.scss | 26 + .../modules/navigation/ConsoleItem/index.js | 80 + .../navigation/ConsoleItem/index.module.scss | 26 + .../src/modules/navigation/Home/index.js | 63 + .../modules/navigation/Home/index.module.scss | 36 + .../src/modules/navigation/Item/index.js | 87 + .../modules/navigation/Item/index.module.scss | 33 + .../modules/navigation/ManageItem/index.js | 48 + .../navigation/ManageItem/index.module.scss | 26 + .../modules/navigation/ModuleButton/index.js | 40 + .../navigation/ModuleButton/index.module.scss | 47 + .../hubble-fe/src/pages/Account/EditLayer.js | 223 + .../hubble-fe/src/pages/Account/index.js | 201 + .../src/pages/Account/index.module.scss | 21 + .../src/pages/AsyncTaskResult/index.js | 23 + .../src/pages/Datasource/EditLayer.js | 626 + .../hubble-fe/src/pages/Datasource/config.js | 26 + .../hubble-fe/src/pages/Datasource/index.js | 193 + .../src/pages/Datasource/index.module.scss | 18 + .../hubble-fe/src/pages/Error404/index.js | 31 + .../hubble-fe/src/pages/Graph/Card.js | 130 + .../hubble-fe/src/pages/Graph/EditLayer.js | 302 + .../hubble-fe/src/pages/Graph/index.js | 476 + .../src/pages/Graph/index.module.scss | 101 + .../src/pages/GraphAnalysis/index.js | 31 + .../src/pages/GraphDetail/assets/aaa.svg | 19 + .../GraphDetail/assets/collaboration-full.svg | 19 + .../hubble-fe/src/pages/GraphDetail/index.js | 165 + .../src/pages/GraphDetail/index.module.scss | 56 + .../hubble-fe/src/pages/GraphSpace/Card.js | 189 + .../src/pages/GraphSpace/EditLayer.js | 383 + .../hubble-fe/src/pages/GraphSpace/index.js | 355 + .../src/pages/GraphSpace/index.module.scss | 116 + .../hubble-fe/src/pages/Login/index.js | 98 + .../src/pages/Login/index.module.scss | 51 + .../src/pages/Meta/Edge/EditLayer.js | 342 + .../hubble-fe/src/pages/Meta/Edge/index.js | 226 + .../src/pages/Meta/EdgeIndex/index.js | 79 + .../hubble-fe/src/pages/Meta/ImageView.js | 193 + .../hubble-fe/src/pages/Meta/ListView.js | 62 + .../src/pages/Meta/Property/EditLayer.js | 86 + .../src/pages/Meta/Property/index.js | 185 + .../src/pages/Meta/Vertex/EditLayer.js | 289 + .../hubble-fe/src/pages/Meta/Vertex/index.js | 215 + .../src/pages/Meta/VertexIndex/index.js | 85 + .../src/pages/Meta/common/Colorbox.js | 74 + .../src/pages/Meta/common/RelateProperty.js | 160 + .../pages/Meta/common/RelatePropertyIndex.js | 235 + .../hubble-fe/src/pages/Meta/common/config.js | 122 + .../src/pages/Meta/common/index.module.scss | 30 + .../hubble-fe/src/pages/Meta/index.js | 104 + .../hubble-fe/src/pages/My/EditLayer.js | 76 + .../hubble-fe/src/pages/My/index.js | 172 + .../hubble-fe/src/pages/My/index.module.scss | 33 + .../hubble-fe/src/pages/Navigation/index.js | 33 + .../hubble-fe/src/pages/Resource/EditLayer.js | 603 + .../hubble-fe/src/pages/Resource/index.js | 218 + .../src/pages/Resource/index.module.scss | 37 + .../hubble-fe/src/pages/Role/Auth.js | 175 + .../hubble-fe/src/pages/Role/EditLayer.js | 329 + .../hubble-fe/src/pages/Role/index.js | 360 + .../src/pages/Role/index.module.scss | 41 + .../hubble-fe/src/pages/Role/treeData.js | 174 + .../hubble-fe/src/pages/Schema/EditLayer.js | 153 + .../hubble-fe/src/pages/Schema/index.js | 176 + .../hubble-fe/src/pages/Super/EditLayer.js | 84 + .../hubble-fe/src/pages/Super/index.js | 159 + .../src/pages/Super/index.module.scss | 21 + .../src/pages/Task/components/EditLayer.js | 121 + .../src/pages/Task/components/TopStatistic.js | 85 + .../src/pages/Task/components/ViewLayer.js | 99 + .../pages/Task/components/index.module.scss | 61 + .../hubble-fe/src/pages/Task/config.js | 32 + .../hubble-fe/src/pages/Task/index.js | 357 + .../src/pages/Task/index.module.scss | 59 + .../hubble-fe/src/pages/TaskDetail/index.js | 120 + .../hubble-fe/src/pages/TaskEdit/BaseForm.js | 166 + .../src/pages/TaskEdit/BaseForm/index.js | 165 + .../hubble-fe/src/pages/TaskEdit/FieldForm.js | 186 + .../src/pages/TaskEdit/FieldForm/index.js | 187 + .../src/pages/TaskEdit/MappingForm.js | 554 + .../src/pages/TaskEdit/MappingForm/Edge.js | 287 + .../pages/TaskEdit/MappingForm/EdgeList.js | 18 + .../src/pages/TaskEdit/MappingForm/Vertex.js | 225 + .../pages/TaskEdit/MappingForm/VertexList.js | 558 + .../src/pages/TaskEdit/MappingForm/index.js | 265 + .../src/pages/TaskEdit/ScheduleForm.js | 84 + .../src/pages/TaskEdit/ScheduleForm/index.js | 95 + .../hubble-fe/src/pages/TaskEdit/index.js | 299 + .../src/pages/TaskEdit/index.module.scss | 89 + .../hubble-fe/src/pages/Test/index.js | 23 + .../hubble-fe/src/reportWebVitals.js | 31 + .../hubble-fe/src/routes/index.js | 92 + hugegraph-hubble/hubble-fe/src/setupProxy.js | 32 + hugegraph-hubble/hubble-fe/src/setupTests.js | 23 + .../hubble-fe/src/utils/config.js | 34 + .../hubble-fe/src/utils/constants.js | 515 + .../src/utils/convertNumberToChinese.js | 58 + .../src/utils/convertStringToJSON.js | 33 + .../hubble-fe/src/utils/dataImportUpload.ts | 3 +- .../hubble-fe/src/utils/filter.js | 278 + .../hubble-fe/src/utils/format.js | 58 + .../hubble-fe/src/utils/formatGraphInData.js | 146 + .../src/utils/formatGraphResultData.js | 521 + .../hubble-fe/src/utils/formatTimeDuration.js | 55 + .../hubble-fe/src/utils/getNodesFromParams.js | 46 + hugegraph-hubble/hubble-fe/src/utils/graph.js | 343 + .../hubble-fe/src/utils/handleGraphState.js | 105 + .../hubble-fe/src/utils/removeNilKeys.js | 57 + hugegraph-hubble/hubble-fe/src/utils/rules.js | 176 + hugegraph-hubble/hubble-fe/src/utils/user.js | 62 + hugegraph-hubble/hubble-fe/yarn.lock | 19634 ++++---- hugegraph-hubble/pom.xml | 6 + .../loader/reader/jdbc/JDBCFetcher.java | 12 +- 985 files changed, 138833 insertions(+), 13386 deletions(-) create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/AppName.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/AppType.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/OptionType.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/IngestionProxyServlet.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/MetaConfig.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/ProxyServletConfiguration.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/ConfigController.java delete mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/GraphConnectionController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/OlapAlgoController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/VermeerAlgoController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/AccessController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/AuthController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/BelongController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/GraphSpaceUserController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/GroupController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/RoleController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/TargetController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/UserController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/WhiteIpListController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graphs/GraphsController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/ingest/IngestController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/langchain/LangChainController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/AuditController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/DashboardController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/HStoreController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/K8sTokenController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/LogController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/MonitorController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/PDController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/ApplicationInfoController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/CypherController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/EditElementHistoryController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/GraphMetricsController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/GraphSpaceMetricsController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/SaaSMetricsController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/SaasGraphViewController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/sketch/GraphSketchController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/ComputerDisController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/GraphSpaceController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/SchemaTemplateController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/ServiceController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/VermeerController.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/AdamicadarEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/AllShortestPathsEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/CrossPointsEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/JaccardSimilarityEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/KneighborEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/KoutEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/OlapEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/PathsEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/RaysEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/ResourceallocationEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/RingsEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/SameNeighborsEntity.java rename hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/{ShortestPath.java => ShortestPathEntity.java} (88%) create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/SingleSourceShortestPathEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/WeightedShortestPathEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/AccessEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/BelongEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/PasswordEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/RoleEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/UserEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/UserView.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/WhiteIpListEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/VertexQueryEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphCloneEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphStatisticsEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/Datasource.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/op/AuditEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/op/LogEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ApplicationInfo.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/EgonetView.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ElementEditHistory.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/FusiformsimilarityView.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/JaccardsimilarityView.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/OlapView.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/RanksView.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/SameneighborsbatchView.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/vertexlabel/ParamEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/vertexlabel/ParamStyle.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/BuiltInEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/ComputerServiceEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/GraphSpaceEntity.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/HugeException.java rename hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/{GenericException.java => UnauthorizedException.java} (66%) create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ErrorCodeMessage.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/LoginInterceptor.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/CommonLicenseManager.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/ExtraParam.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/LicenseVerifyManager.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/LicenseVerifyParam.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/MachineInfo.java delete mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/GraphConnectionMapper.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/DatasourceMapper.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/ApplicationInfoMapper.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/EditElementHistoryMapper.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/OlapAlgoService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/AccessService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/AuthService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/BelongService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/GraphSpaceUserService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/GroupService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/ManagerService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/RoleService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/TargetService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/UserService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/WhiteIpListService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graphs/GraphsService.java rename hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/{GraphConnectionService.java => load/DatasourceService.java} (56%) create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/AuditService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/ESService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/LogService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/ApplicationInfoService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/EditElementHistoryService.java rename hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/{GremlinQueryService.java => QueryService.java} (82%) create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/saas/PrometheusService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/ComputerService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/GraphSpaceService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/HStoreService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/OLTPServerService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/SchemaTemplateService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/VermeerService.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/ESUtil.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/UrlUtil.java delete mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/EntityUtilTest.java create mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUploadControllerTest.java delete mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/GraphConnectionTest.java create mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/HubbleOptionsTest.java create mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/OltpAlgoControllerTest.java create mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/OltpAlgoServiceTest.java delete mode 100644 hugegraph-hubble/hubble-be/src/test/resources/log4j2.xml create mode 100755 hugegraph-hubble/hubble-dist/assembly/travis/run_algorithm_api_inventory.py create mode 100755 hugegraph-hubble/hubble-dist/assembly/travis/run_live_hubble_smoke.py create mode 100755 hugegraph-hubble/hubble-dist/assembly/travis/run_ui_browser_smoke.js create mode 100755 hugegraph-hubble/hubble-dist/assembly/travis/run_ui_full_acceptance.js create mode 100755 hugegraph-hubble/hubble-dist/assembly/travis/run_ui_i18n_switch_smoke.js create mode 100755 hugegraph-hubble/hubble-dist/assembly/travis/verify-hubble-issue-694.sh rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/.env (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/CHANGELOG.md (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/CHANGELOG.zh-CN.md (100%) create mode 100644 hugegraph-hubble/hubble-fe-old(legacy)/README.md rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/add-license.js (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/config-overrides.js (100%) create mode 100644 hugegraph-hubble/hubble-fe-old(legacy)/package.json create mode 100644 hugegraph-hubble/hubble-fe-old(legacy)/public/favicon.ico create mode 100644 hugegraph-hubble/hubble-fe-old(legacy)/public/index.html create mode 100644 hugegraph-hubble/hubble-fe-old(legacy)/public/manifest.json rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_add.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_add_node.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_arrow.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_arrow_16.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_arrow_blue.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_arrow_selected.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_arrow_white.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_back_32.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_back_32_normal.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_back_32_pressed.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_biaoge_hover.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_biaoge_normal.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_biaoge_pressed.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_cebianshouqi.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_cebianzhankai.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_close_16.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_close_white.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_daorushuju_normal.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_daorushuju_pressed.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_done_144.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_error_12.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_fail.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_fangda_16.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_json_hover.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_json_normal.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_json_pressed.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_liebiaomoshi_black.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_liebiaomoshi_white.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_loading@2x.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_loading_back.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_loading_front.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_middle_16.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_pass.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_progress_done.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_quanping_16.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_question_mark.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_refresh.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_renwuguanli_normal.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_renwuguanli_pressed.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_shuju_normal.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_shuju_pressed.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_sousuo_empty.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_straight.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_straight_selected.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_suoxiao_16.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_topback.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_tuichuquanping_16.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_tumoshi_black.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_tumoshi_white.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_tuzhanshi_hover.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_tuzhanshi_normal.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_tuzhanshi_pressed.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_xiazai_16.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_yingshe_16.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_yuanshuju_normal.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/ic_yuanshuju_pressed.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/icon_clickarrow_left_grey.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/icon_clickarrow_rigth_grey.svg (99%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/assets/imgs/logo.png (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/App.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/common/AppBar.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/common/AppBar.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/common/LoadingDataView.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/common/LoadingDataView.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/common/Tooltip.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/common/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/GraphManagement.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/GraphManagement.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/GraphManagementEmptyList.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/GraphManagementHeader.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/GraphManagementLimitHint.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/GraphManagementList.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/GraphManagementSidebar.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/NewGraphConfig.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/async-tasks/AsyncTaskList.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/async-tasks/AsyncTaskList.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/async-tasks/AsyncTaskResult.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/async-tasks/AsyncTaskResult.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/async-tasks/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/DataAnalyze.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/DataAnalyze.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/DataAnalyzeContent.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/DataAnalyzeInfoDrawer.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/DynamicAddEdge.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/DynamicAddNode.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/ExecLogAndQueryCollections.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/GremlinKeyWords.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/QueryAndAlgorithmLibrary.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/AllPath.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/CustomPath.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/FocusDetection.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/Jaccard.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/KHop.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/KStepNeighbor.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/LoopDetection.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/ModelSimilarity.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/NeighborRank.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/PersonalRank.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/RadiographicInspection.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/SameNeighbor.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/ShortestPath.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/ShortestPathAll.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/SingleSourceWeightedShortestPath.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/algorithm/WeightedShortestPath.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/common/Favorite.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/query-result/GraphPopOver.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/query-result/GraphQueryResult.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/query-result/JSONQueryResult.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/query-result/QueryFilterOptions.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/query-result/QueryResult.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/query-result/TableQueryResult.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-analyze/query-result/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/ImportFinish.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/ImportManager.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/ImportManager.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/ImportTaskList.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/ImportTasks.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/ImportTasks.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/UploadEntry.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/UploadEntry.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/datamap-configs/EdgeMap.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/datamap-configs/FileConfigs.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigManipulations.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigs.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeInfo.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/datamap-configs/VertexMap.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/datamap-configs/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/error-logs/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/job-details/BasicSettings.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/job-details/DataImportDetails.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/job-details/DataMaps.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/job-details/UploadedFiles.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/job-details/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/server-data-import/ImportConfigs.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/import-tasks/server-data-import/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/data-import/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/MetadataConfigs.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/MetadataConfigs.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/common/EmptyDataView.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/edge-type/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/graph-view/CheckAndEditEdge.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/graph-view/CheckAndEditVertex.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/graph-view/CheckProperty.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/graph-view/CreateEdge.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/graph-view/CreateProperty.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/graph-view/CreateVertex.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/graph-view/GraphView.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/graph-view/GraphView.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/graph-view/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/property-index/PropertyIndex.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/property-index/PropertyIndex.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/property-index/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/property/MetadataProperties.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/property/MetadataProperties.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/property/ReuseProperties.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/property/ReuseProperties.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/property/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/graph-management/metadata-configs/vertex-type/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/hubble-ui/index.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/components/hubble-ui/src/index.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/hooks/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/hooks/useInitDataImport.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/hooks/useLocationWithConfirmation.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/hooks/useMultiKeyPress.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/en-US/graph-managment/AsyncTasks.json (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/en-US/graph-managment/GraphManagementSidebar.json (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/en-US/graph-managment/addition.json (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/en-US/graph-managment/common.json (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/en-US/graph-managment/data-import/import-tasks/ImportTasks.json (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/en-US/graph-managment/dataAnalyze.json (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/en-US/graph-managment/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/en-US/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/index.ts (100%) create mode 100644 hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/AsyncTasks.json create mode 100644 hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/GraphManagementSidebar.json create mode 100644 hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/addition.json create mode 100644 hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/common.json rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/zh-CN/graph-managment/data-import/import-tasks/ImportTasks.json (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/zh-CN/graph-managment/dataAnalyze.json (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/zh-CN/graph-managment/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/i18n/resources/zh-CN/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/index.less (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/index.tsx (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/react-app-env.d.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/asyncTasksStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/dataAnalyzeStore/algorithmAnalyzerStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/dataImportStore/ImportManagerStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/dataImportStore/dataImportRootStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/dataImportStore/dataMapStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/dataImportStore/serverDataImportStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/graphManagementStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/metadataConfigsStore/edgeTypeStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/metadataConfigsStore/graphViewStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyIndexStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/GraphManagementStore/metadataConfigsStore/vertexTypeStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/appStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/factory/asyncTasksStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/factory/dataAnalyzeStore/algorithmStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/factory/dataAnalyzeStore/dataAnalyzeStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/factory/dataImportStore/dataImportRootStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/factory/dataImportStore/dataMapStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/factory/dataImportStore/importManagmentStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/factory/dataImportStore/serverDataImportStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/types/GraphManagementStore/asyncTasksStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/types/GraphManagementStore/dataAnalyzeStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/types/GraphManagementStore/dataImportStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/types/GraphManagementStore/graphManagementStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/types/GraphManagementStore/metadataConfigsStore.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/types/common.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/stores/utils/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/third-party.d.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/utils/calcAlgorithmFormWidth.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/utils/convertStringToJSON.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/utils/filterEmptyAlgorightmParams.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/utils/formatAlgorithmStatement.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/utils/getUnicodeLength.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/utils/index.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/src/utils/isDataTypeNumeric.ts (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/tsconfig-extend.json (100%) rename hugegraph-hubble/{hubble-fe => hubble-fe-old(legacy)}/tsconfig.json (100%) create mode 100644 hugegraph-hubble/hubble-fe-old(legacy)/yarn.lock create mode 100644 hugegraph-hubble/hubble-fe/.eslintrc.js create mode 100644 hugegraph-hubble/hubble-fe/package-lock.json create mode 100644 hugegraph-hubble/hubble-fe/public/logo192.png create mode 100644 hugegraph-hubble/hubble-fe/public/logo512.png create mode 100644 hugegraph-hubble/hubble-fe/public/robots.txt create mode 100644 hugegraph-hubble/hubble-fe/scripts/check-i18n.js create mode 100644 hugegraph-hubble/hubble-fe/scripts/react-app-rewired.js create mode 100644 hugegraph-hubble/hubble-fe/src/App.css create mode 100644 hugegraph-hubble/hubble-fe/src/App.js create mode 100644 hugegraph-hubble/hubble-fe/src/App.scss create mode 100644 hugegraph-hubble/hubble-fe/src/App.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/api/analysis.js create mode 100644 hugegraph-hubble/hubble-fe/src/api/auth.js create mode 100644 hugegraph-hubble/hubble-fe/src/api/cloud.js create mode 100644 hugegraph-hubble/hubble-fe/src/api/config.js create mode 100644 hugegraph-hubble/hubble-fe/src/api/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/api/manage.js create mode 100644 hugegraph-hubble/hubble-fe/src/api/request.js create mode 100644 hugegraph-hubble/hubble-fe/src/api/request2.js create mode 100644 hugegraph-hubble/hubble-fe/src/assets/canvas_bg.png create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_arrow.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_arrow_selected.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_biaoge_normal.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_biaoge_pressed.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_done_144.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_fail.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_json_normal.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_json_pressed.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_loading_back.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_loading_front.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_sousuo_empty.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_straight.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_straight_selected.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_tuzhanshi_normal.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/ic_tuzhanshi_pressed.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/layout_circular.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/layout_concentric.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/layout_dagre.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/layout_force.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/layout_grid.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/layout_radial.svg create mode 100644 hugegraph-hubble/hubble-fe/src/assets/logo.png create mode 100644 hugegraph-hubble/hubble-fe/src/assets/logo_img.png create mode 100644 hugegraph-hubble/hubble-fe/src/assets/logo_new.png create mode 100644 hugegraph-hubble/hubble-fe/src/assets/logo_text.png create mode 100644 hugegraph-hubble/hubble-fe/src/components/CodeEditor/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/cypher.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/gremlin.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/components/ERView/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/ERView/config.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/ERView/data/edge.json create mode 100644 hugegraph-hubble/hubble-fe/src/components/ERView/data/group.json create mode 100644 hugegraph-hubble/hubble-fe/src/components/ERView/data/property.json create mode 100644 hugegraph-hubble/hubble-fe/src/components/ERView/data/test.json create mode 100644 hugegraph-hubble/hubble-fe/src/components/ERView/data/vertex.json create mode 100644 hugegraph-hubble/hubble-fe/src/components/ERView/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/ERView/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/components/ERView/utils.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/ExecutionContent/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/ExecutionContent/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/components/GraphinView/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/IconSelect/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/IconSelect/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/components/ListButton/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/SelectUser/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/Sidebar/index.ant.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/Sidebar/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/components/SlideComponent/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/SlideComponent/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/components/Status/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/Status/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/components/TableHeader/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/TableHeader/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/components/Topbar/index.ant.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/Topbar/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/customHook/useCustomEdge.js create mode 100644 hugegraph-hubble/hubble-fe/src/customHook/useCustomGrid.js create mode 100644 hugegraph-hubble/hubble-fe/src/customHook/useCustomNode.js create mode 100644 hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.js create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/ERView.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/board.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/common.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/analysis.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/home.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/manage.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/modules.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/ERView.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/board.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/common.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/index.js delete mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/AsyncTasks.json delete mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/GraphManagementSidebar.json delete mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/addition.json delete mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/common.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/analysis.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/home.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/manage.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/modules.json create mode 100644 hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json create mode 100644 hugegraph-hubble/hubble-fe/src/index.css create mode 100644 hugegraph-hubble/hubble-fe/src/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/layout.ant.js create mode 100644 hugegraph-hubble/hubble-fe/src/logo.svg create mode 100644 hugegraph-hubble/hubble-fe/src/modules/Context/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/GraphAnalysis/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/AlgorithmSearch/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/AlgorithmSearch/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/GraphMenuBar/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/GraphToolBar/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/JaccView/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/JaccView/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/NeighborRankView/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/NeighborRankView/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/RankApiView/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/RankApiView/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/utils/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/AlgorithmNameHeader/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/AlgorithmNameHeader/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/BoolSelectItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/CapacityItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/DirectionItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/LabelItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/LimitItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/MaxDegreeItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/MaxDepthItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/NearestItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/BetweennessCentrality/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/BetweennessCentralityVermeer/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/ClosenessCentrality/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/ClosenessCentralityVermeer/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/ClusterCoefficient/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/DegreeCentrality/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/DegreeCentralityVermeer/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/FilterSubGraphMatching/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/FilteredRingsDetection/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/KCore/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/KCoreVermeer/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/LabelPropagationAlgorithm/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/LabelPropagationAlgorithmVermeer/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/Links/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/Louvain/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/OlapComputerItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/OlapItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/PageRank/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/PageRankVermeer/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/PersonalPageRank/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/RingsDetection/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/SSSPVermeer/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/TriangleCount/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/TriangleCountVermeer/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/WeaklyConnectedComponent/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/WeaklyConnectedComponentVermeer/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/OlapHome/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/OlapHome/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/AdamicAdar/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/AllPaths/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Crosspoints/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedCrosspoints/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedCrosspoints/PathPatternForm/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedPaths/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedPaths/StepItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Egonet/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Egonet/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FindShortestPath/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FindShortestPathWithWeight/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FusiformSimilarity/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/JaccardSimilarityGet/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/JaccardSimilarityPost/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KneighborGet/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KneighborPost/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KoutGet/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KoutPost/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KoutPost/StepFormItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/MultiNodesShortestPath/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/NeighborRankApi/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/OltpItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/OltpItem/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Paths/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/RankApi/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Rays/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/ResourceAllocation/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Rings/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SameNeighbors/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SameNeighborsBatch/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/ShortestPath/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SingleSourceShortestPath/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/TemplatePaths/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/TemplatePaths/StepFormItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/OltpHome/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/OltpHome/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/StepsItems/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/StepsItems/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/VerticesItems/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/VerticesItems/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/utils/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/LogsDetail/ExecuteLog/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/LogsDetail/ExecuteLog/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/LogsDetail/Favorite/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/LogsDetail/Favorite/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/LogsDetail/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/LogsDetail/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/ContentCommon/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/ContentCommon/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/GraphResult/GraphMenubar/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/GraphResult/GraphToolBar/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/GraphResult/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/GraphResult/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/GraphResult/utils/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/JsonView/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/JsonView/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/TableView/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/TableView/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/asyncTasks/Detail/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/asyncTasks/Detail/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/asyncTasks/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/asyncTasks/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/asyncTasks/Result/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/asyncTasks/Result/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Canvas3D/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Canvas3D/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/ClearGraph/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/ClosePanelButton/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/ClosePanelButton/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Context/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/DynamicAddEdge/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/DynamicAddEdge/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/DynamicAddNode/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/DynamicAddNode/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/EditElement/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/EditElement/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/FitCenter/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/FixNode/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/FullScreen/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Graph/index.css create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Graph/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Graph/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/GraphRenderModeSwitcher/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/GraphRenderModeSwitcher/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/GraphStatusView/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/GraphStatusView/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/ImportData/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/JaccRankView/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/JaccRankView/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/LayoutConfig/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Legend/customLegend.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Legend/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Menu/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/MenuBar/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/MenuBar/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/MiniMap/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/NewConfig/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/NumberCard/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/NumberCard/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/RedoUndo/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/RefreshGraph/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Search/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/SettingConfig/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/SettingConfigPanel/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/SettingConfigPanel/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Statistics/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/BarChartComponent/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/GraphStatistics/Header/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/GraphStatistics/Header/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/GraphStatistics/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/GraphStatistics/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/LabelStatistics/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/LabelStatistics/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/TaskNavigateView/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/TaskNavigateView/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/ToolBar/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/ToolBar/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Tooltip/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/Tooltip/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/TopBar/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/TopBar/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/ZeroDegreeNode/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/ZoomGraph/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/filter/FilterDrawer/FilterForm.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/filter/FilterDrawer/config.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/filter/FilterDrawer/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/filter/FilterDrawer/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/filter/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/layoutConfigPanel/Circular/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/layoutConfigPanel/Circular/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/layoutConfigPanel/Concentric/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/layoutConfigPanel/Dagre/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/layoutConfigPanel/Force/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/layoutConfigPanel/Grid/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/layoutConfigPanel/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/layoutConfigPanel/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/layoutConfigPanel/Radial/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/styleConfig/ConfigModal/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/styleConfig/ConfigModal/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/styleConfig/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/AdminItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/AdminItem/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/AnalyseItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/AnalyseItem/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/ConsoleItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/ConsoleItem/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/Home/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/Home/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/Item/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/Item/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/ManageItem/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/ManageItem/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/ModuleButton/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/navigation/ModuleButton/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Account/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Account/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Account/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/AsyncTaskResult/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Datasource/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Datasource/config.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Datasource/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Datasource/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Error404/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Graph/Card.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Graph/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Graph/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Graph/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/GraphAnalysis/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/GraphDetail/assets/aaa.svg create mode 100644 hugegraph-hubble/hubble-fe/src/pages/GraphDetail/assets/collaboration-full.svg create mode 100644 hugegraph-hubble/hubble-fe/src/pages/GraphDetail/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/GraphDetail/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/GraphSpace/Card.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/GraphSpace/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/GraphSpace/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/GraphSpace/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Login/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Login/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/Edge/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/Edge/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/EdgeIndex/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/ImageView.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/ListView.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/Property/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/Property/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/Vertex/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/Vertex/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/VertexIndex/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/common/Colorbox.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/common/RelateProperty.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/common/RelatePropertyIndex.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/common/config.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/common/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/My/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/My/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/My/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Navigation/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Resource/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Resource/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Resource/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Role/Auth.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Role/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Role/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Role/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Role/treeData.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Schema/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Schema/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Super/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Super/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Super/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Task/components/EditLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Task/components/TopStatistic.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Task/components/ViewLayer.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Task/components/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Task/config.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Task/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Task/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskDetail/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/BaseForm.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/BaseForm/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/FieldForm.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/FieldForm/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/MappingForm.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/MappingForm/Edge.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/MappingForm/EdgeList.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/MappingForm/Vertex.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/MappingForm/VertexList.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/MappingForm/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/ScheduleForm.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/ScheduleForm/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/TaskEdit/index.module.scss create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Test/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/reportWebVitals.js create mode 100644 hugegraph-hubble/hubble-fe/src/routes/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/setupProxy.js create mode 100644 hugegraph-hubble/hubble-fe/src/setupTests.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/config.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/constants.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/convertNumberToChinese.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/convertStringToJSON.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/filter.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/format.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/formatGraphInData.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/formatGraphResultData.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/formatTimeDuration.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/getNodesFromParams.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/graph.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/handleGraphState.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/removeNilKeys.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/rules.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/user.js diff --git a/.github/workflows/hubble-ci.yml b/.github/workflows/hubble-ci.yml index 2b09e74ff..dcf0419be 100644 --- a/.github/workflows/hubble-ci.yml +++ b/.github/workflows/hubble-ci.yml @@ -58,6 +58,37 @@ jobs: python-version: ${{ matrix.python-version }} cache: 'pip' + - name: Set up Node.js 18.20.8 + uses: actions/setup-node@v4 + with: + node-version: '18.20.8' + + # we also should cache python & yarn & downloads to avoid useless work + - name: Cache Maven packages + uses: actions/cache@v3 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + - name: Cache Node modules + uses: actions/cache@v3 + with: + path: | + hugegraph-hubble/hubble-fe/node_modules + hugegraph-hubble/hubble-fe/node + ~/.cache/yarn + key: ${{ runner.os }}-node-${{ hashFiles('**/package.json', '**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: use staged maven repo settings + if: ${{ env.USE_STAGE == 'true' }} + run: | + cp $HOME/.m2/settings.xml /tmp/settings.xml + mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml + - name: Compile run: | mvn install -pl hugegraph-client,hugegraph-loader -am -Dmaven.javadoc.skip=true -DskipTests -ntp @@ -66,6 +97,16 @@ jobs: - name: Prepare env and service env: + CI: false + run: | + echo "=== Environment Info ===" + node -v + yarn -v + echo "NODE_OPTIONS: $NODE_OPTIONS" + echo "CI: $CI" + free -h || true + echo "=======================" + COMMIT_ID: ${{ steps.get-commit.outputs.commit_id }} run: | python -m pip install -r ${TRAVIS_DIR}/requirements.txt diff --git a/hugegraph-client/src/main/java/org/apache/hugegraph/api/auth/UserAPI.java b/hugegraph-client/src/main/java/org/apache/hugegraph/api/auth/UserAPI.java index 018c8dbe6..ff43a01c9 100644 --- a/hugegraph-client/src/main/java/org/apache/hugegraph/api/auth/UserAPI.java +++ b/hugegraph-client/src/main/java/org/apache/hugegraph/api/auth/UserAPI.java @@ -69,6 +69,12 @@ public List list(int limit) { return result.readList(this.type(), User.class); } + public User getByName(String name) { + Map params = ImmutableMap.of("name", name); + RestResult result = this.client.get(this.path(), params); + return result.readObject(User.class); + } + public User update(User user) { String id = formatEntityId(user.id()); RestResult result = this.client.put(this.path(), id, user); diff --git a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/AuthManager.java b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/AuthManager.java index 9f85ec4a4..6d84fdb44 100644 --- a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/AuthManager.java +++ b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/AuthManager.java @@ -132,6 +132,10 @@ public User getUser(Object id) { return this.userAPI.get(id); } + public User getUserByName(String name) { + return this.userAPI.getByName(name); + } + public User.UserRole getUserRole(Object id) { return this.userAPI.getUserRole(id); } diff --git a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClient.java b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClient.java index c681a76a9..6327b0023 100644 --- a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClient.java +++ b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClient.java @@ -108,7 +108,10 @@ public HugeClient(HugeClientBuilder builder) { public HugeClient(HugeClient client, String graphSpace, String graph) { this.borrowedClient = true; this.client = client.client; - this.initManagers(this.client, graphSpace, graph); + this.graphSpaceName = (graphSpace == null || graphSpace.isEmpty()) ? + HugeClientBuilder.DEFAULT_GRAPHSPACE : graphSpace; + this.graphName = graph; + this.initManagers(this.client, this.graphSpaceName, this.graphName); } public static HugeClientBuilder builder(String url, String graphSpace, String graph) { @@ -119,8 +122,14 @@ public static HugeClientBuilder builder(String url, String graph) { return new HugeClientBuilder(url, HugeClientBuilder.DEFAULT_GRAPHSPACE, graph); } + public static HugeClientBuilder builder(String url, String graphSpace, String graph, + boolean skipRequiredChecks) { + return new HugeClientBuilder(url, graphSpace, graph).graphRequired(!skipRequiredChecks); + } + public HugeClient assignGraph(String graphSpace, String graph) { - this.graphSpaceName = graphSpace; + this.graphSpaceName = (graphSpace == null || graphSpace.isEmpty()) ? + HugeClientBuilder.DEFAULT_GRAPHSPACE : graphSpace; this.graphName = graph; this.initManagers(this.client, this.graphSpaceName, this.graphName); return this; diff --git a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClientBuilder.java b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClientBuilder.java index 2b5d547b3..6b5d773ab 100644 --- a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClientBuilder.java +++ b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClientBuilder.java @@ -54,7 +54,8 @@ public class HugeClientBuilder { public HugeClientBuilder(String url, String graphSpace, String graph) { this.url = url; - this.graphSpace = graphSpace; + this.graphSpace = (graphSpace == null || graphSpace.isEmpty()) ? + DEFAULT_GRAPHSPACE : graphSpace; this.graph = graph; this.username = ""; this.password = ""; @@ -89,7 +90,8 @@ public HugeClientBuilder graphRequired(boolean graphRequired) { } public HugeClientBuilder configGraphSpace(String graphSpace) { - this.graphSpace = graphSpace; + this.graphSpace = (graphSpace == null || graphSpace.isEmpty()) ? + DEFAULT_GRAPHSPACE : graphSpace; return this; } diff --git a/hugegraph-client/src/test/java/org/apache/hugegraph/BaseClientTest.java b/hugegraph-client/src/test/java/org/apache/hugegraph/BaseClientTest.java index 2fda81d66..50cedf646 100644 --- a/hugegraph-client/src/test/java/org/apache/hugegraph/BaseClientTest.java +++ b/hugegraph-client/src/test/java/org/apache/hugegraph/BaseClientTest.java @@ -55,6 +55,7 @@ public class BaseClientTest { protected static final String GRAPH = "hugegraph"; protected static final String USERNAME = "admin"; protected static final String PASSWORD = "pa"; + //protected static final String PASSWORD = "admin"; protected static final int TIMEOUT = 10; private static HugeClient client; diff --git a/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/LoginApiTest.java b/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/LoginApiTest.java index e1dc90d7d..ae1f17e03 100644 --- a/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/LoginApiTest.java +++ b/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/LoginApiTest.java @@ -26,6 +26,7 @@ import org.apache.hugegraph.testutil.Assert; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; public class LoginApiTest extends AuthApiTest { diff --git a/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/LogoutApiTest.java b/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/LogoutApiTest.java index 24c777807..de4549d04 100644 --- a/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/LogoutApiTest.java +++ b/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/LogoutApiTest.java @@ -28,6 +28,7 @@ import org.apache.hugegraph.testutil.Whitebox; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; public class LogoutApiTest extends AuthApiTest { diff --git a/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/TokenApiTest.java b/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/TokenApiTest.java index 9dcec5a30..b0d8407cb 100644 --- a/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/TokenApiTest.java +++ b/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/TokenApiTest.java @@ -29,6 +29,7 @@ import org.apache.hugegraph.testutil.Whitebox; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; public class TokenApiTest extends AuthApiTest { diff --git a/hugegraph-client/src/test/java/org/apache/hugegraph/functional/AuthManagerTest.java b/hugegraph-client/src/test/java/org/apache/hugegraph/functional/AuthManagerTest.java index 243cb1f17..6b4f82860 100644 --- a/hugegraph-client/src/test/java/org/apache/hugegraph/functional/AuthManagerTest.java +++ b/hugegraph-client/src/test/java/org/apache/hugegraph/functional/AuthManagerTest.java @@ -41,6 +41,7 @@ import org.apache.hugegraph.testutil.Assert; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import com.google.common.collect.ImmutableSet; diff --git a/hugegraph-dist/scripts/dependency/known-dependencies.txt b/hugegraph-dist/scripts/dependency/known-dependencies.txt index 0b38c41e2..4334de04b 100644 --- a/hugegraph-dist/scripts/dependency/known-dependencies.txt +++ b/hugegraph-dist/scripts/dependency/known-dependencies.txt @@ -1,6 +1,5 @@ -HdrHistogram-2.1.9.jar HikariCP-3.2.0.jar -LatencyUtils-2.0.3.jar +HikariCP-java7-2.4.12.jar ST4-4.0.4.jar accessors-smart-1.2.jar accessors-smart-2.4.2.jar @@ -10,9 +9,12 @@ animal-sniffer-annotations-1.19.jar annotations-13.0.jar annotations-17.0.0.jar annotations-4.1.1.4.jar +ansj_seg-5.1.6.jar ant-1.9.1.jar ant-launcher-1.9.1.jar antlr-runtime-3.5.2.jar +aopalliance-1.0.jar +aopalliance-repackaged-2.5.0-b42.jar apache-curator-2.12.0.pom arrow-format-0.8.0.jar arrow-format-2.0.0.jar @@ -20,19 +22,28 @@ arrow-memory-0.8.0.jar arrow-memory-core-2.0.0.jar arrow-vector-0.8.0.jar arrow-vector-2.0.0.jar -asm-5.0.4.jar +asm-6.0.jar asm-8.0.1.jar audience-annotations-0.5.0.jar +avatica-1.11.0.jar avro-1.10.2.jar avro-1.7.7.jar +bolt-1.6.4.jar caffeine-2.6.2.jar +caffeine-2.8.0.jar +calcite-core-1.16.0.jar +calcite-druid-1.16.0.jar +calcite-linq4j-1.16.0.jar +checker-qual-2.10.0.jar checker-qual-3.5.0.jar classmate-1.4.0.jar commons-beanutils-1.9.4.jar commons-cli-1.3.1.jar commons-codec-1.15.jar commons-collections-3.2.2.jar +commons-collections4-4.2.jar commons-collections4-4.4.jar +commons-compiler-2.7.6.jar commons-compress-1.21.jar commons-configuration-1.10.jar commons-configuration2-2.1.1.jar @@ -40,6 +51,8 @@ commons-configuration2-2.8.0.jar commons-crypto-1.0.0.jar commons-crypto-1.1.0.jar commons-daemon-1.0.13.jar +commons-dbcp-1.4.jar +commons-fileupload-1.4.jar commons-fileupload-1.5.jar commons-io-2.8.0.jar commons-lang-2.6.jar @@ -47,6 +60,7 @@ commons-lang3-3.9.jar commons-logging-1.1.3.jar commons-math3-3.4.1.jar commons-net-3.9.0.jar +commons-pool-1.6.jar commons-text-1.10.0.jar curator-client-4.2.0.jar curator-framework-2.12.0.jar @@ -55,14 +69,40 @@ curator-recipes-2.13.0.jar curator-recipes-4.2.0.jar datanucleus-core-4.1.17.jar disruptor-3.3.6.jar +disruptor-3.3.7.jar dnsjava-2.1.7.jar dropwizard-metrics-hadoop-metrics2-reporter-0.1.2.jar +eclipse-collections-11.1.0.jar +eclipse-collections-api-11.1.0.jar +ehcache-3.6.3.jar +elasticsearch-java-7.16.1.jar +elasticsearch-rest-client-6.4.3.jar +error_prone_annotations-2.3.3.jar error_prone_annotations-2.3.4.jar +esri-geometry-api-2.0.0.jar +exp4j-0.4.8.jar failureaccess-1.0.1.jar +fastutil-8.5.9.jar findbugs-annotations-1.3.9-1.jar flatbuffers-1.2.0-3f79e055.jar flatbuffers-java-1.9.0.jar +fst-2.50.jar +geronimo-jcache_1.0_spec-1.0-alpha-1.jar +gremlin-core-3.5.1.jar +gremlin-driver-3.5.1.jar +gremlin-groovy-3.5.1.jar +gremlin-shaded-3.5.1.jar +gremlin-test-3.5.1.jar +groovy-2.5.14-indy.jar groovy-all-2.4.21.jar +groovy-cli-picocli-2.5.8.jar +groovy-console-2.5.8.jar +groovy-groovysh-2.5.14-indy.jar +groovy-json-2.5.14-indy.jar +groovy-jsr223-2.5.14-indy.jar +groovy-swing-2.5.8.jar +groovy-templates-2.5.8.jar +groovy-xml-2.5.8.jar grpc-api-1.39.0.jar grpc-context-1.39.0.jar grpc-core-1.39.0.jar @@ -72,6 +112,8 @@ grpc-protobuf-lite-1.39.0.jar grpc-stub-1.39.0.jar gson-2.8.9.jar guava-30.0-jre.jar +guice-4.0.jar +guice-servlet-4.0.jar h2-1.4.199.jar hadoop-annotations-3.3.1.jar hadoop-auth-3.3.1.jar @@ -84,9 +126,18 @@ hadoop-mapreduce-client-core-3.3.1.jar hadoop-mapreduce-client-jobclient-3.3.1.jar hadoop-shaded-guava-1.1.1.jar hadoop-shaded-protobuf_3_7-1.1.1.jar +hadoop-yarn-api-3.1.0.jar hadoop-yarn-api-3.3.1.jar hadoop-yarn-client-3.3.1.jar +hadoop-yarn-common-3.1.0.jar hadoop-yarn-common-3.3.1.jar +hadoop-yarn-registry-3.1.0.jar +hadoop-yarn-server-applicationhistoryservice-3.1.0.jar +hadoop-yarn-server-common-3.1.0.jar +hadoop-yarn-server-resourcemanager-3.1.0.jar +hadoop-yarn-server-web-proxy-3.1.0.jar +hamcrest-2.2.jar +hanlp-portable-1.8.3.jar hbase-client-2.2.3.jar hbase-common-2.2.3.jar hbase-hadoop-compat-2.2.3.jar @@ -105,12 +156,14 @@ hbase-shaded-miscellaneous-2.2.1.jar hbase-shaded-netty-2.2.1.jar hbase-shaded-protobuf-2.2.1.jar hbase-zookeeper-2.2.3.jar +hessian-3.3.6.jar hg-pd-client-1.5.0.jar hg-pd-common-1.5.0.jar hg-pd-grpc-1.5.0.jar hibernate-validator-6.0.17.Final.jar hive-classification-3.1.3.jar hive-common-3.1.3.jar +hive-exec-3.1.3-core.jar hive-exec-3.1.3.jar hive-llap-client-3.1.3.jar hive-llap-common-3.1.3.jar @@ -125,13 +178,20 @@ hive-storage-api-2.7.0.jar hive-storage-api-2.7.2.jar hive-upgrade-acid-3.1.3.jar hive-vector-code-gen-3.1.3.jar +hk2-api-2.5.0-b42.jar +hk2-locator-2.5.0-b42.jar +hk2-utils-2.5.0-b42.jar +hppc-0.7.1.jar hppc-0.7.2.jar htrace-core4-4.1.0-incubating.jar htrace-core4-4.2.0-incubating.jar +httpasyncclient-4.1.4.jar httpclient-4.5.13.jar httpclient-4.5.9.jar httpcore-4.4.12.jar httpcore-4.4.13.jar +httpcore-nio-4.4.12.jar +ikanalyzer-2012_u6.jar ivy-2.4.0.jar ivy-2.5.0.jar j2objc-annotations-1.3.jar @@ -141,22 +201,32 @@ jackson-core-asl-1.9.13.jar jackson-databind-2.12.3.jar jackson-datatype-jdk8-2.12.3.jar jackson-datatype-jsr310-2.12.3.jar +jackson-jaxrs-1.9.2.jar jackson-jaxrs-base-2.12.3.jar jackson-jaxrs-json-provider-2.12.3.jar jackson-mapper-asl-1.9.13.jar jackson-module-jaxb-annotations-2.12.3.jar jackson-module-parameter-names-2.12.3.jar +jackson-xc-1.9.2.jar jakarta.activation-2.0.1.jar jakarta.activation-api-1.2.1.jar +jakarta.json-2.0.1.jar jakarta.xml.bind-api-2.3.2.jar jamon-runtime-2.4.1.jar +janino-3.0.15.jar +java-util-1.9.0.jar +javacsv-2.0.jar +javapoet-1.8.0.jar +javassist-3.22.0-CR2.jar javassist-3.24.0-GA.jar javassist-3.25.0-GA.jar javassist-3.28.0-GA.jar +javatuples-1.2.jar javax.activation-api-1.2.0.jar javax.annotation-api-1.3.2.jar javax.el-3.0.0.jar javax.el-3.0.1-b12.jar +javax.inject-1.jar javax.inject-2.5.0-b32.jar javax.inject-2.5.0-b42.jar javax.json-1.0.jar @@ -164,18 +234,36 @@ javax.servlet-api-3.1.0.jar javax.servlet-api-4.0.1.jar javax.servlet.jsp-2.3.2.jar javax.servlet.jsp-api-2.3.1.jar +javax.ws.rs-api-2.1.jar javolution-5.5.1.jar jaxb-api-2.2.11.jar jaxb-api-2.3.1.jar jaxb-core-3.0.2.jar jaxb-impl-3.0.2.jar +jbcrypt-0.4.jar jboss-logging-3.3.3.Final.jar +jcabi-log-0.14.jar +jcabi-manifests-1.1.jar jcip-annotations-1.0-1.jar +jcl-over-slf4j-1.7.28.jar jcodings-1.0.18.jar jcommander-1.72.jar jcommander-1.78.jar +jcseg-core-2.6.2.jar +jctools-core-2.1.1.jar +jersey-apache-connector-2.27.jar +jersey-client-1.19.jar +jersey-client-2.27.jar +jersey-common-2.27.jar jersey-container-servlet-core-2.25.1.jar jersey-container-servlet-core-2.27.jar +jersey-core-1.19.jar +jersey-guice-1.19.jar +jersey-hk2-2.27.jar +jersey-json-1.19.jar +jersey-server-1.19.jar +jersey-servlet-1.19.jar +jettison-1.1.jar jetty-client-9.4.33.v20201020.jar jetty-client-9.4.40.v20210413.jar jetty-http-9.4.19.v20190610.jar @@ -198,14 +286,22 @@ jetty-webapp-9.4.19.v20190610.jar jetty-webapp-9.4.40.v20210413.jar jetty-xml-9.4.19.v20190610.jar jetty-xml-9.4.40.v20210413.jar +jieba-analysis-1.0.2.jar +jjwt-api-0.11.5.jar +jjwt-impl-0.11.5.jar +jjwt-jackson-0.11.5.jar jline-2.12.jar +jline-2.14.6.jar jline-3.9.0.jar +jna-4.5.2.jar joda-time-2.10.3.jar joda-time-2.10.8.jar joni-2.1.11.jar jpam-1.1.jar +jraft-core-1.3.11.jar jsch-0.1.55.jar json-1.8.jar +json-io-2.5.1.jar json-smart-2.3.jar json-smart-2.4.2.jar jsp-api-2.1.jar @@ -213,21 +309,32 @@ jsqlparser-3.1.jar jsr305-3.0.0.jar jsr305-3.0.1.jar jsr305-3.0.2.jar +jsr311-api-1.1.1.jar jul-to-slf4j-1.7.28.jar kerb-admin-1.0.1.jar +kerb-admin-2.0.0.jar kerb-client-1.0.1.jar +kerb-client-2.0.0.jar kerb-common-1.0.1.jar +kerb-common-2.0.0.jar kerb-core-1.0.1.jar kerb-crypto-1.0.1.jar +kerb-crypto-2.0.0.jar kerb-identity-1.0.1.jar +kerb-identity-2.0.0.jar kerb-server-1.0.1.jar +kerb-server-2.0.0.jar kerb-simplekdc-1.0.1.jar +kerb-simplekdc-2.0.0.jar kerb-util-1.0.1.jar +kerb-util-2.0.0.jar kerby-asn1-1.0.1.jar kerby-config-1.0.1.jar +kerby-config-2.0.0.jar kerby-pkix-1.0.1.jar kerby-util-1.0.1.jar kerby-xdr-1.0.1.jar +kerby-xdr-2.0.0.jar kotlin-stdlib-1.6.20.jar kotlin-stdlib-common-1.5.31.jar kotlin-stdlib-jdk7-1.2.71.jar @@ -235,6 +342,7 @@ kotlin-stdlib-jdk7-1.6.10.jar kotlin-stdlib-jdk8-1.2.71.jar kotlin-stdlib-jdk8-1.6.10.jar leveldbjni-all-1.8.jar +libfb303-0.9.3.jar libthrift-0.9.3.jar lightning-csv-8.2.1.jar listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar @@ -243,15 +351,25 @@ log4j-1.2-api-2.17.1.jar log4j-1.2.17.jar log4j-api-2.18.0.jar log4j-core-2.18.0.jar -log4j-jul-2.11.2.jar log4j-slf4j-impl-2.18.0.jar +log4j-to-slf4j-2.11.2.jar +log4j-web-2.11.2.jar +logback-classic-1.2.3.jar +logback-core-1.2.3.jar logging-interceptor-4.10.0.jar lombok-1.18.8.jar +lucene-analyzers-common-8.11.2.jar +lucene-analyzers-smartcn-8.11.2.jar +lucene-core-8.11.2.jar +lucene-queries-4.7.2.jar +lucene-queryparser-4.7.2.jar +lucene-sandbox-4.7.2.jar lz4-java-1.4.0.jar +memory-0.9.0.jar metrics-core-4.2.0.jar metrics-json-4.2.0.jar metrics-jvm-4.2.0.jar -micrometer-core-1.1.6.jar +mmseg4j-core-1.10.0.jar mssql-jdbc-6.4.0.jre8.jar mssql-jdbc-7.2.0.jre8.jar mybatis-3.5.2.jar @@ -274,22 +392,32 @@ netty-transport-4.1.65.Final.jar netty-transport-native-epoll-4.1.65.Final.jar netty-transport-native-unix-common-4.1.65.Final.jar nimbus-jose-jwt-9.8.1.jar +nlp-lang-1.7.7.jar +ohc-core-0.7.4.jar okhttp-4.10.0.jar +okhttp-4.12.0.jar +okio-3.6.0.jar okio-jvm-3.0.0.jar +okio-jvm-3.6.0.jar opencsv-2.3.jar orc-core-1.5.8.jar orc-core-1.6.14.jar orc-shims-1.5.8.jar orc-shims-1.6.14.jar +osgi-resource-locator-1.0.1.jar ow2-asm-6.2.jar paranamer-2.3.jar parboiled-core-1.1.8.jar +parboiled-core-1.2.0.jar +parquet-hadoop-bundle-1.10.0.jar perfmark-api-0.23.0.jar +picocli-4.0.1.jar postgresql-42.2.6.jar postgresql-42.4.1.jar proto-google-common-protos-2.0.1.jar protobuf-java-2.5.0.jar protobuf-java-3.17.2.jar +protobuf-java-3.17.3.jar re2j-1.1.jar sfm-converter-8.2.1.jar sfm-csv-8.2.1.jar @@ -297,25 +425,25 @@ sfm-map-8.2.1.jar sfm-reflect-8.2.1.jar sfm-tuples-8.2.1.jar sfm-util-8.2.1.jar +sketches-core-0.9.0.jar slf4j-api-1.7.25.jar slf4j-api-1.7.28.jar slf4j-api-1.7.30.jar slf4j-log4j12-1.7.30.jar +smiley-http-proxy-servlet-1.12.1.jar snakeyaml-1.23.jar snappy-java-1.1.8.2.jar snappy-java-1.1.8.4.jar +sofa-common-tools-1.0.12.jar spring-aop-5.1.9.RELEASE.jar spring-beans-5.1.9.RELEASE.jar spring-boot-2.1.8.RELEASE.jar -spring-boot-actuator-2.1.8.RELEASE.jar -spring-boot-actuator-autoconfigure-2.1.8.RELEASE.jar spring-boot-autoconfigure-2.1.8.RELEASE.jar spring-boot-starter-2.1.8.RELEASE.jar -spring-boot-starter-actuator-2.1.8.RELEASE.jar spring-boot-starter-cache-2.1.8.RELEASE.jar spring-boot-starter-jdbc-2.1.8.RELEASE.jar spring-boot-starter-json-2.1.8.RELEASE.jar -spring-boot-starter-log4j2-2.1.8.RELEASE.jar +spring-boot-starter-logging-2.1.8.RELEASE.jar spring-boot-starter-tomcat-2.1.8.RELEASE.jar spring-boot-starter-web-2.1.8.RELEASE.jar spring-context-5.1.9.RELEASE.jar @@ -330,10 +458,14 @@ spring-webmvc-5.1.9.RELEASE.jar stax-api-1.0.1.jar stax2-api-4.2.1.jar threeten-extra-1.5.0.jar +tinkergraph-gremlin-3.5.1.jar token-provider-1.0.1.jar +token-provider-2.0.0.jar tomcat-embed-core-9.0.24.jar tomcat-embed-el-9.0.24.jar tomcat-embed-websocket-9.0.24.jar +truelicense-core-1.33.jar +truelicense-xml-1.33.jar validation-api-2.0.1.Final.jar websocket-api-9.4.40.v20210413.jar websocket-client-9.4.40.v20210413.jar diff --git a/hugegraph-hubble/README.md b/hugegraph-hubble/README.md index 6b03d5aff..33227f022 100644 --- a/hugegraph-hubble/README.md +++ b/hugegraph-hubble/README.md @@ -44,16 +44,16 @@ Then use a web browser to access `ip:8088` and you can see the `Hubble` page. Yo ### 2. Clone source code then compile and install -> Note: Compiling Hubble requires the user’s local environment to have Node.js V16.x and yarn installed. +> Note: Compiling Hubble requires the user's local environment to have Node.js V18.20.8 and yarn installed. ```bash apt install curl build-essential curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash source ~/.bashrc -nvm install 16 +nvm install 18.20.8 ``` -Then, verify that the installed Node.js version is 16.x (please note that higher Node version may cause conflicts). +Then, verify that the installed Node.js version is 18.20.8. ```bash node -v diff --git a/hugegraph-hubble/hubble-be/pom.xml b/hugegraph-hubble/hubble-be/pom.xml index 6e81c1691..68f4393e3 100644 --- a/hugegraph-hubble/hubble-be/pom.xml +++ b/hugegraph-hubble/hubble-be/pom.xml @@ -1,5 +1,6 @@ + + co.elastic.clients + elasticsearch-java + ${es.version} + org.mybatis.spring.boot mybatis-spring-boot-starter - ${mybatis.starter.version} + 2.1.0 com.baomidou mybatis-plus-boot-starter - ${mybatis.plus.starter.version} + 3.3.0 com.h2database @@ -90,13 +96,29 @@ com.github.ben-manes.caffeine caffeine + 2.8.0 - + net.sourceforge.javacsv + javacsv + 2.0 + + + de.schlichtherle.truelicense + truelicense-core + 1.33 + + + org.apache.hugegraph - hugegraph-loader - ${revision} + hugegraph-common + 1.5.0 + + + com.baidu.hugegraph + hugegraph-core + org.apache.logging.log4j log4j-api @@ -117,29 +139,125 @@ javassist org.javassist + + + + org.apache.hugegraph + hg-pd-client + 1.5.0 + + + org.apache.logging.log4j + log4j-api + + + org.apache.logging.log4j + log4j-core + + + org.apache.logging.log4j + log4j-slf4j-impl + + + + + + org.apache.hugegraph + hugegraph-loader + 1.3.0 + + + com.baidu.hugegraph + hugegraph-client + + + com.baidu.hugegraph + hg-pd-client + + + com.baidu.hugegraph + hg-pd-grpc + + + com.baidu.hugegraph + hugegraph-core + + + com.baidu.hugegraph + hugegraph-api + + + org.apache.logging.log4j + log4j-api + + + org.apache.logging.log4j + log4j-core + + + org.apache.logging.log4j + log4j-slf4j-impl + org.eclipse.jetty jetty-runner - com.oracle - ojdbc8 + hive-exec + org.apache.hive - slf4j-log4j12 - org.slf4j + com.google.protobuf + protobuf-java + + + + + org.apache.hugegraph + hugegraph-client + 1.7.0 + + - log4j - log4j + com.baidu.hugegraph + hugegraph-core - org.jetbrains.kotlin - kotlin-stdlib + org.apache.logging.log4j + log4j-api - com.squareup.okhttp - okhttp + org.apache.logging.log4j + log4j-core + + + org.apache.logging.log4j + log4j-slf4j-impl + + + org.eclipse.jetty + jetty-runner + + + hive-exec + org.apache.hive + + + org.glassfish.jersey.containers + jersey-container-servlet-core + + + org.glassfish.jersey.core + jersey-common + + + org.glassfish.jersey.core + jersey-client + + + org.glassfish.jersey.core + jersey-server @@ -147,20 +265,66 @@ commons-fileupload commons-fileupload + 1.4 - - - com.squareup.okhttp3 - okhttp + org.parboiled + parboiled-core + 1.2.0 - org.jetbrains.kotlin - kotlin-stdlib + org.apache.hugegraph + hugegraph-core + 1.3.0 + compile + + + org.apache.commons + commons-collections4 + 4.2 + compile + + + commons-configuration + commons-configuration + 1.10 + + + com.google.protobuf + protobuf-java + 3.17.3 + + + + org.apache.hive + hive-exec + 3.1.3 + core + compile + + + com.google.guava + guava + + + com.google.protobuf + protobuf-java + + + + org.apache.logging.log4j + log4j-slf4j-impl + + + - org.jetbrains.kotlin - kotlin-stdlib-common + com.squareup.okhttp3 + okhttp + 4.12.0 @@ -178,6 +342,62 @@ + + + maven-compiler-plugin + 3.8.0 + + ${java.version} + ${java.version} + + 500 + + + -Xlint:unchecked + --add-modules=java.base + + + + + maven-clean-plugin + 3.0.0 + + + + ${top.level.dir} + + *.tar + *.tar.gz + *.zip + ${final.name}/** + + false + + + ${final.name} + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20 + org.apache.maven.plugins maven-jar-plugin @@ -231,6 +451,7 @@ + diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/HugeGraphHubble.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/HugeGraphHubble.java index e0c208279..8efe94dff 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/HugeGraphHubble.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/HugeGraphHubble.java @@ -30,13 +30,18 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.time.ZoneOffset; +import java.util.TimeZone; + @SpringBootApplication @EnableScheduling @MapperScan("org.apache.hugegraph.mapper") public class HugeGraphHubble extends SpringBootServletInitializer { public static void main(String[] args) { + System.out.println("user.dir ==> " + System.getProperty("user.dir")); initEnv(); + TimeZone.setDefault(TimeZone.getTimeZone(ZoneOffset.of("+8"))); SpringApplication.run(HugeGraphHubble.class, args); } @@ -53,7 +58,8 @@ public static void initEnv() { } @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + protected SpringApplicationBuilder configure( + SpringApplicationBuilder builder) { return builder.sources(this.getClass()); } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/AppName.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/AppName.java new file mode 100644 index 000000000..89b6cdc44 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/AppName.java @@ -0,0 +1,54 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.common; + + +import org.apache.hugegraph.type.define.SerialEnum; + +public enum AppName implements SerialEnum { + GREMLIN(1, "GREMLIN"), + + VERTEX_UPDATE(2, "VERTEX_UPDATE"), + + EDGE_UPDATE(3, "EDGE_UPDATE") + ; + + private final byte code; + private final String name; + + static { + SerialEnum.register(AppName.class); + } + + AppName(int code, String name) { + assert code < 256; + this.code = (byte) code; + this.name = name; + } + + @Override + public byte code() { + return this.code; + } + + public String string() { + return this.name; + } + +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/AppType.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/AppType.java new file mode 100644 index 000000000..9c9db9c6e --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/AppType.java @@ -0,0 +1,55 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.common; + + +import org.apache.hugegraph.type.define.SerialEnum; + +public enum AppType implements SerialEnum { + // 通用功能 + GENERAL(1, "GENERAL"), + + // 定制功能 + CUSTOMIZED(2, "CUSTOMIZED"), + + ; + + private final byte code; + private final String name; + + static { + SerialEnum.register(AppName.class); + } + + AppType(int code, String name) { + assert code < 256; + this.code = (byte) code; + this.name = name; + } + + @Override + public byte code() { + return this.code; + } + + public String string() { + return this.name; + } + +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/Constant.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/Constant.java index 11afe6a46..cdddf5ab1 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/Constant.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/Constant.java @@ -18,13 +18,13 @@ package org.apache.hugegraph.common; -import static java.nio.charset.StandardCharsets.UTF_8; +import com.google.common.collect.ImmutableSet; import java.nio.charset.Charset; import java.util.Set; import java.util.regex.Pattern; -import com.google.common.collect.ImmutableSet; +import static java.nio.charset.StandardCharsets.UTF_8; public final class Constant { @@ -39,12 +39,13 @@ public final class Constant { public static final String CONFIG_FILE = "hugegraph-hubble.properties"; public static final String CONTROLLER_PACKAGE = - "org.apache.hugegraph.controller"; + "com.baidu.hugegraph.controller"; public static final String COOKIE_USER = "user"; public static final String API_V1_1 = "/api/v1.1/"; public static final String API_V1_2 = "/api/v1.2/"; - public static final String API_VERSION = API_V1_2; + public static final String API_V1_3 = "/api/v1.3/"; + public static final String API_VERSION = API_V1_3; public static final String EDITION_COMMUNITY = "community"; public static final String EDITION_COMMERCIAL = "commercial"; @@ -58,6 +59,8 @@ public final class Constant { public static final int STATUS_ILLEGAL_GREMLIN = 460; public static final int STATUS_INTERNAL_ERROR = 500; + public static final String TOKEN_KEY = "auth_token"; + public static final int NO_LIMIT = -1; public static final Pattern COMMON_NAME_PATTERN = Pattern.compile( @@ -73,4 +76,6 @@ public final class Constant { ); public static final String[] LIKE_WILDCARDS = {"%", "_", "^", "[", "]"}; + + public static final String BUILT_IN = "neizhianli"; } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/Mergeable.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/Mergeable.java index 3fd638bc3..1d9e3e477 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/Mergeable.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/Mergeable.java @@ -19,5 +19,4 @@ package org.apache.hugegraph.common; public interface Mergeable { - } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/OptionType.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/OptionType.java new file mode 100644 index 000000000..4cf08b09b --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/common/OptionType.java @@ -0,0 +1,57 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.common; + + +import org.apache.hugegraph.type.define.SerialEnum; + +public enum OptionType implements SerialEnum { + + + DELETE(1, "DELETE"), + + ADD(2, "ADD"), + + UPDATE(3, "UPDATE"), + + ; + + private final byte code; + private final String name; + + static { + SerialEnum.register(OptionType.class); + } + + OptionType(int code, String name) { + assert code < 256; + this.code = (byte) code; + this.name = name; + } + + @Override + public byte code() { + return this.code; + } + + public String string() { + return this.name; + } + +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/CacheConfig.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/CacheConfig.java index d41b1e55b..8b367d307 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/CacheConfig.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/CacheConfig.java @@ -43,7 +43,10 @@ public class CacheConfig { public enum Caches { // No used - GREMLIN_QUERY; + GREMLIN_QUERY, + + // es query cached + ES_QUERY(DEFAULT_MAXSIZE, 60); private int maxSize = DEFAULT_MAXSIZE; private int ttl = DEFAULT_TTL; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/HubbleConfig.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/HubbleConfig.java index f5e2ae136..27e6e807b 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/HubbleConfig.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/HubbleConfig.java @@ -18,23 +18,19 @@ package org.apache.hugegraph.config; -import java.io.File; - import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.options.HubbleOptions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.io.File; + @Configuration public class HubbleConfig { - private static final Logger LOG = LoggerFactory.getLogger(HubbleConfig.class); - @Autowired private ApplicationArguments arguments; @@ -43,7 +39,7 @@ public HugeConfig hugeConfig() { String[] args = this.arguments.getSourceArgs(); if (args.length > 1) { throw new ExternalException( - "HugeGraphHubble accept up to one param as config file"); + "HugeGraphHubble accept up to one param as config file"); } else if (args.length == 0) { args = new String[]{Constant.CONFIG_FILE}; } @@ -59,7 +55,6 @@ public HugeConfig hugeConfig() { conf = path; } } catch (Exception ignored) { - LOG.error("hugeConfig exception"); } return new HugeConfig(conf); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/IngestionProxyServlet.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/IngestionProxyServlet.java new file mode 100644 index 000000000..0993b6c8c --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/IngestionProxyServlet.java @@ -0,0 +1,72 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.config; + +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpRequest; +import org.apache.http.HttpResponse; +import org.apache.http.HttpVersion; +import org.apache.http.entity.StringEntity; +import org.apache.http.message.BasicHttpResponse; +import org.apache.hugegraph.common.Constant; +import org.mitre.dsmiley.httpproxy.ProxyServlet; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class IngestionProxyServlet extends ProxyServlet { + @Override + protected String rewriteQueryStringFromRequest( + HttpServletRequest servletRequest, String queryString) { + String username = + (String) servletRequest.getSession().getAttribute("username"); + + String requestQueryString = servletRequest.getQueryString(); + + if (StringUtils.isEmpty(requestQueryString)) { + requestQueryString = String.format("user=%s", username); + } else { + requestQueryString += String.format("&user=%s", username); + } + + return requestQueryString; + } + + @Override + protected HttpResponse doExecute(HttpServletRequest servletRequest, + HttpServletResponse servletResponse, + HttpRequest proxyRequest) throws IOException { + String username = + (String) servletRequest.getSession().getAttribute("username"); + + if (username == null) { + // check user login + HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, + Constant.STATUS_OK, + "{\"status\": 401}"); + + response.setEntity(new StringEntity("{\"status\": 401}")); + + return response; + } + + return super.doExecute(servletRequest, servletResponse, proxyRequest); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/JacksonConfig.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/JacksonConfig.java index 4fc2ab300..c8ea6603e 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/JacksonConfig.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/JacksonConfig.java @@ -18,21 +18,21 @@ package org.apache.hugegraph.config; -import java.io.IOException; -import java.util.Map; - +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.module.SimpleModule; import org.apache.hugegraph.common.Response; +import org.apache.hugegraph.entity.graph.VertexQueryEntity; import org.apache.hugegraph.structure.graph.Edge; import org.apache.hugegraph.structure.graph.Vertex; import org.springframework.boot.jackson.JsonComponent; import org.springframework.context.annotation.Bean; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.module.SimpleModule; +import java.io.IOException; +import java.util.Map; @JsonComponent public class JacksonConfig { @@ -75,6 +75,11 @@ public void serialize(Vertex vertex, JsonGenerator generator, writeIdField("id", vertex.id(), generator); generator.writeStringField("label", vertex.label()); writePropertiesField(vertex.properties(), generator, provider); + if (vertex instanceof VertexQueryEntity) { + writeStatisticsField( + ((VertexQueryEntity) vertex).getStatistics(), + generator, provider); + } generator.writeEndObject(); } } @@ -98,7 +103,7 @@ public void serialize(Edge edge, JsonGenerator generator, private static void writeIdField(String fieldName, Object id, JsonGenerator generator) - throws IOException { + throws IOException { // Serialize id to string generator.writeStringField(fieldName, id.toString()); } @@ -106,7 +111,7 @@ private static void writeIdField(String fieldName, Object id, private static void writePropertiesField(Map properties, JsonGenerator generator, SerializerProvider provider) - throws IOException { + throws IOException { // Start write properties generator.writeFieldName("properties"); generator.writeStartObject(); @@ -130,4 +135,32 @@ private static void writePropertiesField(Map properties, // End wirte properties generator.writeEndObject(); } + + private static void writeStatisticsField(Map statistics, + JsonGenerator generator, + SerializerProvider provider) + throws IOException { + // Start write statistics + generator.writeFieldName("statistics"); + generator.writeStartObject(); + for (Map.Entry entry : statistics.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + generator.writeFieldName(key); + if (value != null) { + if (value instanceof Long) { + // To avoid javascript loss of long precision + generator.writeString(String.valueOf(value)); + } else { + JsonSerializer serializer; + serializer = provider.findValueSerializer(value.getClass()); + serializer.serialize(value, generator, provider); + } + } else { + generator.writeNull(); + } + } + // End wirte statistics + generator.writeEndObject(); + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/MetaConfig.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/MetaConfig.java new file mode 100644 index 000000000..2bf5370a6 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/MetaConfig.java @@ -0,0 +1,60 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.config; + +import org.apache.hugegraph.driver.factory.PDHugeClientFactory; +import org.apache.hugegraph.options.HubbleOptions; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@Configuration +public class MetaConfig { + + @Autowired + private HugeConfig config; + + @Bean("pdEnabled") + public Boolean pdEnabled() { + return this.config.get(HubbleOptions.PD_ENABLED); + } + + @Bean("cluster") + public String getCluster() { + return this.config.get(HubbleOptions.PD_CLUSTER); + } + + @Bean + PDHugeClientFactory pdHugeClientFactory() { + boolean pdEnabled = this.config.get(HubbleOptions.PD_ENABLED); + if (!pdEnabled) { + log.info("PD mode is disabled, skip creating PDHugeClientFactory"); + return null; + } + + String pdAddrs = this.config.get(HubbleOptions.PD_PEERS); + String routeType = this.config.get(HubbleOptions.ROUTE_TYPE); + return new PDHugeClientFactory(pdAddrs, routeType); + } + +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/ProxyServletConfiguration.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/ProxyServletConfiguration.java new file mode 100644 index 000000000..36a77120a --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/ProxyServletConfiguration.java @@ -0,0 +1,57 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.config; + +import org.apache.hugegraph.options.HubbleOptions; + +import org.mitre.dsmiley.httpproxy.ProxyServlet; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ProxyServletConfiguration{ + @Autowired + private HugeConfig config; + + /** + * Only register the proxy servlet when proxy.servlet_url is configured. + * When not configured, this bean won't be created, preventing the proxy + * servlet from intercepting all requests on root path. + */ + @Bean + @ConditionalOnProperty(name = "proxy.servlet_url", matchIfMissing = false) + public ServletRegistrationBean servletRegistrationBean(){ + String servletUrl = config.get(HubbleOptions.PROXY_SERVLET_URL); + String targetUrl = config.get(HubbleOptions.PROXY_TARGET_URL); + + // Additional safety check + if (servletUrl == null || servletUrl.isEmpty()) { + return null; + } + + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new IngestionProxyServlet(), + servletUrl); + servletRegistrationBean.addInitParameter("targetUri", targetUrl); + servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "true"); + return servletRegistrationBean; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/TomcatServletConfig.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/TomcatServletConfig.java index 9d0de09b1..f19e86695 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/TomcatServletConfig.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/TomcatServletConfig.java @@ -18,9 +18,6 @@ package org.apache.hugegraph.config; -import java.net.InetAddress; -import java.net.UnknownHostException; - import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.options.HubbleOptions; import org.apache.tomcat.util.http.LegacyCookieProcessor; @@ -29,10 +26,15 @@ import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.stereotype.Component; -// TODO: remove this class if we don't need it anymore +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * Reference http://www.zizhixiaoshe.com/article/invalidcookie.html + */ @Component -public class TomcatServletConfig implements - WebServerFactoryCustomizer { +public class TomcatServletConfig + implements WebServerFactoryCustomizer { @Autowired private HugeConfig config; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/WebMvcConfig.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/WebMvcConfig.java index 25ebcf6f5..ec0fb77e8 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/WebMvcConfig.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/WebMvcConfig.java @@ -18,30 +18,65 @@ package org.apache.hugegraph.config; -import org.apache.hugegraph.handler.CustomInterceptor; +import org.apache.hugegraph.handler.LoginInterceptor; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.resource.PathResourceResolver; + +import org.apache.hugegraph.handler.CustomInterceptor; + +import java.io.IOException; @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/{spring:[\\w-]+}") - .setViewName("forward:/"); - registry.addViewController("/**/{spring:[\\w-]+}") - .setViewName("forward:/"); + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/api/**"); + registry.addResourceHandler("/**") + .addResourceLocations("classpath:/ui/") + .resourceChain(true) + .addResolver(new PathResourceResolver() { + @Override + protected Resource getResource(String resourcePath, + Resource location) + throws IOException { + Resource requested = location.createRelative( + resourcePath); + // If the requested resource exists and is readable, + // serve it; otherwise fall back to index.html + // for SPA routing + if (requested.exists() && requested.isReadable()) { + return requested; + } + return new ClassPathResource("/ui/index.html"); + } + }); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(this.customInterceptor()) - .addPathPatterns("/**"); + .addPathPatterns("/api/**"); + registry.addInterceptor(this.loginInterceptor()) + .addPathPatterns("/api/**") + .excludePathPatterns("/api/**/auth/login") + .excludePathPatterns("/logout") + .excludePathPatterns("/api/**/auth/logout"); } + @Bean public CustomInterceptor customInterceptor() { return new CustomInterceptor(); } + + @Bean + public LoginInterceptor loginInterceptor() { + return new LoginInterceptor(); + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/AboutController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/AboutController.java index 044268b8d..89aea518a 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/AboutController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/AboutController.java @@ -18,9 +18,6 @@ package org.apache.hugegraph.controller; -import java.util.LinkedHashMap; -import java.util.Map; - import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.handler.MessageSourceHandler; import org.springframework.beans.factory.annotation.Autowired; @@ -28,9 +25,13 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.LinkedHashMap; +import java.util.Map; +//import org.apache.hugegraph.license.LicenseVerifier; // TODO C Remove Licence + + @RestController @RequestMapping("about") -// TODO: delete the class or keep it? public class AboutController extends BaseController { @Autowired @@ -38,11 +39,20 @@ public class AboutController extends BaseController { @GetMapping public Map about() { + //LicenseVerifier verifier = LicenseVerifier.instance();// TODO C Remove Licence Map about = new LinkedHashMap<>(); about.put("name", Constant.SERVER_NAME); - about.put("version", "1.5.0"); - about.put("allowed_datasize", - this.messageHandler.getMessage("license.datasize.no-limit")); + about.put("version", "3.0.0"); + //about.put("edition", verifier.edition());// TODO C Remove Licence + //about.put("allowed_graphs", verifier.allowedGraphs()); + //long datasize = verifier.allowedDataSize(); + //if (datasize == -1) { + // about.put("allowed_datasize", + // this.messageHandler.getMessage("license.datasize.no-limit")); + //} else { + // about.put("allowed_datasize", + // FileUtils.byteCountToDisplaySize(datasize * Bytes.MB)); + //} return about; } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/BaseController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/BaseController.java index bdcd4cd2a..7722bf78e 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/BaseController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/BaseController.java @@ -19,42 +19,230 @@ package org.apache.hugegraph.controller; import java.util.List; +import java.util.function.Function; +import javax.servlet.http.HttpServletRequest; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.driver.factory.PDHugeClientFactory; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.service.auth.UserService; +import org.apache.commons.collections.CollectionUtils; +import org.apache.hugegraph.config.HugeConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.exception.ParameterizedException; +import org.apache.hugegraph.service.HugeClientPoolService; import org.apache.hugegraph.common.Identifiable; import org.apache.hugegraph.common.Mergeable; import org.apache.hugegraph.util.EntityUtil; import org.apache.hugegraph.util.Ex; -import org.springframework.util.StringUtils; +@Component public abstract class BaseController { + @Autowired + protected String cluster; + @Autowired + protected HugeClientPoolService hugeClientPoolService; + @Autowired(required = false) + protected PDHugeClientFactory pdHugeClientFactory; + + @Autowired + private HugeConfig config; + + @Autowired + UserService userService; + public static final String ORDER_ASC = "asc"; public static final String ORDER_DESC = "desc"; public void checkIdSameAsBody(Object id, Identifiable newEntity) { Ex.check(newEntity.getId() != null, () -> id.equals(newEntity.getId()), - "common.param.path-id-should-same-as-body", - id, newEntity.getId()); + "common.param.path-id-should-same-as-body", + id, newEntity.getId()); } public void checkParamsNotEmpty(String name, String value, - boolean creating) { + boolean creating) { if (creating) { Ex.check(!StringUtils.isEmpty(value), - "common.param.cannot-be-null-or-empty", name); + "common.param.cannot-be-null-or-empty", name); } else { // The default null and user-passed null indicate no update Ex.check(value == null || !value.isEmpty(), - "common.param.cannot-be-empty", name); + "common.param.cannot-be-empty", name); } } public void checkParamsNotEmpty(String name, List values) { Ex.check(values != null && !values.isEmpty(), - "common.param.cannot-be-null-or-empty", name); + "common.param.cannot-be-null-or-empty", name); } public T mergeEntity(T oldEntity, T newEntity) { return EntityUtil.merge(oldEntity, newEntity); } + + protected void setSession(String key, Object value) { + HttpServletRequest request = getRequest(); + request.getSession().setAttribute(key, value); + } + + protected Object getSession(String key) { + HttpServletRequest request = getRequest(); + return request.getSession().getAttribute(key); + + } + + protected String getUser() { + return (String) getSession("username"); + } + + protected void setUser(String username) { + setSession("username", username); + } + + protected void delSession(String key) { + HttpServletRequest request = getRequest(); + request.getSession().removeAttribute(key); + } + + protected HttpServletRequest getRequest() { + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + } + + protected String getToken() { + return (String) getSession(Constant.TOKEN_KEY); + } + + protected void setToken(String token) { + this.setSession(Constant.TOKEN_KEY, token); + } + + protected void delToken() { + this.delSession(Constant.TOKEN_KEY); + } + + protected HugeClient authClient(String graphSpace, String graph) { + HttpServletRequest request = getRequest(); + if (request.getAttribute("hugeClient") != null) { + HugeClient client = (HugeClient) request.getAttribute("hugeClient"); + client.assignGraph(graphSpace, graph); + return client; + } + HugeClient client = this.hugeClientPoolService.createAuthClient( + graphSpace, graph, this.getToken()); + request.setAttribute("hugeClient", client); + return client; + } + + protected HugeClient unauthClient() { + HttpServletRequest request = getRequest(); + if (request.getAttribute("hugeClient") != null) { + HugeClient client = (HugeClient) request.getAttribute("hugeClient"); + return client; + } + HugeClient client = this.hugeClientPoolService.createUnauthClient(); + request.setAttribute("hugeClient", client); + return client; + } + + protected HugeClient tempTokenClient() { + HttpServletRequest request = getRequest(); + if (request.getAttribute("hugeClient") != null) { + HugeClient client = (HugeClient) request.getAttribute("hugeClient"); + client.setAuthContext("Basic " + this.getToken()); + return client; + } + HugeClient client = this.hugeClientPoolService.createTempTokenClient(this.getToken()); + request.setAttribute("hugeClient", client); + return client; + } + + protected void clearRequestHugeClient() { + HttpServletRequest request = getRequest(); + if (request.getAttribute("hugeClient") != null) { + HugeClient client = (HugeClient) request.getAttribute("hugeClient"); + client.close(); + } + request.setAttribute("hugeClient", null); + } + + protected HugeClient createAuthClient(String graphSpace, String graph) { + return this.hugeClientPoolService.create(null, graphSpace, graph, + this.getToken()); + } + + protected HugeClient createUnauthClient(String graphSpace, String graph) { + return this.hugeClientPoolService.create(null, graphSpace, graph, null); + } + + public T doAuthRequest(Function func) { + try (HugeClient client = createAuthClient(null, null)) { + return func.apply(client); + } catch (Throwable t) { + throw t; + } + } + + public T doUnauthRequest(Function func) { + try (HugeClient client = createUnauthClient(null, null)) { + return func.apply(client); + } catch (Throwable t) { + throw t; + } + } + + protected HugeClient defaultClient(String graphSpace, String graph) { + boolean pdEnabled = config.get(HubbleOptions.PD_ENABLED); + if (!pdEnabled) { + String url = config.get(HubbleOptions.SERVER_URL); + return hugeClientPoolService.create(url, graphSpace, graph, + this.getToken()); + } + + // PD mode: get URL from service discovery + List urls = pdHugeClientFactory.getURLs(this.cluster, + PDHugeClientFactory.DEFAULT_GRAPHSPACE, + PDHugeClientFactory.DEFAULT_SERVICE); + + if (CollectionUtils.isEmpty(urls)) { + throw new ParameterizedException("No url in service(%s/%s)", + PDHugeClientFactory.DEFAULT_GRAPHSPACE, + PDHugeClientFactory.DEFAULT_SERVICE); + } + + String url = urls.get((int) (Math.random() * urls.size())); + + HugeClient client = hugeClientPoolService.create(url, graphSpace, graph, + this.getToken()); + + return client; + } + + public String getUrl() { + boolean pdEnabled = config.get(HubbleOptions.PD_ENABLED); + if (!pdEnabled) { + return config.get(HubbleOptions.SERVER_URL); + } + + List urls = pdHugeClientFactory.getURLs(this.cluster, + PDHugeClientFactory.DEFAULT_GRAPHSPACE, + PDHugeClientFactory.DEFAULT_SERVICE); + + if (CollectionUtils.isEmpty(urls)) { + throw new ParameterizedException("No url in service(%s/%s)", + PDHugeClientFactory.DEFAULT_GRAPHSPACE, + PDHugeClientFactory.DEFAULT_SERVICE); + } + + String url = urls.get((int) (Math.random() * urls.size())); + return url; + } + } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/ConfigController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/ConfigController.java new file mode 100644 index 000000000..5b3795d8a --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/ConfigController.java @@ -0,0 +1,49 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.options.HubbleOptions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(Constant.API_VERSION + "config") +public class ConfigController { + + @Autowired + private HugeConfig config; + + @GetMapping + public Map getConfig() { + Map result = new HashMap<>(); + boolean pdEnabled = config.get(HubbleOptions.PD_ENABLED); + result.put("pd_enabled", pdEnabled); + if (!pdEnabled) { + result.put("server_url", config.get(HubbleOptions.SERVER_URL)); + } + return result; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/GraphConnectionController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/GraphConnectionController.java deleted file mode 100644 index 4dfa07a52..000000000 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/GraphConnectionController.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -package org.apache.hugegraph.controller; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.List; -import java.util.regex.Pattern; - -import org.apache.commons.lang3.StringUtils; -import org.apache.hugegraph.common.Constant; -import org.apache.hugegraph.common.Response; -import org.apache.hugegraph.config.HugeConfig; -import org.apache.hugegraph.driver.HugeClient; -import org.apache.hugegraph.entity.GraphConnection; -import org.apache.hugegraph.exception.ExternalException; -import org.apache.hugegraph.options.HubbleOptions; -import org.apache.hugegraph.service.GraphConnectionService; -import org.apache.hugegraph.service.HugeClientPoolService; -import org.apache.hugegraph.service.SettingSSLService; -import org.apache.hugegraph.util.Ex; -import org.apache.hugegraph.util.HubbleUtil; -import org.apache.hugegraph.util.HugeClientUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.baomidou.mybatisplus.core.metadata.IPage; - -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@RestController -@RequestMapping(Constant.API_VERSION + "graph-connections") -public class GraphConnectionController extends BaseController { - - private static final Pattern GRAPH_PATTERN = Pattern.compile( - "^[A-Za-z][A-Za-z0-9_]{0,47}$" - ); - - @Autowired - private HugeConfig config; - @Autowired - private GraphConnectionService connService; - @Autowired - private HugeClientPoolService poolService; - @Autowired - private SettingSSLService sslService; - - @GetMapping - public Response list(@RequestParam(name = "content", required = false) - String content, - @RequestParam(name = "page_no", required = false, - defaultValue = "1") - int pageNo, - @RequestParam(name = "page_size", required = false, - defaultValue = "10") - int pageSize) { - IPage conns = this.connService.list(content, pageNo, - pageSize); - return Response.builder().status(Constant.STATUS_OK).data(conns) - .build(); - } - - @GetMapping("{id}") - public GraphConnection get(@PathVariable("id") int id) { - GraphConnection entity = this.connService.get(id); - if (entity == null) { - throw new ExternalException("graph-connection.not-exist.id", id); - } - if (!this.poolService.containsKey(id)) { - this.sslService.configSSL(this.config, entity); - HugeClient client = HugeClientUtil.tryConnect(entity); - this.poolService.put(entity, client); - } - return entity; - } - - @PostMapping - public GraphConnection create(@RequestBody GraphConnection newEntity) { - this.checkParamsValid(newEntity, true); - this.checkAddressSecurity(newEntity); - // Make sure the new entity doesn't conflict with exists - this.checkEntityUnique(newEntity, true); - - newEntity.setTimeout(this.config.get(HubbleOptions.CLIENT_REQUEST_TIMEOUT)); - // Do connect test, failure will throw an exception - this.sslService.configSSL(this.config, newEntity); - HugeClient client = HugeClientUtil.tryConnect(newEntity); - newEntity.setCreateTime(HubbleUtil.nowDate()); - - this.connService.save(newEntity); - this.poolService.put(newEntity, client); - return newEntity; - } - - @PutMapping("{id}") - public GraphConnection update(@PathVariable("id") int id, - @RequestBody GraphConnection newEntity) { - this.checkIdSameAsBody(id, newEntity); - this.checkParamsValid(newEntity, false); - this.checkAddressSecurity(newEntity); - - // Check exist connection with this id - GraphConnection oldEntity = this.connService.get(id); - if (oldEntity == null) { - throw new ExternalException("graph-connection.not-exist.id", id); - } - GraphConnection entity = this.mergeEntity(oldEntity, newEntity); - // Make sure the updated connection doesn't conflict with exists - this.checkEntityUnique(entity, false); - this.sslService.configSSL(this.config, entity); - HugeClient client = HugeClientUtil.tryConnect(entity); - - this.connService.update(entity); - this.poolService.put(entity, client); - return entity; - } - - @DeleteMapping("{id}") - public GraphConnection delete(@PathVariable("id") int id) { - GraphConnection oldEntity = this.connService.get(id); - if (oldEntity == null) { - throw new ExternalException("graph-connection.not-exist.id", id); - } - this.connService.remove(id); - this.poolService.remove(oldEntity); - return oldEntity; - } - - private void checkParamsValid(GraphConnection newEntity, boolean creating) { - Ex.check(creating, () -> newEntity.getId() == null, - "common.param.must-be-null", "id"); - - String name = newEntity.getName(); - this.checkParamsNotEmpty("name", name, creating); - Ex.check(name != null, () -> Constant.COMMON_NAME_PATTERN.matcher(name) - .matches(), - "graph-connection.name.unmatch-regex"); - - String graph = newEntity.getGraph(); - this.checkParamsNotEmpty("graph", graph, creating); - Ex.check(graph != null, () -> GRAPH_PATTERN.matcher(graph).matches(), - "graph-connection.graph.unmatch-regex"); - - String host = newEntity.getHost(); - this.checkParamsNotEmpty("host", host, creating); - Ex.check(host != null, () -> HubbleUtil.HOST_PATTERN.matcher(host) - .matches(), - "graph-connection.host.unmatch-regex"); - - Integer port = newEntity.getPort(); - Ex.check(creating, () -> port != null, - "common.param.cannot-be-null", "port"); - Ex.check(port != null, () -> 0 < port && port <= 65535, - "graph-connection.port.must-be-in-range", "[1, 65535]", port); - - Ex.check((StringUtils.isEmpty(newEntity.getUsername()) && - StringUtils.isEmpty(newEntity.getPassword())) || - (!StringUtils.isEmpty(newEntity.getUsername()) && - !StringUtils.isEmpty(newEntity.getPassword())), - "graph-connection.username-or-password.must-be-same-status"); - - Ex.check(newEntity.getCreateTime() == null, - "common.param.must-be-null", "create_time"); - } - - private void checkAddressSecurity(GraphConnection newEntity) { - String host = newEntity.getHost(); - Integer port = newEntity.getPort(); - InetAddress address; - try { - address = InetAddress.getByName(host); - } catch (UnknownHostException e) { - throw new ExternalException("graph-connection.host.unresolved"); - } - String ip = address.getHostAddress(); - log.debug("The host: {}, ip: {}", address.getHostName(), ip); - - List ipWhiteList = this.config.get( - HubbleOptions.CONNECTION_IP_WHITE_LIST); - if (!ipWhiteList.contains("*")) { - Ex.check(ipWhiteList.contains(host) || ipWhiteList.contains(ip), - "graph-connection.host.unauthorized"); - } - - List portWhiteList = this.config.get( - HubbleOptions.CONNECTION_PORT_WHITE_LIST); - if (!portWhiteList.contains(-1)) { - Ex.check(portWhiteList.contains(port), - "graph-connection.port.unauthorized"); - } - } - - private void checkEntityUnique(GraphConnection newEntity, - boolean creating) { - List oldEntities = this.connService.listAll(); - for (GraphConnection oldEntity : oldEntities) { - // NOTE: create should check all, update check others - if (!creating && oldEntity.getId().equals(newEntity.getId())) { - continue; - } - Ex.check(!oldEntity.getName().equals(newEntity.getName()), - "graph-connection.exist.name", oldEntity.getName()); - Ex.check(!(oldEntity.getGraph().equals(newEntity.getGraph()) && - oldEntity.getHost().equals(newEntity.getHost()) && - oldEntity.getPort().equals(newEntity.getPort())), - "graph-connection.exist.graph-host-port", - oldEntity.getGraph(), oldEntity.getHost(), - oldEntity.getPort()); - } - } -} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/SettingController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/SettingController.java index 1a00a1afa..4f9a746cb 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/SettingController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/SettingController.java @@ -18,12 +18,6 @@ package org.apache.hugegraph.controller; -import java.util.concurrent.TimeUnit; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.entity.UserInfo; import org.apache.hugegraph.service.UserInfoService; @@ -34,6 +28,11 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.concurrent.TimeUnit; + @RestController @RequestMapping(Constant.API_VERSION + "setting") public class SettingController { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/OlapAlgoController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/OlapAlgoController.java new file mode 100644 index 000000000..83799aab3 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/OlapAlgoController.java @@ -0,0 +1,46 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.algorithm; + +import lombok.extern.log4j.Log4j2; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.algorithm.OlapEntity; +import org.apache.hugegraph.entity.query.OlapView; +import org.apache.hugegraph.service.algorithm.OlapAlgoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@Log4j2 +@RestController +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/algorithms/olap") +public class OlapAlgoController extends BaseController { + @Autowired + private OlapAlgoService service; + + @PostMapping + public OlapView olapView(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph, + @RequestBody OlapEntity body) { + HugeClient client = this.authClient(graphspace, graph); + return this.service.olapView(client, graphspace, body); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/OltpAlgoController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/OltpAlgoController.java index 28a265968..3bd54bf65 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/OltpAlgoController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/OltpAlgoController.java @@ -18,30 +18,261 @@ package org.apache.hugegraph.controller.algorithm; +import lombok.extern.log4j.Log4j2; +import org.apache.hugegraph.client.RestClient; +import org.apache.hugegraph.api.traverser.NeighborRankAPI; +import org.apache.hugegraph.api.traverser.PersonalRankAPI; +// TODO fix import +//import org.apache.hugegraph.client.api.traverser.NeighborRankAPI; +//import org.apache.hugegraph.client.api.traverser.PersonalRankAPI; import org.apache.hugegraph.common.Constant; -import org.apache.hugegraph.entity.algorithm.ShortestPath; -import org.apache.hugegraph.entity.query.GremlinResult; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.algorithm.*; +import org.apache.hugegraph.entity.query.*; import org.apache.hugegraph.service.algorithm.OltpAlgoService; +import org.apache.hugegraph.structure.traverser.*; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import lombok.extern.log4j.Log4j2; +import java.util.Map; @Log4j2 @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/algorithms") -public class OltpAlgoController { +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/algorithms/oltp") +public class OltpAlgoController extends BaseController { @Autowired private OltpAlgoService service; @PostMapping("shortestPath") - public GremlinResult shortPath(@PathVariable("connId") int connId, - @RequestBody ShortestPath body) { - return this.service.shortestPath(connId, body); + public GremlinResult shortPath(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody ShortestPathEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.shortestPath(client, body); + } + + @PostMapping("shortpath") + public GremlinResult shortPathAlias(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody ShortestPathEntity body) { + return this.shortPath(graphSpace, graph, body); + } + + @PostMapping("rings") + public GremlinResult rings(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody RingsEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.rings(client, body); + } + + @PostMapping("advancedPaths") + public GremlinResult advancedPaths(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody PathsRequest body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.advancedpaths(client, body); + } + + @PostMapping("sameNeighbors") + public GremlinResult sameNeighbors(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody SameNeighborsEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.sameNeighbors(client, body); + } + + @PostMapping("kout") + public GremlinResult kout(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody KoutEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.kout(client, body); + } + + @PostMapping("kout_post") + public GremlinResult koutPost(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody KoutRequest body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.koutPost(client, body); + } + + @PostMapping("kneighbor") + public GremlinResult kneighbor(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody KneighborEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.kneighbor(client, body); + } + + @PostMapping("kneighbor_post") + public GremlinResult kneighborPost(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody KneighborRequest body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.kneighborPost(client, body); + } + + @PostMapping("jaccardSimilarity") + public JaccardsimilarityView jaccardSimilarity(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody JaccardSimilarityEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.jaccardSimilarity(client, body); + } + + @PostMapping("jaccardSimilarity_post") + public JaccardsimilarityView jaccardSimilarityPost(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody SingleSourceJaccardSimilarityRequest body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.jaccardSimilarityPost(client, body); + } + + @PostMapping("personalrank") + public RanksView personalRank(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody PersonalRankAPI.Request body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.personalRank(client, body); + } + + @PostMapping("neighborrank") + public RanksView neighborRank(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody NeighborRankAPI.Request body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.neighborRank(client, body); + } + + @PostMapping("allshortestpaths") + public GremlinResult allShortPaths(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody AllShortestPathsEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.allShortestPaths(client, body); + } + + @PostMapping("allshortpath") + public GremlinResult allShortPathAlias(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody AllShortestPathsEntity body) { + return this.allShortPaths(graphSpace, graph, body); + } + + @PostMapping("weightedshortestpath") + public GremlinResult weightedShortestPath(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody WeightedShortestPathEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.weightedShortestPath(client, body); + } + + @PostMapping("singlesourceshortestpath") + public GremlinResult singleSourceShortestPath(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody SingleSourceShortestPathEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.singleSourceShortestPath(client, body); + } + + @PostMapping("multinodeshortestpath") + public GremlinResult multiNodeShortestPath(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody MultiNodeShortestPathRequest body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.multiNodeShortestPath(client, body); + } + + @PostMapping("paths") + public GremlinResult paths(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody PathsEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.paths(client, body); + } + + @PostMapping("customizedpaths") + public GremlinResult customizedPaths(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody CustomizedPathsRequest body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.customizedPaths(client, body); + } + + @PostMapping("templatepaths") + public GremlinResult templatePaths(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody TemplatePathsRequest body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.templatePaths(client, body); + } + + @PostMapping("crosspoints") + public GremlinResult crosspoints(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody CrossPointsEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.crosspoints(client, body); + } + + @PostMapping("customizedcrosspoints") + public GremlinResult customizedcrosspoints(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody CrosspointsRequest body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.customizedcrosspoints(client, body); + } + + @PostMapping("rays") + public GremlinResult rays(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody RaysEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.rays(client, body); + } + + @PostMapping("fusiformsimilarity") + public FusiformsimilarityView fusiformsimilarity(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody FusiformSimilarityRequest body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.fusiformsimilarity(client, body); + } + + @PostMapping("adamicadar") + public Map adamicadar(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody AdamicadarEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.adamicadar(client, body); + } + + @PostMapping("resourceallocation") + public Map resourceallocation(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody ResourceallocationEntity body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.resourceallocation(client, body); + } + + @PostMapping("sameneighborsbatch") + public GremlinResult sameneighborsbatch(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody SameNeighborsBatchRequest body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.sameneighborsbatch(client, body); + } + + @PostMapping("egonet") + public EgonetView egonet(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody EgonetRequest body) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.egonet(client, body); } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/VermeerAlgoController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/VermeerAlgoController.java new file mode 100644 index 000000000..5c3d8690b --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/algorithm/VermeerAlgoController.java @@ -0,0 +1,90 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.algorithm; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.loader.util.JsonUtil; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.service.space.VermeerService; +import org.apache.hugegraph.util.E; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/algorithms/vermeer") +public class VermeerAlgoController extends BaseController { + + @Autowired + VermeerService vermeerService; + @Autowired + private HugeConfig config; + + @PostMapping + public Map olapView(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph, + @RequestBody VParams body) { + String vGraph = vermeerService.convert2VG(graphspace, graph); + HugeClient client = this.authClient(null, null); + + Map graphInfo = + (Map) client.vermeer() + .getGraphInfoByName(vGraph) + .get("graph"); + E.checkArgument(graphInfo != null && !graphInfo.isEmpty(), + "graph not loaded"); + + Map params = new HashMap<>(); + // default params + String pdPeers = config.get(HubbleOptions.PD_PEERS); + String pdJson = JsonUtil.toJson(Arrays.asList(pdPeers.split(","))); + params.put("output.parallel", "10"); + params.put("output.type", "hugegraph"); + params.put("output.hg_pd_peers", pdJson); + params.put("output.hugegraph_name", graphspace + "/" + graph + "/g"); + params.put("output.hugegraph_username", this.getUser()); + params.put("output.hugegraph_password", (String) this.getSession( + "password")); + params.put("output.hugegraph_property", body.params.get("compute" + + ".algorithm")); + // input params + params.putAll(body.analyze()); + return vermeerService.compute(client, graphspace, graph, params); + } + + private static class VParams { + @JsonProperty("params") + public Map params; + + public Map analyze() { + for (Map.Entry entry : params.entrySet()) { + entry.setValue(entry.getValue().toString()); + } + return params; + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/AccessController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/AccessController.java new file mode 100644 index 000000000..f5c72e467 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/AccessController.java @@ -0,0 +1,82 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.controller.auth; +// +//import java.util.List; +// +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.service.auth.AccessService; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.DeleteMapping; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.PathVariable; +//import org.springframework.web.bind.annotation.PostMapping; +//import org.springframework.web.bind.annotation.PutMapping; +//import org.springframework.web.bind.annotation.RequestBody; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RequestParam; +//import org.springframework.web.bind.annotation.RestController; +// +//import org.apache.hugegraph.common.Constant; +//import org.apache.hugegraph.entity.auth.AccessEntity; +// +//@RestController +//@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/auth/accesses") +//public class AccessController extends AuthController { +// +// @Autowired +// AccessService accessService; +// +// @GetMapping +// public List list(@PathVariable("graphspace") String graphSpace, +// @RequestParam(value="role_id", required = false) String rid, +// @RequestParam(value="target_id", required = false) String tid) { +// HugeClient client = this.authClient(graphSpace, null); +// return this.accessService.list(client, rid, tid); +// } +// +// @GetMapping("{id}") +// public AccessEntity get(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String aid) { +// HugeClient client = this.authClient(graphSpace, null); +// return this.accessService.get(client, aid); +// } +// +// @PostMapping +// public AccessEntity add(@PathVariable("graphspace") String graphSpace, +// @RequestBody AccessEntity accessEntity) { +// HugeClient client = this.authClient(graphSpace, null); +// return this.accessService.addOrUpdate(client, accessEntity); +// } +// +// @PutMapping +// public AccessEntity update(@PathVariable("graphspace") String graphSpace, +// @RequestBody AccessEntity accessEntity) { +// HugeClient client = this.authClient(graphSpace, null); +// return this.accessService.addOrUpdate(client, accessEntity); +// } +// +// @DeleteMapping +// public void delete(@PathVariable("graphspace") String graphSpace, +// @RequestParam("role_id") String roleId, +// @RequestParam("target_id") String targetId) { +// HugeClient client = this.authClient(graphSpace, null); +// this.accessService.delete(client, roleId, targetId); +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/AuthController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/AuthController.java new file mode 100644 index 000000000..cf6ebb6f5 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/AuthController.java @@ -0,0 +1,24 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.auth; + +import org.apache.hugegraph.controller.BaseController; + +public class AuthController extends BaseController { +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/BelongController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/BelongController.java new file mode 100644 index 000000000..c93bb6aaf --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/BelongController.java @@ -0,0 +1,117 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.controller.auth; +// +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import org.apache.commons.lang3.StringUtils; +//import org.apache.hugegraph.common.Constant; +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.entity.auth.BelongEntity; +//import org.apache.hugegraph.service.auth.BelongService; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.*; +// +//import java.util.ArrayList; +//import java.util.List; +// +//@RestController +//@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/auth/belongs") +//public class BelongController extends AuthController { +// @Autowired +// BelongService belongService; +// +// public List list( +// @PathVariable("graphspace") String graphSpace, +// @RequestParam(value = "role_id", required = false) String rid, +// @RequestParam(value = "user_id", required = false) String uid) { +// HugeClient client = this.authClient(graphSpace, null); +// return belongService.list(client, rid, uid); +// } +// +// @GetMapping +// public IPage listPage( +// @PathVariable("graphspace") String graphSpace, +// @RequestParam(value = "role_id", required = false) String rid, +// @RequestParam(value = "user_id", required = +// false) String uid, +// @RequestParam(name = "page_no", required = false, +// defaultValue = "1") int pageNo, +// @RequestParam(name = "page_size", required = false, +// defaultValue = "10") int pageSize) { +// HugeClient client = this.authClient(graphSpace, null); +// return belongService.listPage(client, rid, uid, pageNo, pageSize); +// } +// +// @GetMapping("{id}") +// public BelongEntity get(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String bid) { +// HugeClient client = this.authClient(graphSpace, null); +// return belongService.get(client, bid); +// } +// +// @PostMapping() +// public void create(@PathVariable("graphspace") String graphSpace, +// @RequestBody BelongEntity belongEntity) { +// HugeClient client = this.authClient(graphSpace, null); +// belongService.add(client, belongEntity.getRoleId(), +// belongEntity.getUserId()); +// } +// +// @PostMapping("ids") +// public void createMany(@PathVariable("graphspace") String graphSpace, +// @RequestBody BelongService.BelongsReq belongsReq) { +// HugeClient client = this.authClient(graphSpace, null); +// +// for (String uid : belongsReq.getUserIds()) { +// belongService.add(client, belongsReq.getRoleId(), uid); +// } +// +// } +// +// @DeleteMapping("{id}") +// public void delete(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String bid) { +// HugeClient client = this.authClient(graphSpace, null); +// belongService.delete(client, bid); +// } +// +// @DeleteMapping +// public void delete(@PathVariable("graphspace") String graphSpace, +// @RequestParam("role_id") String roleId, +// @RequestParam("user_id") String userId) { +// +// HugeClient client = this.authClient(graphSpace, null); +// if (StringUtils.isNotEmpty(roleId) && !StringUtils.isNotEmpty(userId)) { +// belongService.delete(client, roleId, userId); +// } +// } +// +// @PostMapping("delids") +// public void deleteMany(@PathVariable("graphspace") String graphSpace, +// @RequestBody DelIdsReq delIdsReq) { +// +// HugeClient client = this.authClient(graphSpace, null); +// +// belongService.deleteMany(client, delIdsReq.ids.toArray(new String[0])); +// } +// +// public static class DelIdsReq { +// public List ids = new ArrayList(); +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/GraphSpaceUserController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/GraphSpaceUserController.java new file mode 100644 index 000000000..c0ef96d8d --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/GraphSpaceUserController.java @@ -0,0 +1,115 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.controller.auth; +// +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import org.apache.hugegraph.common.Constant; +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.entity.auth.UserView; +//import org.apache.hugegraph.service.auth.GraphSpaceUserService; +//import org.apache.hugegraph.structure.auth.User; +//import org.apache.hugegraph.structure.auth.UserManager; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.*; +// +//@RestController +//@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/auth/users") +//public class GraphSpaceUserController extends AuthController { +// @Autowired +// private GraphSpaceUserService userService; +// +// @GetMapping +// public IPage querySpaceUserViews( +// @PathVariable("graphspace") String graphSpace, +// @RequestParam(name = "query", required = false, +// defaultValue = "") String query, +// @RequestParam(name = "page_no", required = false, +// defaultValue = "1") int pageNo, +// @RequestParam(name = "page_size", required = false, +// defaultValue = "10") int pageSize) { +// HugeClient client = this.authClient(graphSpace, null); +// return userService.queryPage(client, query, pageNo, pageSize); +// } +// +// @GetMapping("spaceadmin") +// public IPage querySpaceAdmins( +// @PathVariable("graphspace") String graphSpace, +// @RequestParam(name = "query", required = false, +// defaultValue = "") String query, +// @RequestParam(name = "page_no", required = false, +// defaultValue = "1") int pageNo, +// @RequestParam(name = "page_size", required = false, +// defaultValue = "10") int pageSize) { +// HugeClient client = this.authClient(graphSpace, null); +// return userService.querySpaceAdmins(client, graphSpace, query, pageNo, +// pageSize); +// } +// +// +// @GetMapping("{id}") +// public UserView get(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String userId) { +// HugeClient client = this.authClient(graphSpace, null); +// return userService.getUser(client, userId); +// } +// +// /** +// * 授权用户为graphspace的管理员 +// */ +// @GetMapping("spaceadmin/{id}") +// public UserManager setGraphSpaceAdmin(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String userId) { +// HugeClient client = this.authClient(null, null); +// return client.auth().addSpaceAdmin(userId, graphSpace); +// } +// +// /** +// * 取消用户在某个graphspace的管理员权限 +// */ +// @DeleteMapping("spaceadmin/{id}") +// public void removeGraphSpaceAdmin(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String userId) { +// HugeClient client = this.authClient(null, null); +// client.auth().delSpaceAdmin(userId, graphSpace); +// } +// +// +// @PostMapping +// public UserView create(@PathVariable("graphspace") String graphSpace, +// @RequestBody UserView userView) { +// HugeClient client = this.authClient(graphSpace, null); +// return userService.createOrUpdate(client, userView); +// } +// +// @PutMapping("{id}") +// public UserView createOrUpdate(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String uid, +// @RequestBody UserView userView) { +// HugeClient client = this.authClient(graphSpace, null); +// userView.setId(uid); +// return userService.createOrUpdate(client, userView); +// } +// +// @DeleteMapping("{id}") +// public void delete(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String uid) { +// HugeClient client = this.authClient(graphSpace, null); +// userService.unauthUser(client, uid); +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/GroupController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/GroupController.java new file mode 100644 index 000000000..f2fc8ad03 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/GroupController.java @@ -0,0 +1,102 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.controller.auth; +// +//import java.util.List; +//import java.util.Map; +// +//import org.apache.hugegraph.controller.BaseController; +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import org.apache.hugegraph.service.auth.GroupService; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.DeleteMapping; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.PathVariable; +//import org.springframework.web.bind.annotation.PostMapping; +//import org.springframework.web.bind.annotation.PutMapping; +//import org.springframework.web.bind.annotation.RequestBody; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RequestParam; +//import org.springframework.web.bind.annotation.RestController; +// +//import org.apache.hugegraph.common.Constant; +//import org.apache.hugegraph.structure.auth.Group; +//import org.apache.hugegraph.driver.HugeClient; +// +//@RestController +//@RequestMapping(Constant.API_VERSION + "auth/groups") +//public class GroupController extends BaseController { +// +// @Autowired +// private GroupService groupService; +// +// @GetMapping("list") +// public List list() { +// HugeClient client = this.authClient(null, null); +// return this.groupService.list(client); +// } +// +// @GetMapping +// public IPage queryPage(@RequestParam(name = "query", required = false, +// defaultValue = "") String query, +// @RequestParam(name = "page_no", required = false, +// defaultValue = "1") int pageNo, +// @RequestParam(name = "page_size", required = false, +// defaultValue = "10") int pageSize) { +// HugeClient client = this.authClient(null, null); +// return this.groupService.queryPage(client, query, pageNo, pageSize); +// } +// +// @GetMapping("{id}") +// public Group get(@PathVariable("id") String rid) { +// HugeClient client = this.authClient(null, null); +// return this.groupService.get(client, rid); +// } +// +// @PostMapping +// public Group add(@RequestBody Group group) { +// HugeClient client = this.authClient(null, null); +// return this.groupService.insert(client, group); +// } +// +// @PutMapping("{id}") +// public Group update(@PathVariable("id") String id, +// @RequestBody Group group) { +// HugeClient client = this.authClient(null, null); +// Group g = this.groupService.get(client, id); +// g.description(group.description()); +// g.nickname(group.nickname()); +// this.groupService.update(client, g); +// +// return g; +// } +// +// @DeleteMapping("{id}") +// public void delete(@PathVariable("id") String id) { +// HugeClient client = this.authClient(null, null); +// this.groupService.delete(client, id); +// } +// +// @PostMapping("batch/{id}") +// public Map batch(@PathVariable("id") String id, +// @RequestBody Map action) { +// HugeClient client = this.authClient(null, null); +// return groupService.batch(client, id, action); +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java new file mode 100644 index 000000000..3e2bc6794 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java @@ -0,0 +1,86 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.auth; + +import org.apache.hugegraph.entity.auth.UserEntity; +import com.google.common.collect.ImmutableMap; +import org.apache.hugegraph.service.auth.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.structure.auth.Login; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.structure.auth.LoginResult; + +import java.util.Base64; + +@RestController +@RequestMapping(Constant.API_VERSION + "auth") +public class LoginController extends BaseController { + + @Autowired + UserService userService; + + @PostMapping("/login") + public Object login(@RequestBody Login login) { + // Set Expire: 1 Month + login.expire(60 * 60 * 24 * 30); + this.setToken(encodeCredentials(login)); + HugeClient client = tempTokenClient(); + LoginResult result = client.auth().login(login); + this.setUser(login.name()); + this.setSession("password", login.password()); + this.setToken(result.token()); + clearRequestHugeClient(); + + // Get Current User Info + client = this.authClient(null, null); + UserEntity u = userService.getUser(client, login.name()); + u.setSuperadmin(userService.isSuperAdmin(client)); + client.close(); + + return u; + } + + private String encodeCredentials(Login login) { + String combined = login.name() + ":" + login.password(); + return Base64.getEncoder().encodeToString(combined.getBytes()); + } + + @GetMapping("/status") + public Object status() { + + HugeClient client = authClient(null, null); + + String level = userService.userLevel(client); + + return ImmutableMap.of("level", level); + } + + @GetMapping("/logout") + public void logout() { + this.delToken(); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/RoleController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/RoleController.java new file mode 100644 index 000000000..7f9c39d13 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/RoleController.java @@ -0,0 +1,116 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.controller.auth; +// +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import org.apache.hugegraph.common.Constant; +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.service.auth.RoleService; +//import org.apache.hugegraph.structure.auth.Role; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.*; +// +//import java.util.List; +//import java.util.Map; +// +//@RestController +//@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/auth/roles") +//public class RoleController extends AuthController { +// +// @Autowired +// private RoleService roleService; +// +// @GetMapping("list") +// public List listName(@PathVariable("graphspace") String graphSpace) { +// HugeClient client = this.authClient(graphSpace, null); +// return this.roleService.list(client); +// } +// +// public List list(@PathVariable("graphspace") String graphSpace) { +// HugeClient client = this.authClient(graphSpace, null); +// return this.roleService.list(client); +// } +// +// @GetMapping +// public IPage queryPage(@PathVariable("graphspace") String graphSpace, +// @RequestParam(name = "query", required = false, +// defaultValue = "") String query, +// @RequestParam(name = "page_no", required = false, +// defaultValue = "1") int pageNo, +// @RequestParam(name = "page_size", required = false, +// defaultValue = "10") int pageSize) { +// HugeClient client = this.authClient(graphSpace, null); +// return this.roleService.queryPage(client, query, pageNo, pageSize); +// } +// +// @GetMapping("{id}") +// public Role get(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String rid) { +// HugeClient client = this.authClient(graphSpace, null); +// return this.roleService.get(client, rid); +// } +// +// @PostMapping +// public Role add(@PathVariable("graphspace") String graphSpace, +// @RequestBody Role role) { +// HugeClient client = this.authClient(graphSpace, null); +// return this.roleService.insert(client, role); +// } +// +// @PutMapping("{id}") +// public Role update(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String id, +// @RequestBody Role role) { +// HugeClient client = this.authClient(graphSpace, null); +// Role r = this.roleService.get(client, id); +// r.description(role.description()); +// r.nickname(role.nickname()); +// +// this.roleService.update(client, r); +// +// return r; +// } +// +// @DeleteMapping("{id}") +// public void delete(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String id) { +// HugeClient client = this.authClient(graphSpace, null); +// this.roleService.delete(client, id); +// } +// +// @GetMapping("setdefaultrole") +// public Map setDefaultRole(@PathVariable("graphspace") String graphSpace, +// @RequestParam("user") String user, +// @RequestParam("role") String role, +// @RequestParam(name = "graph", required = false, +// defaultValue = "") String graph) { +// HugeClient client = this.authClient(graphSpace, graph); +// return client.graphSpace().setDefaultRole(graphSpace, user, role, graph); +// } +// +// @DeleteMapping("deldefaultrole") +// public Map delDefaultRole(@PathVariable("graphspace") String graphSpace, +// @RequestParam("user") String user, +// @RequestParam("role") String role, +// @RequestParam(name = "graph", required = false, +// defaultValue = "") String graph) { +// HugeClient client = this.authClient(graphSpace, graph); +// return client.graphSpace().deleteDefaultRole(graphSpace, user, role, graph); +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/TargetController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/TargetController.java new file mode 100644 index 000000000..4d9572c7b --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/TargetController.java @@ -0,0 +1,90 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.controller.auth; +// +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import org.apache.hugegraph.common.Constant; +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.service.auth.TargetService; +//import org.apache.hugegraph.structure.auth.Target; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.*; +// +//import java.util.List; +// +//@RestController +//@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/auth/targets") +//public class TargetController extends AuthController { +// +// @Autowired +// TargetService targetService; +// +// @GetMapping("list") +// public List list(@PathVariable("graphspace") String graphSpace) { +// +// HugeClient client = this.authClient(graphSpace, null); +// return this.targetService.list(client); +// } +// +// @GetMapping +// public IPage queryPage(@PathVariable("graphspace") String graphSpace, +// @RequestParam(name = "query", required = false, +// defaultValue = "") String query, +// @RequestParam(name = "page_no", required = false, +// defaultValue = "1") int pageNo, +// @RequestParam(name = "page_size", required = false, +// defaultValue = "10") int pageSize) { +// +// HugeClient client = this.authClient(graphSpace, null); +// return this.targetService.queryPage(client, query, pageNo, pageSize); +// } +// +// @GetMapping("{id}") +// public Target get(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String tid) { +// HugeClient client = this.authClient(graphSpace, null); +// return this.targetService.get(client, tid); +// } +// +// @PostMapping +// public Target add(@PathVariable("graphspace") String graphSpace, +// @RequestBody Target target) { +// HugeClient client = this.authClient(graphSpace, null); +// return this.targetService.add(client, target); +// } +// +// @PutMapping("{id}") +// public Target update(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String tid, +// @RequestBody Target target) { +// HugeClient client = this.authClient(graphSpace, null); +// Target t = this.targetService.get(client, tid); +// // Notice: Do Not Change target name +// t.resources(target.resources()); +// t.description(target.description()); +// return this.targetService.update(client, t); +// } +// +// @DeleteMapping("{id}") +// public void delete(@PathVariable("graphspace") String graphSpace, +// @PathVariable("id") String tid) { +// HugeClient client = this.authClient(graphSpace, null); +// this.targetService.delete(client, tid); +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/UserController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/UserController.java new file mode 100644 index 000000000..631c4df1f --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/UserController.java @@ -0,0 +1,229 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.auth; + +import com.google.common.collect.ImmutableMap; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.common.Response; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.auth.PasswordEntity; +import org.apache.hugegraph.entity.auth.UserEntity; +import org.apache.hugegraph.service.auth.UserService; +import org.apache.hugegraph.util.HubbleUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Arrays; +import java.util.List; + +@RestController +@RequestMapping(Constant.API_VERSION + "auth/users") +public class UserController extends BaseController { + + @Autowired + UserService userService; + + Logger logger = LoggerFactory.getLogger(getClass()); + + @GetMapping("list") + public Object list() { + List users = this.userService.listUsers( + this.authClient(null, null)); + return ImmutableMap.of("users", users); + } + + @GetMapping + public Object queryPage(@RequestParam(name = "query", required = false, + defaultValue = "") String query, + @RequestParam(name = "page_no", required = false, + defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", required = false, + defaultValue = "10") int pageSize) { + return userService.queryPage(this.authClient(null, null), + query, pageNo, pageSize); + } + + @PostMapping + public void create(@RequestBody UserEntity userEntity) { + HugeClient client = this.authClient(null, null); + userService.add(client, userEntity); + } + + @PostMapping("batch") + public void createbatch(@RequestParam("file") MultipartFile csvfile) { + HugeClient client = this.authClient(null, null); + userService.addbatch(client, csvfile); + } + + + @GetMapping("{id}") + public Object get(@PathVariable("id") String id) { + return userService.get(this.authClient(null, null), + id); + } + + @PutMapping("{id}") + public void update(@PathVariable("id") String id, + @RequestBody UserEntity userEntity) { + userEntity.setId(id); + userService.update(this.authClient(null, null), userEntity); + } + + @DeleteMapping("{id}") + public void delete(@PathVariable("id") String id) { + userService.delete(this.authClient(null, null), id); + } + + @PostMapping("updatepwd") + public Response updatepwd(@RequestBody PasswordEntity pwd) { + HugeClient client = this.authClient(null, null); + return userService.updatepwd(client, pwd.getUsername(), pwd.getOldpwd(), pwd.getNewpwd()); + } + + @GetMapping("listadminspace/{username}") + public List listadminspace(@PathVariable("username") String username) { + HugeClient client = this.authClient(null, null); + return userService.listAdminSpace(client, username); + } + + @PostMapping("updateadminspace/{username}") + public void updateadminspace(@PathVariable("username") String username, + @RequestBody List adminspaces) { + HugeClient client = this.authClient(null, null); + userService.updateAdminSpace(client, username, adminspaces); + } + + @GetMapping("updatepersonal") + public void updatepersonal(@RequestParam(name = "nickname") String nickname, + @RequestParam(name = "description", required = false, + defaultValue = "") String description) { + userService.updatePersonal(this.authClient(null, null), getUser() , nickname , description); + } + @GetMapping("getpersonal") + public Object getpersonal() { + return userService.getpersonal(this.authClient(null, null), + getUser()); + } + + @GetMapping("super") + public Object getSuperList(@RequestParam(name = "page_no", required = false, + defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", required = false, + defaultValue = "10") int pageSize) { + return userService.superQueryPage(this.authClient(null, null), "", pageNo, pageSize); + } + + @PostMapping("super") + public void addSuper(@RequestParam(name = "usernames", required = true) String usernames, + @RequestParam(name = "nicknames", required = false) String nicknames, + @RequestParam(name = "description", required = false) String description) { + List usernameList = Arrays.asList(usernames.split(",")); + List nicknameList = Arrays.asList(nicknames.split(",")); + + for (int i = 0; i < usernameList.size(); i++) { + String username = usernameList.get(i); + String nickname = nicknameList.get(i); + this.updateUserAuth(username, nickname, description, null, true); + } + } + + @PostMapping("uuap") + public void addUuap(@RequestParam(name = "usernames", required = true) String usernames, + @RequestParam(name = "nicknames", required = false) String nicknames, + @RequestParam(name = "description", required = false) String description, + @RequestParam(name = "adminSpaces", required = false) String adminSpaces) { + List usernameList = Arrays.asList(usernames.split(",")); + List nicknameList = Arrays.asList(nicknames.split(",")); + List adminSpacesList = null; + + if (adminSpaces != null) { + adminSpacesList = Arrays.asList(adminSpaces.split(",")); + } + + for (int i = 0; i < usernameList.size(); i++) { + String username = usernameList.get(i); + String nickname = nicknameList.get(i); + this.updateUserAuth(username, nickname, description, adminSpacesList, false); + } + } + + private void updateUserAuth(String username, String nickname, String description, + List adminspaces, boolean isAdmin) { + UserEntity user = null; + try { + user = userService.getUser(this.authClient(null, null), username); + } catch (Exception e) { + logger.error(String.format("user '%s' not exist", username), e); + } + HugeClient client = this.authClient(null, null); + + // 不存在则先创建, 存在则直接设置权限 + if (user == null) { + UserEntity userData = new UserEntity(); + userData.setName(username); + userData.setPassword(HubbleUtil.md5Secret(username)); + userData.setNickname(nickname); + userData.setSuperadmin(isAdmin); + userData.setDescription(description); + if (adminspaces != null && !adminspaces.isEmpty()) { + userData.setAdminSpaces(adminspaces); + userService.add(this.authClient(null, null), userData); + } + logger.info(String.format( + "user not exist, have been created [%s], super admin =[%s]", + username, isAdmin)); + } else { + updateUserAuthIfNeed(client, user, isAdmin, adminspaces); + } + } + + @DeleteMapping("super/{id}") + public void deleteSuper(@PathVariable("id") String id){ + try { + UserEntity user = userService.getUser(this.authClient(null, null), id); + user.setSuperadmin(false); + userService.update(this.authClient(null, null), user); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void updateUserAuthIfNeed(HugeClient client, UserEntity user, + boolean isAdmin, List adminSpaces) { + // 判断是否为超级管理员 + if (isAdmin && !userService.isSuperAdmin(client, user.getId())) { + client.auth().addSuperAdmin(user.getId()); + } + if (adminSpaces != null && !adminSpaces.isEmpty()) { + for (String space : adminSpaces) { + try { + client.auth().addSpaceAdmin(user.getId(), space); + } catch (Exception e) { + logger.warn(String.format("user '%s' add space '%s' error", + user.getId(), space), e); + } + } + } + } + +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/WhiteIpListController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/WhiteIpListController.java new file mode 100644 index 000000000..b38d9084b --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/WhiteIpListController.java @@ -0,0 +1,58 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.auth; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.auth.WhiteIpListEntity; +import org.apache.hugegraph.service.auth.WhiteIpListService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +@RequestMapping(Constant.API_VERSION + "auth/whiteiplist") +public class WhiteIpListController extends AuthController{ + @Autowired + private WhiteIpListService whiteListService; + + @GetMapping("list") + public Map list() { + HugeClient client = this.authClient(null, null); + return this.whiteListService.get(client); + } + + @PostMapping("batch") + public Map update(@RequestBody WhiteIpListEntity whiteIpListEntity) { + HugeClient client = this.authClient(null, null); + return this.whiteListService.batch(client, whiteIpListEntity); + } + + @PutMapping("updatestatus") + public Map update(@RequestBody boolean status) { + HugeClient client = this.authClient(null, null); + return this.whiteListService.updatestatus(client, status); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graph/GraphController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graph/GraphController.java index d103059fd..ea1d16155 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graph/GraphController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graph/GraphController.java @@ -18,35 +18,50 @@ package org.apache.hugegraph.controller.graph; -import java.util.Map; -import java.util.Set; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; -import org.apache.commons.lang3.StringUtils; -import org.apache.hugegraph.common.Constant; -import org.apache.hugegraph.controller.BaseController; -import org.apache.hugegraph.entity.graph.EdgeEntity; -import org.apache.hugegraph.entity.graph.VertexEntity; -import org.apache.hugegraph.entity.query.GraphView; -import org.apache.hugegraph.entity.schema.EdgeLabelEntity; -import org.apache.hugegraph.entity.schema.VertexLabelEntity; -import org.apache.hugegraph.service.graph.GraphService; -import org.apache.hugegraph.service.schema.EdgeLabelService; -import org.apache.hugegraph.service.schema.VertexLabelService; -import org.apache.hugegraph.structure.constant.IdStrategy; +import org.apache.hugegraph.common.OptionType; + +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.loader.util.JsonUtil; import org.apache.hugegraph.structure.graph.Edge; import org.apache.hugegraph.structure.graph.Vertex; -import org.apache.hugegraph.util.Ex; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; import org.springframework.web.util.UriUtils; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.entity.graph.EdgeEntity; +import org.apache.hugegraph.entity.graph.VertexEntity; +import org.apache.hugegraph.entity.graph.VertexQueryEntity; +import org.apache.hugegraph.entity.query.ElementEditHistory; +import org.apache.hugegraph.entity.query.GraphView; +import org.apache.hugegraph.service.graph.GraphService; +import org.apache.hugegraph.service.query.EditElementHistoryService; +import org.apache.hugegraph.service.schema.EdgeLabelService; +import org.apache.hugegraph.service.schema.VertexLabelService; + +import lombok.extern.slf4j.Slf4j; + @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/graph") +@Slf4j +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}") public class GraphController extends BaseController { @Autowired @@ -55,84 +70,205 @@ public class GraphController extends BaseController { private EdgeLabelService elService; @Autowired private GraphService graphService; + @Autowired + private EditElementHistoryService editEleHisService; @PostMapping("vertex") - public GraphView addVertex(@PathVariable("connId") int connId, + public GraphView addVertex(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody VertexEntity entity) { - this.checkParamsValid(connId, entity, true); - return this.graphService.addVertex(connId, entity); + HugeClient client = this.authClient(graphSpace, graph); + GraphView graphView = this.graphService.addVertex(client, entity); + + assert graphView.getVertices().size() == 1; + VertexQueryEntity v = graphView.getVertices().iterator().next(); + String vertexId = v.id().toString(); + addEditEleHistory(graphSpace, graph, vertexId, entity.getLabel(), + v.properties().size(), + OptionType.ADD, JsonUtil.toJson(entity)); + return graphView; } @PutMapping("vertex/{id}") - public Vertex updateVertex(@PathVariable("connId") int connId, + public Vertex updateVertex(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") String vertexId, @RequestBody VertexEntity entity) { + HugeClient client = this.authClient(graphSpace, graph); vertexId = UriUtils.decode(vertexId, Constant.CHARSET); - this.checkParamsValid(connId, entity, false); this.checkIdSameAsBody(vertexId, entity); - return this.graphService.updateVertex(connId, entity); + Vertex result = + this.graphService.updateVertex(client, vertexId, entity); + addEditEleHistory(graphSpace, graph, vertexId, + entity.getLabel(), result.properties().size(), + OptionType.UPDATE, JsonUtil.toJson(entity)); + return result; + } + + @DeleteMapping("vertex/{id}") + public void deleteVertex(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("id") String vertexId) { + HugeClient client = this.authClient(graphSpace, graph); + vertexId = UriUtils.decode(vertexId, Constant.CHARSET); + Vertex vertex = client.graph().getVertex(vertexId); + String label = vertex.label(); + + this.graphService.deleteVertex(client, vertexId); + addEditEleHistory(graphSpace, graph, vertexId, label, + vertex.properties().size(), OptionType.DELETE, ""); } @PostMapping("edge") - public GraphView addEdge(@PathVariable("connId") int connId, + public GraphView addEdge(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody EdgeEntity entity) { - this.checkParamsValid(connId, entity, true); - return this.graphService.addEdge(connId, entity); + HugeClient client = this.authClient(graphSpace, graph); + GraphView edge = this.graphService.addEdge(client, entity); + assert edge.getEdges().size() == 1; + Edge e = edge.getEdges().iterator().next(); + String edgeId = e.id().toString(); + addEditEleHistory(graphSpace, graph, + edgeId, entity.getLabel(), + e.properties().size(), OptionType.ADD, + JsonUtil.toJson(entity)); + return edge; } @PutMapping("edge/{id}") - public Edge updateEdge(@PathVariable("connId") int connId, + public Edge updateEdge(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") String edgeId, @RequestBody EdgeEntity entity) { edgeId = UriUtils.decode(edgeId, Constant.CHARSET); - this.checkParamsValid(connId, entity, false); + HugeClient client = this.authClient(graphSpace, graph); this.checkIdSameAsBody(edgeId, entity); - return this.graphService.updateEdge(connId, entity); + Edge edge = this.graphService.updateEdge(client, edgeId, entity); + addEditEleHistory(graphSpace, graph, edgeId, entity.getLabel(), + edge.properties().size(), OptionType.UPDATE, + JsonUtil.toJson(entity)); + return edge; } - private void checkParamsValid(int connId, VertexEntity entity, - boolean create) { - Ex.check(!StringUtils.isEmpty(entity.getLabel()), - "common.param.cannot-be-null-or-empty", "label"); - // If schema doesn't exist, it will throw exception - VertexLabelEntity vlEntity = this.vlService.get(entity.getLabel(), - connId); - IdStrategy idStrategy = vlEntity.getIdStrategy(); - if (create) { - Ex.check(idStrategy.isCustomize(), () -> entity.getId() != null, - "common.param.cannot-be-null", "id"); - } else { - Ex.check(entity.getId() != null, - "common.param.cannot-be-null", "id"); - } + @DeleteMapping("edge/{id}") + public void deleteEdge(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("id") String edgeId) { + edgeId = UriUtils.decode(edgeId, Constant.CHARSET); + HugeClient client = this.authClient(graphSpace, graph); + Edge edge = client.graph().getEdge(edgeId); + String label = edge.label(); - Set nonNullableProps = vlEntity.getNonNullableProps(); - Map properties = entity.getProperties(); - Ex.check(properties.keySet().containsAll(nonNullableProps), - "graph.vertex.all-nonnullable-prop.should-be-setted"); + this.graphService.deleteEdge(client, edgeId); + addEditEleHistory(graphSpace, graph, edgeId, label, + edge.properties().size(), OptionType.DELETE, ""); } - private void checkParamsValid(int connId, EdgeEntity entity, - boolean create) { - Ex.check(!StringUtils.isEmpty(entity.getLabel()), - "common.param.cannot-be-null-or-empty", "label"); - // If schema doesn't exist, it will throw exception - EdgeLabelEntity elEntity = this.elService.get(entity.getLabel(), connId); - if (create) { - Ex.check(entity.getId() == null, - "common.param.must-be-null", "id"); + @DeleteMapping("element/batch") + public void deleteElements(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestParam(name = "type", + required = true) String type, + @RequestParam(name = "ids", required = true) + List elementIds) { + HugeClient client = this.authClient(graphSpace, graph); + ArrayList list = new ArrayList<>(); + HashSet set = new HashSet<>(elementIds); + if ("VERTEX".equals(type)) { + for (String vertexId : set) { + vertexId = UriUtils.decode(vertexId, Constant.CHARSET); + Vertex vertex = client.graph().getVertex(vertexId); + String label = vertex.label(); + this.graphService.deleteVertex(client, vertexId); + list.add(getEditEleHistory(graphSpace, graph, vertexId, label, + vertex.properties().size(), OptionType.DELETE, "")); + } + } else if ("EDGE".equals(type)) { + for (String edgeId : elementIds) { + edgeId = UriUtils.decode(edgeId, Constant.CHARSET); + Edge edge = client.graph().getEdge(edgeId); + String label = edge.label(); + this.graphService.deleteEdge(client, edgeId); + list.add(getEditEleHistory(graphSpace, graph, edgeId, label, + edge.properties().size(), + OptionType.DELETE, "")); + } } else { - Ex.check(entity.getId() != null, - "common.param.cannot-be-null", "id"); + throw new IllegalArgumentException( + "type must in [VERTEX, EDGE], but got '" + type + "'"); } - Ex.check(entity.getSourceId() != null, - "common.param.must-be-null", "source_id"); - Ex.check(entity.getTargetId() != null, - "common.param.must-be-null", "target_id"); - - Set nonNullableProps = elEntity.getNonNullableProps(); - Map properties = entity.getProperties(); - Ex.check(properties.keySet().containsAll(nonNullableProps), - "graph.edge.all-nonnullable-prop.should-be-setted"); + editEleHisService.add(list); + } + + @GetMapping("edgelabel/{label}") + public HashMap getEdgeProperties(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("label") String label) { + HugeClient client = this.authClient(graphSpace, graph); + return this.graphService.getEdgeProperties(client, label); + } + + @GetMapping("vertexlabel/{label}") + public HashMap getVertexProperties(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("label") String label) { + HugeClient client = this.authClient(graphSpace, graph); + return this.graphService.getVertexProperties(client, label); + } + @PostMapping("edgestype") + public HashMap getEdgeStyle(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody List labels) { + HugeClient client = this.authClient(graphSpace, graph); + return this.graphService.getEdgeStyle(client, labels); + } + + @PostMapping("vertexstyle") + public HashMap getVertexStyle(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody List labels) { + HugeClient client = this.authClient(graphSpace, graph); + return this.graphService.getVertexStyle(client, labels); + } + + + @PostMapping("import") + public GraphView importJson(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestParam("file") MultipartFile jsonFile) throws IOException { + HugeClient client = this.authClient(graphSpace, graph); + return this.graphService.importJson(client, jsonFile); + } + + private void addEditEleHistory(String graphSpace, + String graph, + String elementId, + String label, + int propertyNum, + OptionType optionType, + String content) { + this.editEleHisService.add(graphSpace, graph, elementId, label, + propertyNum, optionType.name(), + new Date(), getUser(), content); + } + + private ElementEditHistory getEditEleHistory(String graphSpace, + String graph, + String elementId, + String label, + int propertyNum, + OptionType optionType, + String content){ + return ElementEditHistory.builder() + .graphspace(graphSpace) + .graph(graph) + .elementId(elementId) + .label(label) + .propertyNum(propertyNum) + .optionType(optionType.name()) + .optionTime(new Date()) + .optionPerson(getUser()) + .content(content) + .build(); } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graphs/GraphsController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graphs/GraphsController.java new file mode 100644 index 000000000..71140e7d0 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graphs/GraphsController.java @@ -0,0 +1,381 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.graphs; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.hugegraph.entity.graphs.GraphCloneEntity; +import org.apache.hugegraph.exception.ExternalException; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.entity.graphs.GraphStatisticsEntity; +import org.apache.hugegraph.exception.ServerException; +import org.apache.hugegraph.service.space.VermeerService; +import org.apache.hugegraph.structure.constant.GraphReadMode; +import com.google.common.collect.ImmutableMap; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.service.graphs.GraphsService; +import org.apache.hugegraph.service.load.JobManagerService; +import org.apache.hugegraph.service.query.ExecuteHistoryService; +import org.apache.hugegraph.service.query.GremlinCollectionService; +import org.apache.hugegraph.service.space.SchemaTemplateService; + +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@RestController +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs") +public class GraphsController extends BaseController { + + @Autowired + GraphsService graphsService; + @Autowired + SchemaTemplateService schemaTemplateService; + @Autowired + ExecuteHistoryService executeHistoryService; + @Autowired + GremlinCollectionService gremlinCollectionService; + @Autowired + JobManagerService jobManagerService; + @Autowired + VermeerService vermeerService; + @Autowired + HugeConfig config; + + public boolean isVermeerEnabled() { + String username = this.getUser(); + String password = (String) this.getSession("password"); + return vermeerService.isVermeerEnabled(username, password); + } + + public String getGraphFromVermeer(String vermeer) { + return vermeer.split("-")[1]; + } + + private Map getVermeerGraphs(String graphspace, + boolean enable) { + if (enable) { + HugeClient client = this.authClient(graphspace, null); + List> graphinfos; + try { + graphinfos = (List>) client.vermeer() + .getGraphsInfo() + .get("graphs"); + } catch (ServerException e) { + log.info("无法连接到vermeer平台", e.cause()); + graphinfos = null; + } + if (graphinfos == null || graphinfos.size() == 0) { + // if vermeer data cleared + return ImmutableMap.of(); + } + String prefix = graphspace + "-"; + graphinfos = graphinfos.stream().filter((g) -> g.get("name") + .toString().startsWith(prefix)) + .collect(Collectors.toList()); + Map briefs = new HashMap<>(graphinfos.size()); + for (Map info: graphinfos) { + String name = getGraphFromVermeer(info.get("name").toString()); + Map brief = new HashMap<>(); + brief.put("name", name); + brief.put("status", info.get("status").toString()); + + String lastLoadTime = info.get("update_time").toString(); + // todo date format + brief.put("last_load_time", lastLoadTime); + briefs.put(name, brief); + } + return briefs; + } + return ImmutableMap.of(); + } + + private Map getVermeerGraph(String graphspace, + String graph) { + boolean enable = isVermeerEnabled(); + if (enable) { + String prefix = graphspace + "-"; + Map graphInfo = null; + try { + HugeClient client = this.authClient(graphspace, null); + + graphInfo = (Map) client.vermeer() + .getGraphInfoByName(prefix + graph) + .get("graph"); + } catch (ServerException e) { + // if dashboard enables vermeer but server sets wrong vermeer + // address, return null + log.info("无法连接到vermeer平台", e.cause()); + return ImmutableMap.of(); + } + + if (graphInfo == null || graphInfo.isEmpty()) { + return ImmutableMap.of(); + } + + Map brief = new HashMap<>(); + + String name = getGraphFromVermeer(graphInfo.get("name").toString()); + brief.put("name", name); + brief.put("status", graphInfo.get("status").toString()); + String lastLoadTime = graphInfo.get("update_time").toString(); + // todo date format + brief.put("last_load_time", lastLoadTime); + return brief; + } + return ImmutableMap.of(); + } + + @GetMapping("list") + public Object listGraphs(@PathVariable("graphspace") String graphspace) { + // Get list of authorized graphs + HugeClient client = this.authClient(graphspace, null); + + boolean enable = isVermeerEnabled(); + Map vermeerInfo = getVermeerGraphs(graphspace, enable); + List> sortedGraphs = + graphsService.sortedGraphsProfile(client, graphspace, "", "", + enable, vermeerInfo); + + return ImmutableMap.of("graphs", sortedGraphs); + } + + @GetMapping + public Object queryPage(@PathVariable("graphspace") String graphspace, + @RequestParam(name = "query", required = false, + defaultValue = "") String query, + @RequestParam(name = "create_time", required = false, + defaultValue = "") String createTime, + @RequestParam(name = "page_no", required = false, + defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", required = false, + defaultValue = "10") int pageSize) { + HugeClient client = this.authClient(graphspace, null); + boolean enable = isVermeerEnabled(); + Map vermeerInfo = getVermeerGraphs(graphspace, enable); + Object result = this.graphsService.queryPage(client, graphspace, + getUser(), query, + createTime, pageNo, + pageSize, enable, + vermeerInfo); + + return result; + } + + @GetMapping("{graph}/get") + public Object get(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph) { + Map vermeerInfo = getVermeerGraph(graphspace, graph); + Object result = graphsService.get(this.authClient(graphspace, graph), + graphspace, graph, vermeerInfo); + return result; + } + + // no-use +// @GetMapping("{graph}/storage") +// public Map storage(@PathVariable("graphspace") String graphspace, +// @PathVariable("graph") String graph) { +// RestClient pdClient = getPdClient(); +// Map result = ImmutableMap.of("storage", +// String.valueOf( +// graphsService.getStorage(graphspace, +// graph))); +// if (pdClient != null) { +// pdClient.close(); +// } +// return result; +// } + + @PostMapping("{graph}/statistics") + public void postStatistics( + @PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph) { + HugeClient client = this.authClient(graphspace, graph); +// RestClient pdClient = getPdClient(); + graphsService.postStatistics(null, client, graphspace, graph); +// if (pdClient != null) { +// pdClient.close(); +// } + } + + @GetMapping("{graph}/statistics") + public GraphStatisticsEntity getStatistics( + @PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph) { + HugeClient client = this.authClient(graphspace, graph); +// RestClient pdClient = getPdClient(); + GraphStatisticsEntity result = + graphsService.getStatistics(client, graphspace, + graph); +// if (pdClient != null) { +// pdClient.close(); +// } + return result; + } + + @PostMapping + public Object create(@PathVariable("graphspace") String graphspace, + @RequestParam("graph") String graph, + @RequestParam("nickname") String nickname, + @RequestParam(value = "auth", required = false, + defaultValue = "false") boolean isAuth, + @RequestParam(value = "schema", required = false) + String schemaTemplage) { + + return this.graphsService.create(this.authClient(graphspace, null), + nickname, graph, schemaTemplage); + } + + @GetMapping("{graph}/update") + public void update(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph, + @RequestParam("nickname") String nickname) { + + this.graphsService.update(this.authClient(graphspace, null), + nickname, graph); + } + @DeleteMapping("{graph}") + public void delete(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph, + @RequestParam(value = "message", required = false, + defaultValue = "I'm sure to drop the graph") + String message) { + + Map vermeer = getVermeerGraph(graphspace, graph); + if (!vermeer.isEmpty()) { + HugeClient client = this.authClient(null, null); + try { + vermeerService.deleteGraph(client, graphspace, graph); + } catch (Exception e) { + // HugeGraph-Common assert request with delete method returns + // 202 or 204 + if (!e.getMessage().contains("deleted ok")) { + throw new ExternalException("delete vermeer graph error " + + "%s", e.getMessage()); + } + } + } + + this.graphsService.delete(this.authClient(graphspace, graph), graph, + message); + + // Clean Local DB Data + executeHistoryService.deleteByGraph(graphspace, graph); + gremlinCollectionService.deleteByGraph(graphspace, graph); + jobManagerService.removeByGraph(graphspace, graph); + } + + + @GetMapping("{graph}/truncate") + public void truncate(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph, + @RequestParam(value = "clear_schema", required = false, + defaultValue = "false") boolean isClearSchema, + @RequestParam(value = "clear_data", required = false, + defaultValue = "false") boolean isClearData) { + this.graphsService.truncate(this.authClient(graphspace, graph), graph, + isClearSchema, isClearData); + } + + @GetMapping("{graph}/setdefault") + public void setDefault(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph) { + this.graphsService.setDefault(this.authClient(graphspace, graph), graph); + } + + @GetMapping("{graph}/unsetdefault") + public void unSetDefault(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph) { + this.graphsService.unSetDefault(this.authClient(graphspace, graph), + graph); + } + + @GetMapping("getdefault") + public Map getDefault(@PathVariable("graphspace") String graphspace) { + return this.graphsService.getDefault(this.authClient(graphspace, null)); + } + + @PutMapping("{graph}/graph_read_mode") + public void graphReadMode(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph, + @RequestBody String mode) { + this.graphsService.graphReadMode(this.authClient(graphspace, graph), graph, mode); + } + + @GetMapping("{graph}/graph_read_mode") + public Map graphReadMode(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph) { + Map status = new HashMap<>(); + GraphReadMode graphMode = this.graphsService.graphReadMode(this.authClient(graphspace, graph), graph); + if ("all".equals(graphMode.string())) { + status.put("status", "0"); + } + else if ("oltp_only".equals(graphMode.string())) { + status.put("status", "1"); + } + return status; + } + + @PostMapping("{graph}/clone") + public Object clone(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph, + @RequestBody GraphCloneEntity graphCloneEntity) { + // TODO X clean code at here + //HugeClient clientOfDefaultGs = this.authClient("DEFAULT", ""); + // clone request must post to default server + //clientOfDefaultGs.assignGraph(graphspace, graph); + //return this.graphsService.clone(clientOfDefaultGs, graphCloneEntity.convertMap()); + return this.graphsService.clone(this.authClient(graphspace, graph), + graphCloneEntity.convertMap(graphspace, + graph)); + } + // + //@Data + //@NoArgsConstructor + //@AllArgsConstructor + //@Builder + //private static class GraphCloneEntity { + // @JsonProperty("target_graphspace") + // public String targetGraphSpace; + // + // @JsonProperty("target_graph") + // public String targetGraph; + // + // public Map convertMap() { + // return Map.of("target_graphspace", targetGraphSpace, + // "target_graph", targetGraph); + // } + //} +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/ingest/IngestController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/ingest/IngestController.java new file mode 100644 index 000000000..13ee835e5 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/ingest/IngestController.java @@ -0,0 +1,346 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.ingest; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.extern.log4j.Log4j2; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.common.Response; +import org.apache.hugegraph.entity.enums.JobStatus; +import org.apache.hugegraph.entity.enums.LoadStatus; +import org.apache.hugegraph.entity.load.Datasource; +import org.apache.hugegraph.entity.load.JobManager; +import org.apache.hugegraph.entity.load.LoadTask; +import org.apache.hugegraph.service.load.DatasourceService; +import org.apache.hugegraph.service.load.JobManagerService; +import org.apache.hugegraph.service.load.LoadTaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Log4j2 +@RestController +@RequestMapping(Constant.API_VERSION + "ingest") +public class IngestController { + + @Autowired + private JobManagerService jobManagerService; + @Autowired + private LoadTaskService loadTaskService; + @Autowired + private DatasourceService datasourceService; + + // ===== Datasource endpoints ===== + + @GetMapping("/datasources/list") + public Response datasourceList( + @RequestParam(name = "query", required = false, defaultValue = "") String query, + @RequestParam(name = "page_no", required = false, defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", required = false, defaultValue = "10") int pageSize) { + IPage page = datasourceService.list(pageNo, pageSize, query); + return Response.builder().status(Constant.STATUS_OK).data(page).build(); + } + + @GetMapping("/datasources/{id}") + public Response datasourceGet(@PathVariable("id") int id) { + Datasource ds = datasourceService.get(id); + if (ds == null) { + return Response.builder().status(Constant.STATUS_NOT_FOUND) + .message("Datasource not found: " + id).build(); + } + return Response.builder().status(Constant.STATUS_OK).data(ds).build(); + } + + @PostMapping("/datasources") + public Response datasourceCreate(@RequestBody Datasource entity) { + datasourceService.save(entity); + return Response.builder().status(Constant.STATUS_OK) + .data(Map.of("datasource_id", entity.getId())).build(); + } + + @DeleteMapping("/datasources/{id}") + public Response datasourceDelete(@PathVariable("id") int id) { + datasourceService.remove(id); + return Response.builder().status(Constant.STATUS_OK).build(); + } + + @PostMapping("/datasources/delete") + public Response datasourceBatchDelete(@RequestBody List ids) { + datasourceService.removeBatch(ids); + return Response.builder().status(Constant.STATUS_OK).build(); + } + + // ===== Task endpoints (job_manager table) ===== + + @GetMapping("/tasks/list") + public Response taskList( + @RequestParam(name = "query", required = false, defaultValue = "") String query, + @RequestParam(name = "page_no", required = false, defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", required = false, defaultValue = "10") int pageSize) { + + // list all jobs across all graphspaces - use empty strings to get all + // We need to query without graphspace/graph filter for the ingest view + IPage page = jobManagerService.listAll(pageNo, pageSize, query); + + IPage result = page.convert(job -> { + TaskVO vo = new TaskVO(); + vo.taskId = job.getId(); + vo.taskName = job.getJobName(); + vo.taskScheduleType = "ONCE"; + vo.taskScheduleStatus = toScheduleStatus(job.getJobStatus()); + vo.createTime = job.getCreateTime(); + vo.creator = ""; + + // Build ingestion_option from job fields + Map option = new HashMap<>(); + option.put("graphspace", job.getGraphSpace()); + option.put("graph", job.getGraph()); + vo.ingestionOption = option; + + // Build ingestion_mapping with structs from file mappings + List tasks = loadTaskService.taskListByJob(job.getId()); + List> structs = tasks.stream().map(t -> { + Map struct = new HashMap<>(); + Map input = new HashMap<>(); + input.put("type", "FILE"); + input.put("path", t.getFileName()); + struct.put("input", input); + return struct; + }).collect(Collectors.toList()); + Map mapping = new HashMap<>(); + mapping.put("structs", structs); + vo.ingestionMapping = mapping; + + // Build last_metrics from latest load task + if (!tasks.isEmpty()) { + LoadTask latest = tasks.get(tasks.size() - 1); + Map metrics = new HashMap<>(); + metrics.put("status", latest.getStatus().name()); + metrics.put("load_progress", latest.getLoadProgress()); + vo.lastMetrics = metrics; + } + + // Build job_summary + JobSummaryVO summary = new JobSummaryVO(); + for (LoadTask t : tasks) { + if (t.getStatus() == LoadStatus.SUCCEED) summary.successCount++; + else if (t.getStatus() == LoadStatus.FAILED) summary.failedCount++; + else if (t.getStatus().inRunning()) summary.runningCount++; + } + vo.jobSummary = summary; + + return vo; + }); + + return Response.builder().status(Constant.STATUS_OK).data(result).build(); + } + + @GetMapping("/tasks/{id}") + public Response taskDetail(@PathVariable("id") int id) { + JobManager job = jobManagerService.get(id); + if (job == null) { + return Response.builder().status(Constant.STATUS_NOT_FOUND) + .message("Task not found: " + id).build(); + } + return Response.builder().status(Constant.STATUS_OK).data(job).build(); + } + + @DeleteMapping("/tasks/{id}") + public Response deleteTask(@PathVariable("id") int id) { + jobManagerService.remove(id); + return Response.builder().status(Constant.STATUS_OK).build(); + } + + @PutMapping("/tasks/{id}/enable") + public Response enableTask(@PathVariable("id") int id) { + JobManager job = jobManagerService.get(id); + if (job == null) { + return Response.builder().status(Constant.STATUS_NOT_FOUND) + .message("Task not found: " + id).build(); + } + job.setJobStatus(JobStatus.DEFAULT); + jobManagerService.update(job); + return Response.builder().status(Constant.STATUS_OK).build(); + } + + @PutMapping("/tasks/{id}/disable") + public Response disableTask(@PathVariable("id") int id) { + JobManager job = jobManagerService.get(id); + if (job == null) { + return Response.builder().status(Constant.STATUS_NOT_FOUND) + .message("Task not found: " + id).build(); + } + job.setJobStatus(JobStatus.FAILED); + jobManagerService.update(job); + return Response.builder().status(Constant.STATUS_OK).build(); + } + + // ===== Job endpoints (load_task table) ===== + + @GetMapping("/jobs/list") + public Response jobList( + @RequestParam(name = "taskid", required = false, defaultValue = "0") int taskId, + @RequestParam(name = "page_no", required = false, defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", required = false, defaultValue = "10") int pageSize) { + + List tasks = loadTaskService.taskListByJob(taskId); + + // Manual pagination + int total = tasks.size(); + int fromIndex = Math.min((pageNo - 1) * pageSize, total); + int toIndex = Math.min(fromIndex + pageSize, total); + List pageData = tasks.subList(fromIndex, toIndex); + + List records = pageData.stream().map(t -> { + JobVO vo = new JobVO(); + vo.jobId = t.getId(); + vo.taskId = t.getJobId(); + vo.jobStatus = t.getStatus().name(); + vo.jobMessage = ""; + vo.createTime = t.getCreateTime(); + + JobMetricsVO metrics = new JobMetricsVO(); + metrics.totalCount = t.getFileReadLines() != null ? t.getFileReadLines() : 0L; + long durationMs = t.getDuration() != null ? t.getDuration() : 0L; + long durationSec = durationMs > 0 ? durationMs / 1000 : 1; + metrics.avgRate = durationMs > 0 ? (float) metrics.totalCount / durationSec : 0f; + metrics.curRate = t.getStatus().inRunning() ? metrics.avgRate : 0f; + metrics.totalTime = durationMs; + vo.jobMetrics = metrics; + + return vo; + }).collect(Collectors.toList()); + + Map result = new HashMap<>(); + result.put("records", records); + result.put("total", total); + result.put("size", pageSize); + result.put("current", pageNo); + + return Response.builder().status(Constant.STATUS_OK).data(result).build(); + } + + @GetMapping("/jobs/{id}") + public Response jobDetail(@PathVariable("id") int id) { + LoadTask task = loadTaskService.get(id); + if (task == null) { + return Response.builder().status(Constant.STATUS_NOT_FOUND) + .message("Job not found: " + id).build(); + } + return Response.builder().status(Constant.STATUS_OK).data(task).build(); + } + + @DeleteMapping("/jobs/{id}") + public Response deleteJob(@PathVariable("id") int id) { + loadTaskService.remove(id); + return Response.builder().status(Constant.STATUS_OK).build(); + } + + // ===== Metrics ===== + + @GetMapping("/metrics/task") + public Response metricsTask() { + List all = jobManagerService.listAll(); + + long runningOnce = 0, runningCron = 0, runningRealtime = 0; + long todoOnce = 0, todoCron = 0, todoRealtime = 0; + + for (JobManager job : all) { + if (job.getJobStatus() == JobStatus.LOADING) { + runningOnce++; + } else if (job.getJobStatus() == JobStatus.DEFAULT || + job.getJobStatus() == JobStatus.SETTING) { + todoOnce++; + } + } + + Map todo = new HashMap<>(); + todo.put("ONCE", todoOnce); + todo.put("CRON", todoCron); + todo.put("REALTIME", todoRealtime); + + Map running = new HashMap<>(); + running.put("ONCE", runningOnce); + running.put("CRON", runningCron); + running.put("REALTIME", runningRealtime); + + Map data = new HashMap<>(); + data.put("total_realtime_size", 0); + data.put("total_other_size", all.size()); + data.put("todo", todo); + data.put("running", running); + + return Response.builder().status(Constant.STATUS_OK).data(data).build(); + } + + // ===== Helpers ===== + + private String toScheduleStatus(JobStatus status) { + if (status == JobStatus.FAILED) return "DISABLE"; + return "ENABLE"; + } + + // ===== VOs ===== + + @Data + static class TaskVO { + @JsonProperty("task_id") Integer taskId; + @JsonProperty("task_name") String taskName; + @JsonProperty("task_schedule_type") String taskScheduleType; + @JsonProperty("task_schedule_status") String taskScheduleStatus; + @JsonProperty("ingestion_option") Object ingestionOption; + @JsonProperty("ingestion_mapping") Object ingestionMapping; + @JsonProperty("last_metrics") Object lastMetrics; + @JsonProperty("job_summary") JobSummaryVO jobSummary; + @JsonProperty("create_time") Date createTime; + @JsonProperty("creator") String creator; + } + + @Data + static class JobSummaryVO { + @JsonProperty("success_count") int successCount; + @JsonProperty("failed_count") int failedCount; + @JsonProperty("running_count") int runningCount; + } + + @Data + static class JobVO { + @JsonProperty("job_id") Integer jobId; + @JsonProperty("task_id") Integer taskId; + @JsonProperty("job_status") String jobStatus; + @JsonProperty("job_message") String jobMessage; + @JsonProperty("job_metrics") JobMetricsVO jobMetrics; + @JsonProperty("create_time") Date createTime; + } + + @Data + static class JobMetricsVO { + @JsonProperty("total_count") long totalCount; + @JsonProperty("avg_rate") float avgRate; + @JsonProperty("cur_rate") float curRate; + @JsonProperty("total_time") long totalTime; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/langchain/LangChainController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/langchain/LangChainController.java new file mode 100644 index 000000000..bd835bf9f --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/langchain/LangChainController.java @@ -0,0 +1,678 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.langchain; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.HashMap; + +import org.apache.hugegraph.controller.query.GremlinController; +import org.apache.hugegraph.driver.SchemaManager; +import org.apache.hugegraph.entity.query.GremlinQuery; +import org.apache.hugegraph.entity.query.JsonView; +import org.apache.hugegraph.service.query.QueryService; +import org.apache.hugegraph.structure.schema.EdgeLabel; +import org.apache.hugegraph.structure.schema.VertexLabel; +import org.apache.hugegraph.util.Ex; +import org.apache.hugegraph.util.JsonUtil; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.apache.hugegraph.util.E; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.log4j.Log4j2; + +/** + * langchain controller + */ +@Log4j2 +@RestController +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs/{graph}") +public class LangChainController extends BaseController { + + private static final String DEFAULT_PYTHON_FILE = "langchaincode/excute_langchain.py"; + + private static final String G_V = "g.v"; + private static final String G_E = "g.e"; + + private static final String WENXIN_4_MODEL = "wenxin4"; + private static final String GPT_4_MODEL = "gpt4"; + + private static final List DEFAULT_MODEL = Arrays.asList(WENXIN_4_MODEL, GPT_4_MODEL); + + @Autowired + private QueryService queryService; + + @PostMapping("langchain") + public Object langchain(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody RequestLangChainParams requestLangChainParams) { + E.checkNotNull(requestLangChainParams, "params must not be null"); + log.info("LangChainController langchain params:{}"); + this.checkParams(requestLangChainParams); + this.checkModelParams(requestLangChainParams); + this.checkUserParam(requestLangChainParams); + + this.tryLogin(graphSpace, graph, + requestLangChainParams.userName, requestLangChainParams.password); + + return this.langChainQuery(graphSpace, graph, requestLangChainParams); + } + + @PostMapping("langchain/hubble") + public Object langchainHubble(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody RequestLangChainParams requestLangChainParams) { + E.checkNotNull(requestLangChainParams, "params must not be null"); + log.info("LangChainController langchain params:{}", + requestLangChainParams); + this.checkParams(requestLangChainParams); + + return this.langChainQuery(graphSpace, graph, requestLangChainParams); + } + + + private ResponseLangChain langChainQuery(String graphSpace, String graph, + RequestLangChainParams requestLangChainParams) { + //uuapLoginController.tryLogin(graphSpace, graph, "admin", "S3#rd6(sg!"); //TODO C Deleted + HugeClient client = this.authClient(graphSpace, graph); + SchemaManager schemaManager = client.schema(); + List vertexLabels = schemaManager.getVertexLabels(); + List edgeLabels = schemaManager.getEdgeLabels(); + String schema = JsonUtil.toJson(this.getBigModelSchema(vertexLabels, edgeLabels)); + log.info("langchain schema:{}", schema); + + String filePath; + if (StringUtils.isNotEmpty(requestLangChainParams.fileName)) { + URL url = LangChainController.class.getClassLoader().getResource(""); + filePath = String.format("%s%s", url.getPath(), requestLangChainParams.fileName); + this.judgeFileExist(filePath); + log.info("LangChainController filePath:{}", filePath); + } else { + throw new RuntimeException("fileName must not be null"); + } + + List result = this.excutePythonRuntime(requestLangChainParams.pythonPath, + filePath, requestLangChainParams.query, requestLangChainParams.openKey, schema, + requestLangChainParams.model, requestLangChainParams.ernieClientId, requestLangChainParams.ernieClientSecret); + if (CollectionUtils.isEmpty(result)) { + return this.generateResponseLangChain(requestLangChainParams.query, + "LangChain not generate gremlin"); + } else { + return this.generateResponseLangChain(requestLangChainParams.query, + result.get(result.size() - 1)); + } + } + + + @PostMapping("langchain/schema") + public Object langchainSchema(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody RequestLangChainParams requestLangChainParams) { + E.checkNotNull(requestLangChainParams, "params must not be null"); + log.info("LangChainController langchain params:{}", + requestLangChainParams); + this.checkUserParam(requestLangChainParams); + + this.tryLogin(graphSpace, graph, + requestLangChainParams.userName, requestLangChainParams.password); + + HugeClient client = this.authClient(graphSpace, graph); + SchemaManager schemaManager = client.schema(); + List vertexLabels = schemaManager.getVertexLabels(); + List edgeLabels = schemaManager.getEdgeLabels(); + HashMap schema = this.getBigModelSchema(vertexLabels, edgeLabels); + return schema; + } + + @PostMapping("gremlin") + public Object gremlin(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody RequestLangChainParams requestLangChainParams) { + E.checkNotNull(requestLangChainParams, "params must not be null"); + GremlinQuery query = new GremlinQuery(); + query.setContent(requestLangChainParams.query); + this.checkParamsValid(query); + this.checkUserParam(requestLangChainParams); + + this.tryLogin(graphSpace, graph, + requestLangChainParams.userName, requestLangChainParams.password); + + try { + HugeClient client = this.authClient(graphSpace, graph); + JsonView result = + this.queryService.executeSingleGremlinQuery(client, query); + return result.getData(); + } catch (Throwable e) { + throw e; + } + } + + @PostMapping("langchain_no_schema") + public Object langchainNoSchema(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody RequestLangChainParams requestLangChainParams) { + E.checkNotNull(requestLangChainParams, "params must not be null"); + log.info("LangChainController langchain params:{}", + requestLangChainParams); + + this.checkParams(requestLangChainParams); + this.checkModelParams(requestLangChainParams); + + String filePath; + if (StringUtils.isNotEmpty(requestLangChainParams.fileName)) { + URL url = LangChainController.class.getClassLoader().getResource(""); + filePath = String.format("%s%s", url.getPath(), requestLangChainParams.fileName); + this.judgeFileExist(filePath); + log.info("LangChainController filePath:{}", filePath); + } else { + throw new RuntimeException("fileName must not be null"); + } + + List result = + this.excutePythonByProcessBuilder( + requestLangChainParams.pythonPath, filePath, + requestLangChainParams.query, requestLangChainParams.openKey, + requestLangChainParams.graphSchema, requestLangChainParams.model, + requestLangChainParams.ernieClientId, requestLangChainParams.ernieClientSecret); + if (CollectionUtils.isEmpty(result)) { + return this.generateResponseLangChain(requestLangChainParams.query, + "LangChain not generate gremlin"); + } else { + return this.generateResponseLangChain(requestLangChainParams.query, + result.get(result.size() - 1)); + } + } + + private void tryLogin(String graphSpace, String graph, + String username, String password) { + log.info("Attempting to login username:{}", username); + + E.checkNotNull(username, "username cannot be null"); + E.checkNotNull(password, "password cannot be null"); + String token = this.getToken(); + if (StringUtils.isNotEmpty(token)) { + log.info("Attempting to login token exist, username:{} token:{}", username, token); + return; + } + //uuapLoginController.loginVerifyUser(graphSpace, graph, username, password, null); + // TODO C Deleted + if (Objects.isNull(this.getToken())) { + log.error("Attempting to login failed, username:{}", username); + throw new IllegalStateException("login failed"); + } + } + + /** + * + * @param pythonPath + * @param pythonScriptPath + * @param query + * @param openKey + * @param graphSchema + * @return + */ + private List excutePythonRuntime(String pythonPath, + String pythonScriptPath, + String query, + String openKey, + String graphSchema, + String model, + String ernieClientId, + String ernieClientSecret) { + String[] args1 = this.getExcuteArgs(pythonPath, pythonScriptPath, query, openKey, graphSchema, + model, ernieClientId, ernieClientSecret); + log.info("lang chain execute python command:\n [{}] \n", String.join(" ", args1)); + + // 执行Python文件,并传入参数 + List lineList = new ArrayList<>(); + try { + Process proc = Runtime.getRuntime().exec(args1); + BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); + String line = null; + while ((line = in.readLine()) != null) { + lineList.add(line); + log.info("execute ret:{}", line); + } + if (!this.judgeResultSuccess(lineList, model)) { + this.calculateError(lineList, model); + log.error("excutePython lineList:{}", lineList); + lineList.clear(); + } else { + lineList = getGremlinResults(lineList, model); + } + in.close(); + proc.waitFor(); + } catch (Exception e) { + e.printStackTrace(); + log.error("excutePythonRuntime error", e); + } + return lineList; + } + + + /** + * 使用ProcessBuilder执行python脚本 + * @param pythonPath + * @param pythonScriptPath + * @param query + * @param openKey + * @param graphSchema + * @return + */ + private List excutePythonByProcessBuilder(String pythonPath, + String pythonScriptPath, + String query, + String openKey, + String graphSchema, + String model, + String ernieClientId, + String ernieClientSecret) { + String[] args1 = this.getExcuteArgs(pythonPath, pythonScriptPath, query, openKey, graphSchema, + model, ernieClientId, ernieClientSecret); + + // 构造ProcessBuilder对象 + ProcessBuilder pb = new ProcessBuilder(args1); + + // 将python脚本的输出和错误输出合并 + pb.redirectErrorStream(false); + + List lineList = new ArrayList<>(); + try { + // 启动进程 + Process process = pb.start(); + // 读取进程的输出 + BufferedReader in = new BufferedReader( + new InputStreamReader(process.getInputStream())); + String ret; + while ((ret = in.readLine()) != null) { + lineList.add(ret); + log.info("execute ret:{}", ret); + } + if (!this.judgeResultSuccess(lineList, model)) { + this.calculateError(lineList, model); + log.error("excutePython lineList:{}", lineList); + lineList.clear(); + } else { + lineList = getGremlinResults(lineList, model); + } + // 等待进程结束 + int exitCode = process.waitFor(); + log.info("Exited with error code : " + exitCode); + } catch (Exception e) { + log.error("excutePythonRuntime error", e); + } + return lineList; + } + + private void judgeFileExist(String filePath) { + File file = new File(filePath); + if (!file.exists()) { + log.error("python file not exist:{}", filePath); + throw new IllegalArgumentException("python file not exist"); + } + } + + private List getGremlinResults(List lineList, String model) { + if (GPT_4_MODEL.equals(model)) { + return Arrays.asList(this.getGpt4GremlinResults(lineList)); + } else if (WENXIN_4_MODEL.equals(model)) { + return Arrays.asList(this.getWenXin4GremlinResults(lineList)); + } + return Collections.emptyList(); + } + + private String getGpt4GremlinResults(List lineList) { + for (String line : lineList) { + String tmp = line.toLowerCase(); + if (tmp.contains(G_V) || tmp.contains(G_E)) { + if (!line.startsWith(G_V) || !line.startsWith(G_E)) { + line = cutGremlin(line); + } + return line; + } + } + return StringUtils.EMPTY; + } + + private String getWenXin4GremlinResults(List lineList) { + for (String line : lineList) { + String tmp = line.toLowerCase(); + if (tmp.contains(G_V) || tmp.contains(G_E)) { + if (!line.startsWith(G_V) || !line.startsWith(G_E)) { + line = cutGremlin(line); + } + return line; + } + } + return StringUtils.EMPTY; + } + + private String cutGremlin(String line) { + int start = 0; + int end = 0; + for (int i = 0; i < line.length(); i++) { + if (line.charAt(i) == 'g') { + start = i; + break; + } + } + for (int i = line.length() - 1; i >= 0; i--) { + if (line.charAt(i) == ')') { + end = i + 1; + break; + } + } + return line.substring(start, end); + } + + /** + * 判断结果是否正确 + * @param lineList + * @return + */ + private boolean judgeResultSuccess(List lineList, String model) { + if (GPT_4_MODEL.equals(model)) { + return this.judgeGpt4ResultSuccess(lineList); + } else if (WENXIN_4_MODEL.equals(model)) { + return this.judgeWenXin4ResultSuccess(lineList); + } + return false; + } + + private boolean judgeGpt4ResultSuccess(List lineList) { + if (CollectionUtils.isEmpty(lineList)) { + return false; + } + for (String line : lineList) { + if (line.contains("Finished chain") || + line.toLowerCase().contains(G_E) || + line.toLowerCase().contains(G_V)) { + return true; + } + } + return false; + } + + private boolean judgeWenXin4ResultSuccess(List lineList) { + if (CollectionUtils.isEmpty(lineList)) { + return false; + } + for (String line : lineList) { + if (line.contains("```") || line.toLowerCase().contains(G_E) || + line.toLowerCase().contains(G_V)) { + return true; + } + } + return true; + } + + /** + * 输出error 信息 + * @param proc + * @return + */ + private void calculateError(List proc, String model) { + if (GPT_4_MODEL.equals(model)) { + this.calculateGpt4Error(proc); + } else if (WENXIN_4_MODEL.equals(model)) { + this.calculateWenXin4Error(proc); + } + } + + private void calculateGpt4Error(List proc) { + try { + StringBuilder sb = new StringBuilder(); + for (String line : proc) { + sb.append(line).append("\n"); + } + log.error("calculateError error {}", sb.toString()); + } catch (Exception e) { + log.error("calculateError error", e); + } + } + + private void calculateWenXin4Error(List proc) { + try { + StringBuilder sb = new StringBuilder(); + for (String line : proc) { + sb.append(line).append("\n"); + } + log.error("calculateError error {}", sb.toString()); + } catch (Exception e) { + log.error("calculateError error", e); + } + } + + /** + * 生成返回结果 + * @param query + * @param gremlin + * @return + */ + private ResponseLangChain generateResponseLangChain(String query, String gremlin) { + return ResponseLangChain.builder().gremlin(gremlin).query(query).build(); + } + + private void checkUserParam(RequestLangChainParams requestLangChainParams) { + E.checkNotNull(requestLangChainParams.getUserName(), "params username must not be null"); + E.checkNotNull(requestLangChainParams.getPassword(), "params password must not be null"); + } + private void checkParams(RequestLangChainParams requestLangChainParams) { + E.checkNotNull(requestLangChainParams, "params must not be null"); + E.checkNotNull(requestLangChainParams.getQuery(), "params query must not be null"); + E.checkNotNull(requestLangChainParams.getModel(), "params model must not be null"); + E.checkState(DEFAULT_MODEL.contains(requestLangChainParams.getModel()), "mode must be [\"wenxin4\", \"gpt4\"]"); + } + + private void checkModelParams(RequestLangChainParams requestLangChainParams) { + if (GPT_4_MODEL.equals(requestLangChainParams.getModel())) { + E.checkNotNull(requestLangChainParams.getOpenKey(), "params open_key must not be null"); + } + if (WENXIN_4_MODEL.equals(requestLangChainParams.getModel())) { + E.checkNotNull(requestLangChainParams.getErnieClientId(), "params ernie_client_id must not be null"); + E.checkNotNull(requestLangChainParams.getErnieClientSecret(), "params ernie_client_secret must not be null"); + } + } + + private String[] getExcuteArgs(String pythonPath, + String pythonScriptPath, + String query, + String openKey, + String graphSchema, + String model, + String ernieClientId, + String ernieClientSecret) { + List argsList = new ArrayList<>(); + argsList.add(pythonPath); + argsList.add(pythonScriptPath); + argsList.add("--query"); + argsList.add(query); + argsList.add("--graph_schema"); + argsList.add(graphSchema); + if (WENXIN_4_MODEL.equals(model)) { + if (ernieClientSecret != null) { + argsList.add("--ernie_client_secret"); + argsList.add(ernieClientSecret); + } + if (ernieClientId != null) { + argsList.add("--ernie_client_id"); + argsList.add(ernieClientId); + } + } else if (GPT_4_MODEL.equals(model)) { + if (openKey != null) { + argsList.add("--open_key"); + argsList.add(openKey); + } + } + argsList.add("--model"); + argsList.add(model); + return argsList.toArray(new String[argsList.size()]); + } + + private void checkParamsValid(GremlinQuery query) { + Ex.check(!StringUtils.isEmpty(query.getContent()), + "common.param.cannot-be-null-or-empty", + "gremlin-query.content"); + Ex.check(query.getContent().length() <= GremlinController.CONTENT_LENGTH_LIMIT, + "gremlin.statement.exceed-limit", GremlinController.CONTENT_LENGTH_LIMIT); + } + + private HashMap getBigModelSchema(List vertexLabels, List edgeLabels) { + List vertexLabelVoList = Lists.newArrayList(); + List edgeLabelVoList = Lists.newArrayList(); + List relationshipsList = Lists.newArrayList(); + if (CollectionUtils.isNotEmpty(vertexLabels)) { + for (VertexLabel vertexLabel : vertexLabels) { + VertexLabelVo vertexLabelVo = new VertexLabelVo(); + vertexLabelVo.setName(vertexLabel.name()); + vertexLabelVo.setPrimaryKeys(vertexLabel.primaryKeys()); + vertexLabelVo.setProperties(Lists.newArrayList()); + vertexLabelVo.getProperties().addAll(vertexLabel.properties()); + + vertexLabelVoList.add(vertexLabelVo); + } + } + + if (CollectionUtils.isNotEmpty(edgeLabels)) { + for (EdgeLabel edgeLabel : edgeLabels) { + EdgeLabelVo edgeLabelVo = new EdgeLabelVo(); + edgeLabelVo.setName(edgeLabel.name()); + edgeLabelVo.setProperties(Lists.newArrayList()); + edgeLabelVo.getProperties().addAll(edgeLabel.properties()); + + edgeLabelVoList.add(edgeLabelVo); + + relationshipsList.add(Relationship.getRelation(edgeLabel.sourceLabel(), + edgeLabel.name(), edgeLabel.targetLabel())); + } + } + + HashMap schema = new HashMap(); + schema.put("Node properties", vertexLabelVoList); + schema.put("Edge properties", edgeLabelVoList); + schema.put("Relationships", relationshipsList); + return schema; + } + + + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + static class RequestLangChainParams { + @JsonProperty("python_path") + private String pythonPath = "python"; + + @JsonProperty("file_name") + private String fileName = DEFAULT_PYTHON_FILE; + + @JsonProperty("query") + private String query; + + @JsonProperty("open_key") + private String openKey; + + + @JsonProperty("graph_schema") + private String graphSchema = ""; + + @JsonProperty("ernie_client_secret") + private String ernieClientSecret; + + @JsonProperty("ernie_client_id") + private String ernieClientId; + + @JsonProperty("model") + private String model = "wenxin4"; + + @JsonProperty("username") + private String userName; + + @JsonProperty("password") + private String password; + + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + static class ResponseLangChain { + @JsonProperty("query") + private String query; + + @JsonProperty("gremlin") + private String gremlin; + } + + + + @Data + static class VertexLabelVo { + + @JsonProperty("name") + private String name; + + @JsonProperty("primary_keys") + private List primaryKeys; + + @JsonProperty("properties") + private List properties; + } + + @Data + static class EdgeLabelVo { + @JsonProperty("name") + private String name; + + @JsonProperty("properties") + private List properties; + } + + static class Relationship { + public static String getRelation(String sourceLabel, String name, String targetLabel) { + return sourceLabel + "--" + name + "-->" + targetLabel; + + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileMappingController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileMappingController.java index 5614334e1..b783e23dc 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileMappingController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileMappingController.java @@ -18,20 +18,14 @@ package org.apache.hugegraph.controller.load; -import java.util.List; -import java.util.Set; - +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.enums.JobStatus; -import org.apache.hugegraph.entity.load.EdgeMapping; -import org.apache.hugegraph.entity.load.ElementMapping; -import org.apache.hugegraph.entity.load.FileMapping; -import org.apache.hugegraph.entity.load.FileSetting; -import org.apache.hugegraph.entity.load.JobManager; -import org.apache.hugegraph.entity.load.LoadParameter; -import org.apache.hugegraph.entity.load.VertexMapping; +import org.apache.hugegraph.entity.load.*; import org.apache.hugegraph.entity.schema.EdgeLabelEntity; import org.apache.hugegraph.entity.schema.VertexLabelEntity; import org.apache.hugegraph.exception.ExternalException; @@ -44,24 +38,15 @@ import org.apache.hugegraph.util.HubbleUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import com.baomidou.mybatisplus.core.metadata.IPage; - -import lombok.extern.log4j.Log4j2; +import java.util.List; +import java.util.Set; @Log4j2 @RestController -@RequestMapping(Constant.API_VERSION + - "graph-connections/{connId}/job-manager/{jobId}/file-mappings") +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/job-manager/{jobId}/file-mappings") public class FileMappingController extends BaseController { @Autowired @@ -74,7 +59,8 @@ public class FileMappingController extends BaseController { private JobManagerService jobService; @GetMapping - public IPage list(@PathVariable("connId") int connId, + public IPage list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("jobId") int jobId, @RequestParam(name = "page_no", required = false, @@ -84,7 +70,7 @@ public IPage list(@PathVariable("connId") int connId, required = false, defaultValue = "10") int pageSize) { - return this.service.list(connId, jobId, pageNo, pageSize); + return this.service.list(graphSpace, graph, jobId, pageNo, pageSize); } @GetMapping("{id}") @@ -145,14 +131,16 @@ public FileMapping fileSetting(@PathVariable("id") int id, } @PostMapping("{id}/vertex-mappings") - public FileMapping addVertexMapping(@PathVariable("connId") int connId, + public FileMapping addVertexMapping(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") int id, @RequestBody VertexMapping newEntity) { FileMapping mapping = this.service.get(id); if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } - this.checkVertexMappingValid(connId, newEntity, mapping); + HugeClient client = this.authClient(graphSpace, graph); + this.checkVertexMappingValid(client, newEntity, mapping); newEntity.setId(HubbleUtil.generateSimpleId()); mapping.getVertexMappings().add(newEntity); @@ -161,7 +149,8 @@ public FileMapping addVertexMapping(@PathVariable("connId") int connId, } @PutMapping("{id}/vertex-mappings/{vmid}") - public FileMapping updateVertexMapping(@PathVariable("connId") int connId, + public FileMapping updateVertexMapping(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") int id, @PathVariable("vmid") String vmId, @RequestBody VertexMapping newEntity) { @@ -169,7 +158,8 @@ public FileMapping updateVertexMapping(@PathVariable("connId") int connId, if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } - this.checkVertexMappingValid(connId, newEntity, mapping); + HugeClient client = this.authClient(graphSpace, graph); + this.checkVertexMappingValid(client, newEntity, mapping); VertexMapping vertexMapping = mapping.getVertexMapping(vmId); Ex.check(vertexMapping != null, @@ -195,21 +185,23 @@ public FileMapping deleteVertexMapping(@PathVariable("id") int id, boolean removed = mapping.getVertexMappings().remove(vertexMapping); if (!removed) { throw new ExternalException( - "load.file-mapping.vertex-mapping.not-exist.id", vmid); + "load.file-mapping.vertex-mapping.not-exist.id", vmid); } this.service.update(mapping); return mapping; } @PostMapping("{id}/edge-mappings") - public FileMapping addEdgeMapping(@PathVariable("connId") int connId, + public FileMapping addEdgeMapping(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") int id, @RequestBody EdgeMapping newEntity) { FileMapping mapping = this.service.get(id); if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } - this.checkEdgeMappingValid(connId, newEntity, mapping); + HugeClient client = this.authClient(graphSpace, graph); + this.checkEdgeMappingValid(client, newEntity, mapping); newEntity.setId(HubbleUtil.generateSimpleId()); mapping.getEdgeMappings().add(newEntity); @@ -218,7 +210,8 @@ public FileMapping addEdgeMapping(@PathVariable("connId") int connId, } @PutMapping("{id}/edge-mappings/{emid}") - public FileMapping updateEdgeMapping(@PathVariable("connId") int connId, + public FileMapping updateEdgeMapping(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") int id, @PathVariable("emid") String emId, @RequestBody EdgeMapping newEntity) { @@ -226,7 +219,8 @@ public FileMapping updateEdgeMapping(@PathVariable("connId") int connId, if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } - this.checkEdgeMappingValid(connId, newEntity, mapping); + HugeClient client = this.authClient(graphSpace, graph); + this.checkEdgeMappingValid(client, newEntity, mapping); EdgeMapping edgeMapping = mapping.getEdgeMapping(emId); Ex.check(edgeMapping != null, @@ -252,7 +246,7 @@ public FileMapping deleteEdgeMapping(@PathVariable("id") int id, boolean removed = mapping.getEdgeMappings().remove(edgeMapping); if (!removed) { throw new ExternalException( - "load.file-mapping.edge-mapping.not-exist.id", emid); + "load.file-mapping.edge-mapping.not-exist.id", emid); } this.service.update(mapping); return mapping; @@ -286,10 +280,11 @@ public JobManager nextStep(@PathVariable("jobId") int jobId) { return jobEntity; } - private void checkVertexMappingValid(int connId, VertexMapping vertexMapping, + private void checkVertexMappingValid(HugeClient client, + VertexMapping vertexMapping, FileMapping fileMapping) { VertexLabelEntity vl = this.vlService.get(vertexMapping.getLabel(), - connId); + client); Ex.check(!vl.getIdStrategy().isAutomatic(), "load.file-mapping.vertex.automatic-id-unsupported"); @@ -305,24 +300,24 @@ private void checkVertexMappingValid(int connId, VertexMapping vertexMapping, vl.getPrimaryKeys().size(), "load.file-mapping.vertex.id-fields-should-same-size-pks"); Ex.check(!CollectionUtils.containsAny( - vertexMapping.fieldMappingToMap().values(), - vl.getPrimaryKeys()), + vertexMapping.fieldMappingToMap().values(), + vl.getPrimaryKeys()), "load.file-mapping.vertex.mapping-fields-cannot-contains-pk"); } else { Ex.check(vertexMapping.getIdFields().size() == 1, "load.file-mapping.vertex.id-fields-should-only-one"); } Ex.check(CollectionUtil.allUnique( - vertexMapping.fieldMappingToMap().values()), + vertexMapping.fieldMappingToMap().values()), "load.file-mapping.mapping-fields-should-no-duplicate"); this.checkMappingValid(vertexMapping, fileMapping); } - private void checkEdgeMappingValid(int connId, EdgeMapping edgeMapping, + private void checkEdgeMappingValid(HugeClient client, EdgeMapping edgeMapping, FileMapping fileMapping) { - EdgeLabelEntity el = this.elService.get(edgeMapping.getLabel(), connId); - VertexLabelEntity source = this.vlService.get(el.getSourceLabel(), connId); - VertexLabelEntity target = this.vlService.get(el.getTargetLabel(), connId); + EdgeLabelEntity el = this.elService.get(edgeMapping.getLabel(), client); + VertexLabelEntity source = this.vlService.get(el.getSourceLabel(), client); + VertexLabelEntity target = this.vlService.get(el.getTargetLabel(), client); Ex.check(!source.getIdStrategy().isAutomatic(), "load.file-mapping.vertex.automatic-id-unsupported"); Ex.check(!target.getIdStrategy().isAutomatic(), @@ -341,7 +336,7 @@ private void checkEdgeMappingValid(int connId, EdgeMapping edgeMapping, "load.file-mapping.edge.target-fields-should-in-column-names", edgeMapping.getTargetFields(), columnNames); Ex.check(CollectionUtil.allUnique( - edgeMapping.fieldMappingToMap().values()), + edgeMapping.fieldMappingToMap().values()), "load.file-mapping.mapping-fields-should-no-duplicate"); this.checkMappingValid(edgeMapping, fileMapping); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileUploadController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileUploadController.java index d019549a4..c6a18053a 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileUploadController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileUploadController.java @@ -27,13 +27,26 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import org.apache.hugegraph.controller.BaseController; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.entity.enums.FileMappingStatus; @@ -49,23 +62,14 @@ import org.apache.hugegraph.util.Ex; import org.apache.hugegraph.util.FileUtil; import org.apache.hugegraph.util.HubbleUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; import lombok.extern.log4j.Log4j2; @Log4j2 @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/job-manager/{jobId}/upload-file") -public class FileUploadController { +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/job-manager/{jobId}/upload-file") +public class FileUploadController extends BaseController { @Autowired private HugeConfig config; @@ -75,8 +79,7 @@ public class FileUploadController { private JobManagerService jobService; @GetMapping("token") - public Map fileToken(@PathVariable("connId") int connId, - @PathVariable("jobId") int jobId, + public Map fileToken(@PathVariable("jobId") int jobId, @RequestParam("names") List fileNames) { Ex.check(CollectionUtil.allUnique(fileNames), @@ -94,7 +97,8 @@ public Map fileToken(@PathVariable("connId") int connId, } @PostMapping - public FileUploadResult upload(@PathVariable("connId") int connId, + public FileUploadResult upload(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("jobId") int jobId, @RequestParam("file") MultipartFile file, @RequestParam("name") String fileName, @@ -110,13 +114,14 @@ public FileUploadResult upload(@PathVariable("connId") int connId, JobManager jobEntity = this.jobService.get(jobId); Long sourceFileSize = this.resolveSourceFileSize(file, fileSize, total, index); - this.checkFileValid(jobId, jobEntity, file, fileName); + this.checkFileValid(graphSpace, graph, jobId, jobEntity, file, fileName); if (jobEntity.getJobStatus() == JobStatus.DEFAULT) { jobEntity.setJobStatus(JobStatus.UPLOADING); this.jobService.update(jobEntity); } // Ensure location exist and generate file path - String filePath = this.generateFilePath(connId, jobId, fileName); + String filePath = this.generateFilePath(graphSpace, graph, jobId, + fileName); // Check this file deleted before ReadWriteLock lock = this.uploadingTokenLocks().get(token); FileUploadResult result; @@ -133,7 +138,7 @@ public FileUploadResult upload(@PathVariable("connId") int connId, try { FileMapping reservedMapping; synchronized (this.service) { - reservedMapping = this.reserveUploadQuota(connId, jobId, + reservedMapping = this.reserveUploadQuota(graphSpace, graph, jobId, fileName, filePath, sourceFileSize); } @@ -142,7 +147,9 @@ public FileUploadResult upload(@PathVariable("connId") int connId, return result; } synchronized (this.service) { - FileMapping mapping = this.service.get(connId, jobId, fileName); + // Verify the existence of fragmented files + FileMapping mapping = this.service.get(graphSpace, graph, jobId, + fileName); if (mapping == null) { mapping = reservedMapping; } @@ -203,7 +210,8 @@ public FileUploadResult upload(@PathVariable("connId") int connId, } @DeleteMapping - public Boolean delete(@PathVariable("connId") int connId, + public Boolean delete(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("jobId") int jobId, @RequestParam("name") String fileName, @RequestParam("token") String token) { @@ -214,7 +222,8 @@ public Boolean delete(@PathVariable("connId") int connId, jobEntity.getJobStatus() == JobStatus.MAPPING || jobEntity.getJobStatus() == JobStatus.SETTING, "deleted.file.no-permission"); - FileMapping mapping = this.service.get(connId, jobId, fileName); + FileMapping mapping = this.service.get(graphSpace, graph, jobId, + fileName); Ex.check(mapping != null, "load.file-mapping.not-exist.name", fileName); ReadWriteLock lock = this.uploadingTokenLocks().get(token); @@ -279,8 +288,9 @@ private void checkFileNameValid(String fileName) { "load.upload.file.name.invalid"); } - private void checkFileValid(int jobId, JobManager jobEntity, - MultipartFile file, String fileName) { + private void checkFileValid(String graphSpace, String graph, int jobId, + JobManager jobEntity, MultipartFile file, + String fileName) { Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Ex.check(jobEntity.getJobStatus() == JobStatus.DEFAULT || jobEntity.getJobStatus() == JobStatus.UPLOADING || @@ -293,19 +303,29 @@ private void checkFileValid(int jobId, JobManager jobEntity, log.debug("File content type: {}", file.getContentType()); String format = FilenameUtils.getExtension(fileName); - List formatWhiteList = this.config.get( - HubbleOptions.UPLOAD_FILE_FORMAT_LIST); - Ex.check(formatWhiteList.contains(format), + Ex.check(StringUtils.isNotBlank(format), "load.upload.file.format.unsupported"); + List formatWhiteList = this.config.get( + HubbleOptions.UPLOAD_FILE_FORMAT_LIST); + String normalizedFormat = format.toLowerCase(Locale.ROOT); + boolean supported = formatWhiteList != null && + formatWhiteList.stream() + .filter(StringUtils::isNotBlank) + .map(String::trim) + .map(item -> item.toLowerCase(Locale.ROOT)) + .anyMatch(normalizedFormat::equals); + Ex.check(supported, "load.upload.file.format.unsupported"); } - private FileMapping reserveUploadQuota(int connId, int jobId, + private FileMapping reserveUploadQuota(String graphSpace, String graph, + int jobId, String fileName, String filePath, Long sourceFileSize) { JobManager currentJob = this.jobService.get(jobId); Ex.check(currentJob != null, "job-manager.not-exist.id", jobId); - FileMapping mapping = this.service.get(connId, jobId, fileName); + FileMapping mapping = this.service.get(graphSpace, graph, jobId, + fileName); Ex.check(mapping == null || mapping.getFileStatus() == FileMappingStatus.UPLOADING, "load.upload.file.existed", fileName); @@ -319,7 +339,7 @@ private FileMapping reserveUploadQuota(int connId, int jobId, reservedUploadingSize); if (mapping == null) { - mapping = new FileMapping(connId, fileName, filePath); + mapping = new FileMapping(graphSpace, graph, fileName, filePath); mapping.setJobId(jobId); this.fillUploadingReservation(mapping, reservedFileSize); this.service.save(mapping); @@ -356,13 +376,13 @@ private void checkFileSizeLimit(long fileSize, long currentJobSize, Ex.check(fileSize > 0L, "load.upload.file.cannot-be-empty"); long singleFileSizeLimit = this.config.get( - HubbleOptions.UPLOAD_SINGLE_FILE_SIZE_LIMIT); + HubbleOptions.UPLOAD_SINGLE_FILE_SIZE_LIMIT); Ex.check(fileSize <= singleFileSizeLimit, "load.upload.file.exceed-single-size", FileUtils.byteCountToDisplaySize(singleFileSizeLimit)); long totalFileSizeLimit = this.config.get( - HubbleOptions.UPLOAD_TOTAL_FILE_SIZE_LIMIT); + HubbleOptions.UPLOAD_TOTAL_FILE_SIZE_LIMIT); long totalReservedSize = this.safeAdd(this.safeAdd(fileSize, currentJobSize), reservedUploadingSize); @@ -445,10 +465,11 @@ private long safeAdd(long left, long right) { } } - private String generateFilePath(int connId, int jobId, String fileName) { + private String generateFilePath(String graphSpace, String graph, int jobId, + String fileName) { String location = this.config.get(HubbleOptions.UPLOAD_FILE_LOCATION); - String path = Paths.get(CONN_PREIFX + connId, JOB_PREIFX + jobId) - .toString(); + String path = Paths.get(CONN_PREIFX + graphSpace + "-" + graph, + JOB_PREIFX + jobId).toString(); this.ensureLocationExist(location, path); // Before merge: upload-files/conn-1/verson_person.csv/part-1 // After merge: upload-files/conn-1/file-mapping-1/verson_person.csv diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/JobManagerController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/JobManagerController.java index 12ccaa414..369cc4b68 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/JobManagerController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/JobManagerController.java @@ -18,9 +18,8 @@ package org.apache.hugegraph.controller.load; -import java.util.ArrayList; -import java.util.List; - +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.common.Response; @@ -38,23 +37,15 @@ import org.apache.hugegraph.util.Ex; import org.apache.hugegraph.util.HubbleUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import com.baomidou.mybatisplus.core.metadata.IPage; - -import lombok.extern.log4j.Log4j2; +import java.util.ArrayList; +import java.util.List; @Log4j2 @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/job-manager") +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/job-manager") public class JobManagerController { private static final int LIMIT = 500; @@ -71,27 +62,29 @@ public JobManagerController(JobManagerService service) { } @PostMapping - public JobManager create(@PathVariable("connId") int connId, + public JobManager create(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody JobManager entity) { synchronized (this.service) { Ex.check(entity.getJobName().length() <= 48, "job.manager.job-name.reached-limit"); Ex.check(entity.getJobName() != null, () -> - Constant.COMMON_NAME_PATTERN.matcher( - entity.getJobName()).matches(), + Constant.COMMON_NAME_PATTERN.matcher( + entity.getJobName()).matches(), "job.manager.job-name.unmatch-regex"); Ex.check(entity.getJobRemarks().length() <= 200, "job.manager.job-remarks.reached-limit"); Ex.check(!StringUtils.isEmpty(entity.getJobRemarks()), () -> - Constant.COMMON_REMARK_PATTERN.matcher( - entity.getJobRemarks()).matches(), + Constant.COMMON_REMARK_PATTERN.matcher( + entity.getJobRemarks()).matches(), "job.manager.job-remarks.unmatch-regex"); Ex.check(this.service.count() < LIMIT, "job.manager.reached-limit", LIMIT); - if (this.service.getTask(entity.getJobName(), connId) != null) { + if (this.service.getTask(entity.getJobName(), graphSpace, graph) != null) { throw new InternalException("job.manager.job-name.repeated"); } - entity.setConnId(connId); + entity.setGraphSpace(graphSpace); + entity.setGraph(graph); entity.setJobStatus(JobStatus.DEFAULT); entity.setJobDuration(0L); entity.setJobSize(0L); @@ -117,41 +110,44 @@ public JobManager get(@PathVariable("id") int id) { } @GetMapping("ids") - public List list(@PathVariable("connId") int connId, + public List list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam("job_ids") List jobIds) { - return this.service.list(connId, jobIds); + return this.service.list(graphSpace, graph, jobIds); } @GetMapping - public IPage list(@PathVariable("connId") int connId, + public IPage list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam(name = "page_no", required = false, defaultValue = "1") - int pageNo, + int pageNo, @RequestParam(name = "page_size", required = false, defaultValue = "10") - int pageSize, + int pageSize, @RequestParam(name = "content", required = false, defaultValue = "") - String content) { - return this.service.list(connId, pageNo, pageSize, content); + String content) { + return this.service.list(graphSpace, graph, pageNo, pageSize, content); } @PutMapping("{id}") - public JobManager update(@PathVariable("connId") int connId, + public JobManager update(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") int id, @RequestBody JobManager newEntity) { Ex.check(newEntity.getJobName().length() <= 48, "job.manager.job-name.reached-limit"); Ex.check(newEntity.getJobName() != null, () -> - Constant.COMMON_NAME_PATTERN.matcher( - newEntity.getJobName()).matches(), + Constant.COMMON_NAME_PATTERN.matcher( + newEntity.getJobName()).matches(), "job.manager.job-name.unmatch-regex"); Ex.check(!StringUtils.isEmpty(newEntity.getJobRemarks()), () -> - Constant.COMMON_REMARK_PATTERN.matcher( - newEntity.getJobRemarks()).matches(), + Constant.COMMON_REMARK_PATTERN.matcher( + newEntity.getJobRemarks()).matches(), "job.manager.job-remarks.unmatch-regex"); // Check exist Job Manager with this id JobManager entity = this.service.get(id); @@ -159,7 +155,7 @@ public JobManager update(@PathVariable("connId") int connId, throw new ExternalException("job-manager.not-exist.id", id); } if (!newEntity.getJobName().equals(entity.getJobName()) && - this.service.getTask(newEntity.getJobName(), connId) != null) { + this.service.getTask(newEntity.getJobName(), graphSpace, graph) != null) { throw new InternalException("job.manager.job-name.repeated"); } entity.setJobName(newEntity.getJobName()); @@ -169,7 +165,8 @@ public JobManager update(@PathVariable("connId") int connId, } @GetMapping("{id}/reason") - public Response reason(@PathVariable("connId") int connId, + public Response reason(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") int id) { JobManager job = this.service.get(id); if (job == null) { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/LoadTaskController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/LoadTaskController.java index b4862bf5b..43b8fb422 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/LoadTaskController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/LoadTaskController.java @@ -18,51 +18,45 @@ package org.apache.hugegraph.controller.load; -import java.util.ArrayList; -import java.util.List; - +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.extern.log4j.Log4j2; import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.common.Response; +import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.GraphConnection; import org.apache.hugegraph.entity.enums.JobStatus; import org.apache.hugegraph.entity.load.FileMapping; import org.apache.hugegraph.entity.load.JobManager; import org.apache.hugegraph.entity.load.LoadTask; import org.apache.hugegraph.exception.ExternalException; -import org.apache.hugegraph.service.GraphConnectionService; +import org.apache.hugegraph.options.HubbleOptions; import org.apache.hugegraph.service.load.FileMappingService; import org.apache.hugegraph.service.load.JobManagerService; import org.apache.hugegraph.service.load.LoadTaskService; import org.apache.hugegraph.util.Ex; import org.apache.hugegraph.util.HubbleUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import com.baomidou.mybatisplus.core.metadata.IPage; - -import lombok.extern.log4j.Log4j2; +import java.util.ArrayList; +import java.util.List; @Log4j2 @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/job-manager/{jobId}/load-tasks") +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/job-manager/{jobId}/load-tasks") public class LoadTaskController extends BaseController { private static final int LIMIT = 500; - @Autowired - private GraphConnectionService connService; @Autowired private FileMappingService fmService; @Autowired private JobManagerService jobService; + @Autowired + private HugeConfig config; private final LoadTaskService service; @@ -72,7 +66,8 @@ public LoadTaskController(LoadTaskService service) { } @GetMapping - public IPage list(@PathVariable("connId") int connId, + public IPage list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("jobId") int jobId, @RequestParam(name = "page_no", required = false, @@ -82,13 +77,14 @@ public IPage list(@PathVariable("connId") int connId, required = false, defaultValue = "10") int pageSize) { - return this.service.list(connId, jobId, pageNo, pageSize); + return this.service.list(graphSpace, graph, jobId, pageNo, pageSize); } @GetMapping("ids") - public List list(@PathVariable("connId") int connId, + public List list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam("task_ids") List taskIds) { - return this.service.list(connId, taskIds); + return this.service.list(graphSpace, graph, taskIds); } @GetMapping("{id}") @@ -101,7 +97,8 @@ public LoadTask get(@PathVariable("id") int id) { } @PostMapping - public LoadTask create(@PathVariable("connId") int connId, + public LoadTask create(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("jobId") int jobId, @RequestBody LoadTask entity) { JobManager jobEntity = this.jobService.get(jobId); @@ -111,7 +108,8 @@ public LoadTask create(@PathVariable("connId") int connId, synchronized (this.service) { Ex.check(this.service.count() < LIMIT, "load.task.reached-limit", LIMIT); - entity.setConnId(connId); + entity.setGraphSpace(graphSpace); + entity.setGraph(graph); this.service.save(entity); } return entity; @@ -127,14 +125,20 @@ public void delete(@PathVariable("id") int id) { } @PostMapping("start") - public List start(@PathVariable("connId") int connId, + public List start(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("jobId") int jobId, @RequestParam("file_mapping_ids") List fileIds) { - GraphConnection connection = this.connService.get(connId); - if (connection == null) { - throw new ExternalException("graph-connection.not-exist.id", connId); - } + GraphConnection connection = new GraphConnection(); + + connection.setCluster(config.get(HubbleOptions.PD_CLUSTER)); + connection.setRouteType(config.get(HubbleOptions.ROUTE_TYPE)); + connection.setPdPeers(config.get(HubbleOptions.PD_PEERS)); + connection.setGraphSpace(graphSpace); + connection.setGraph(graph); + connection.setToken(this.getToken()); + JobManager jobEntity = this.jobService.get(jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Ex.check(jobEntity.getJobStatus() == JobStatus.SETTING, @@ -142,13 +146,14 @@ public List start(@PathVariable("connId") int connId, boolean existError = false; try { List tasks = new ArrayList<>(); + HugeClient client = this.authClient(graphSpace, graph); for (Integer fileId : fileIds) { FileMapping fileMapping = this.fmService.get(fileId); if (fileMapping == null) { throw new ExternalException("file-mapping.not-exist.id", fileId); } - tasks.add(this.service.start(connection, fileMapping)); + tasks.add(this.service.start(connection, fileMapping, client)); } return tasks; } catch (Exception e) { @@ -166,13 +171,8 @@ public List start(@PathVariable("connId") int connId, } @PostMapping("pause") - public LoadTask pause(@PathVariable("connId") int connId, - @PathVariable("jobId") int jobId, + public LoadTask pause(@PathVariable("jobId") int jobId, @RequestParam("task_id") int taskId) { - GraphConnection connection = this.connService.get(connId); - if (connection == null) { - throw new ExternalException("graph-connection.not-exist.id", connId); - } JobManager jobEntity = this.jobService.get(jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Ex.check(jobEntity.getJobStatus() == JobStatus.LOADING, @@ -187,13 +187,8 @@ public LoadTask pause(@PathVariable("connId") int connId, } @PostMapping("resume") - public LoadTask resume(@PathVariable("connId") int connId, - @PathVariable("jobId") int jobId, + public LoadTask resume(@PathVariable("jobId") int jobId, @RequestParam("task_id") int taskId) { - GraphConnection connection = this.connService.get(connId); - if (connection == null) { - throw new ExternalException("graph-connection.not-exist.id", connId); - } JobManager jobEntity = this.jobService.get(jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Ex.check(jobEntity.getJobStatus() == JobStatus.LOADING, @@ -208,13 +203,8 @@ public LoadTask resume(@PathVariable("connId") int connId, } @PostMapping("stop") - public LoadTask stop(@PathVariable("connId") int connId, - @PathVariable("jobId") int jobId, + public LoadTask stop(@PathVariable("jobId") int jobId, @RequestParam("task_id") int taskId) { - GraphConnection connection = this.connService.get(connId); - if (connection == null) { - throw new ExternalException("graph-connection.not-exist.id", connId); - } JobManager jobEntity = this.jobService.get(jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Ex.check(jobEntity.getJobStatus() == JobStatus.LOADING, @@ -229,13 +219,8 @@ public LoadTask stop(@PathVariable("connId") int connId, } @PostMapping("retry") - public LoadTask retry(@PathVariable("connId") int connId, - @PathVariable("jobId") int jobId, + public LoadTask retry(@PathVariable("jobId") int jobId, @RequestParam("task_id") int taskId) { - GraphConnection connection = this.connService.get(connId); - if (connection == null) { - throw new ExternalException("graph-connection.not-exist.id", connId); - } JobManager jobEntity = this.jobService.get(jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Ex.check(jobEntity.getJobStatus() == JobStatus.LOADING, @@ -244,14 +229,13 @@ public LoadTask retry(@PathVariable("connId") int connId, return this.service.retry(taskId); } finally { jobEntity.setJobStatus(JobStatus.LOADING); - jobEntity.setUpdateTime(HubbleUtil.nowDate()); + jobEntity.setUpdateTime( HubbleUtil.nowDate()); this.jobService.update(jobEntity); } } @GetMapping("{id}/reason") - public Response reason(@PathVariable("connId") int connId, - @PathVariable("jobId") int jobId, + public Response reason(@PathVariable("jobId") int jobId, @PathVariable("id") int id) { LoadTask task = this.service.get(id); if (task == null) { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/AuditController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/AuditController.java new file mode 100644 index 000000000..c3f40f9c0 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/AuditController.java @@ -0,0 +1,91 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +//package org.apache.hugegraph.controller.op; +// TODO RECOVER WHEN EVALUATED +//import lombok.SneakyThrows; +//import org.apache.hugegraph.common.Constant; +//import org.apache.hugegraph.controller.BaseController; +//import org.apache.hugegraph.entity.op.AuditEntity; +//import org.apache.hugegraph.exception.InternalException; +//import org.apache.hugegraph.logger.AuditOperationEnum; +//import org.apache.hugegraph.service.op.AuditService; +//import org.apache.hugegraph.util.JsonUtil; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.*; +// +//import javax.servlet.http.HttpServletResponse; +//import java.io.IOException; +//import java.io.OutputStream; +//import java.nio.charset.StandardCharsets; +//import java.util.Arrays; +//import java.util.List; +//import java.util.stream.Collectors; +// +//@RestController +//@RequestMapping(Constant.API_VERSION + "audits") +//public class AuditController extends BaseController { +// @Autowired +// AuditService auditService; +// +// @GetMapping("operations/list") +// public Object listOperations() { +// List operations = Arrays.stream(AuditOperationEnum.values()) +// .map(AuditOperationEnum::getName) +// .collect(Collectors.toList()); +// +// return operations; +// } +// +// @GetMapping("services/list") +// public Object listServices() throws IOException { +// List operations = auditService.listServices(); +// +// return operations; +// } +// +// @SneakyThrows +// @PostMapping("query") +// public Object query(@RequestBody AuditService.AuditReq auditReq) { +// return auditService.queryPage(auditReq); +// } +// +// @PostMapping("export") +// public void export(HttpServletResponse response, +// @RequestBody AuditService.AuditReq auditReq) { +// String fileName = String.format("audit.txt", auditReq.startDatetime, +// auditReq.endDatetime); +// +// response.setCharacterEncoding("UTF-8"); +// response.setContentType("application/octet-stream"); +// response.setHeader("Access-Control-Expose-Headers", +// "Content-Disposition"); +// response.setHeader("Content-Disposition", +// "attachment;filename=" + fileName); +// try { +// OutputStream os = response.getOutputStream(); +// for (AuditEntity auditEntity : auditService.export(auditReq)) { +// os.write((JsonUtil.toJson(auditEntity) + "\n") +// .getBytes(StandardCharsets.UTF_8)); +// } +// os.close(); +// } catch (IOException e) { +// throw new InternalException("Audit Log Write Error", e); +// } +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/DashboardController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/DashboardController.java new file mode 100644 index 000000000..07d80961d --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/DashboardController.java @@ -0,0 +1,53 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.op; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.util.E; + +@RestController +@RequestMapping(Constant.API_VERSION + "dashboard") +public class DashboardController extends BaseController { + @Autowired + private HugeConfig config; + + @GetMapping + public Map listOperations() { + String address = config.get(HubbleOptions.DASHBOARD_ADDRESS); + E.checkArgument(StringUtils.isNotEmpty(address), + "Please set 'dashboard.address' in config file " + + "conf/hugegraph-hubble.properties."); + + Map result = new HashMap<>(); + result.put("address", address); + return result; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/HStoreController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/HStoreController.java new file mode 100644 index 000000000..d01664029 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/HStoreController.java @@ -0,0 +1,156 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.op; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import lombok.extern.log4j.Log4j2; +import org.apache.hugegraph.service.space.HStoreService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.structure.space.HStoreNodeInfo; +import org.apache.hugegraph.util.E; +import org.apache.hugegraph.exception.ExternalException; + +@Log4j2 +@RestController +@RequestMapping(Constant.API_VERSION + "services/storage") +public class HStoreController extends BaseController { + + @Autowired + HStoreService hStoreService; + + @GetMapping + public Object listPage(@RequestParam(name = "page_no", required = false, + defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", required = false, + defaultValue = "10") int pageSize) { + + HugeClient client = this.authClient(null, null); + return hStoreService.listPage(client, pageNo, pageSize); + } + + @GetMapping("nodes/{id}") + public Object get(@PathVariable("id") String id) { + HugeClient client = this.authClient(null, null); + E.checkNotNull(id, "id"); + + List partitions = + client.hStoreManager().get(id).hStorePartitionInfoList(); + return ImmutableMap.of("shards", partitions); + } + + /** + * + * @return the status of sotre cluster + * "Cluster_OK": "正常", + * "Batch_import_Mode": "单副本入库模式" + * "Partition_Split": "数据分裂中" + * "Cluster_Not_Ready": "集群未就绪" + * "Cluster_Fault": "集群异常" + */ + @GetMapping("status") + public Object status() { + HugeClient client = this.authClient(null, null); + String status = client.hStoreManager().status(); + + return ImmutableMap.of("status", status); + } + + /** + * Trigger the store cluster to start splitting + */ + @GetMapping("split") + public void triggerSplit() { + HugeClient client = this.authClient(null, null); + client.hStoreManager().startSplit(); + } + + /** + * startup list of servers to be respecified by params + * @param request {"nodes": ["node_id1", ]} + */ + @PostMapping("nodes/startup") + public void nodesStartup(@RequestBody Map> request) { + List nodes = request.getOrDefault("nodes", ImmutableList.of()); + + E.checkNotEmpty(nodes, "nodes"); + + HugeClient client = this.authClient(null, null); + + List successNodes = new ArrayList<>(); + + for(String nodeId: nodes) { + try { + client.hStoreManager().nodeStartup(nodeId); + } catch (RuntimeException e) { + log.info("startup hstore node({}) success", successNodes); + log.warn("startup hstore node({}) error", nodeId, e); + String msg = String.format("shutdown(%s) error: %s", nodeId, + e.getMessage()); + throw new ExternalException(msg, e); + } + + successNodes.add(nodeId); + } + } + + /** + * startup list of servers to be respecified by params + * @param request + */ + @PostMapping("nodes/shutdown") + public void nodesShutdown(@RequestBody Map> request) { + List nodes = request.getOrDefault("nodes", ImmutableList.of()); + + E.checkNotEmpty(nodes, "nodes"); + + HugeClient client = this.authClient(null, null); + + List successNodes = new ArrayList<>(); + + for(String nodeId: nodes) { + try { + client.hStoreManager().nodeShutdown(nodeId); + } catch (RuntimeException e) { + log.info("shutdown hstore node({}) success", successNodes); + log.warn("shutdown hstore node({}) error", nodeId, e); + String msg = String.format("shutdown(%s) error: %s", nodeId, + e.getMessage()); + throw new ExternalException(msg, e); + } + + successNodes.add(nodeId); + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/K8sTokenController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/K8sTokenController.java new file mode 100644 index 000000000..35636b088 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/K8sTokenController.java @@ -0,0 +1,87 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.op; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.exception.InternalException; +import com.google.common.collect.ImmutableMap; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Log4j2 +@RestController +@RequestMapping(Constant.API_VERSION + "k8s/token") +public class K8sTokenController extends BaseController { + + @Autowired + private ApplicationArguments arguments; + + private Path fileDir() { + String[] args = this.arguments.getSourceArgs(); + if (args.length == 1) { + return new File(args[0]).getAbsoluteFile().getParentFile().toPath(); + } + + return null; + } + + @GetMapping + public Object getK8sToken() { + + Path configDir = fileDir(); + + if (null == configDir) { + throw new InternalException("K8s Token文件不存在"); + } + + Path tokenFile = Paths.get(configDir.toString(), "k8s.token"); + + if (Files.exists(tokenFile)) { + try { + List lines = Files.readAllLines(tokenFile, + StandardCharsets.UTF_8); + return ImmutableMap.of("token", String.join("", lines)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + throw new InternalException("K8s Token文件不存在"); + } + + @GetMapping("dir") + public Object getK8sToken1() { + + Path configDir = fileDir(); + return ImmutableMap.of("token", configDir.toString()); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/LogController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/LogController.java new file mode 100644 index 000000000..f8148d966 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/LogController.java @@ -0,0 +1,98 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.op; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.google.common.collect.ImmutableMap; +import lombok.SneakyThrows; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.entity.op.LogEntity; +import org.apache.hugegraph.exception.InternalException; +import org.apache.hugegraph.service.op.LogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; + +@RestController +@RequestMapping(Constant.API_VERSION + "logs") +public class LogController extends BaseController { + @Autowired + LogService logService; + + @SneakyThrows + @GetMapping("services/list") + public Object listServices() { + List services = logService.listServices(); + + return ImmutableMap.of("services", services); + } + + @SneakyThrows + @GetMapping("hosts/list") + public Object listHosts() { + List hosts = logService.listHosts(); + + return ImmutableMap.of("hosts", hosts); + } + + @GetMapping("levels/list") + public Object listLevels() { + List levels = Arrays.asList(LogService.LEVELS); + + return ImmutableMap.of("levels", levels); + } + + @SneakyThrows + @PostMapping("query") + public IPage query(@RequestBody LogService.LogReq logReq) { + return logService.queryPage(logReq); + } + + @SneakyThrows + @PostMapping("export") + public void export(HttpServletResponse response, + @RequestBody LogService.LogReq logReq) { + String fileName = String.format("log.txt", logReq.startDatetime, + logReq.endDatetime); + + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Expose-Headers", + "Content-Disposition"); + response.setHeader("Content-Disposition", + "attachment;filename=" + fileName); + try { + OutputStream os = response.getOutputStream(); + for(LogEntity logEntity : logService.export(logReq)) { + os.write((logEntity.getMessage() + "\n") + .getBytes(StandardCharsets.UTF_8)); + } + os.close(); + } catch (IOException e) { + throw new InternalException("Log Write Error", e); + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/MonitorController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/MonitorController.java new file mode 100644 index 000000000..c0f8dc524 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/MonitorController.java @@ -0,0 +1,57 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.op; + +import com.google.common.collect.ImmutableMap; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.util.E; + +@RestController +@RequestMapping(Constant.API_VERSION + "monitor") +public class MonitorController extends BaseController { + + @Autowired + private HugeConfig config; + + @GetMapping + public Object monitor() { + String monitorURL = null; + // Get monitor.url from system.env + monitorURL = System.getenv(HubbleOptions.MONITOR_URL.name()); + if (StringUtils.isEmpty(monitorURL)) { + // get monitor.url from file: hugegraph-hubble.properties + monitorURL = config.get(HubbleOptions.MONITOR_URL); + } + + E.checkArgument(StringUtils.isNotEmpty(monitorURL), + "Please set \"monitor.url\" in system environments " + + "or config file(hugegraph-hubble.properties)."); + + return ImmutableMap.of("url", monitorURL); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/PDController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/PDController.java new file mode 100644 index 000000000..bbf8c9827 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/PDController.java @@ -0,0 +1,38 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.op; + +import org.apache.hugegraph.driver.HugeClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; + +@RestController +@RequestMapping(Constant.API_VERSION + "pds") +public class PDController extends BaseController { + + @GetMapping("status") + public Object status() { + HugeClient client = this.authClient(null, null); + return client.pdManager().status(); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/ApplicationInfoController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/ApplicationInfoController.java new file mode 100644 index 000000000..ae7daee36 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/ApplicationInfoController.java @@ -0,0 +1,118 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.query; + +import org.apache.hugegraph.common.AppType; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.controller.saas.SaaSMetricsController; +import org.apache.hugegraph.entity.query.ApplicationInfo; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.service.query.ApplicationInfoService; +import org.apache.hugegraph.util.E; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping(Constant.API_VERSION + + "graphspaces/{graphspace}/graphs/{graph}/applications") +public class ApplicationInfoController extends BaseController { + @Autowired + private ApplicationInfoService appInfoService; + + @Autowired + private HugeConfig config; + + + @PostMapping + public ApplicationInfo insertOrUpdateAppInfo( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody ApplicationInfo appInfo) { + appInfo.setGraphName(join(config.get(HubbleOptions.IDC), graphSpace, graph)); + checkParams(appInfo, graphSpace); + appInfoService.insertOrUpdateAppInfo(appInfo); + return appInfo; + } + + @GetMapping + public List list( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph) { + String idc = config.get(HubbleOptions.IDC); + //query apps from database + List apps = + appInfoService.query(join(idc, graphSpace, graph)); + + // add three default apps + apps.add(SaaSMetricsController.defaultGremlinApp(idc, graphSpace, graph)); + apps.add(SaaSMetricsController.defaultVertexUpdateApp(idc, graphSpace, graph)); + apps.add(SaaSMetricsController.defaultEdgeUpdateApp(idc, graphSpace, graph)); + return apps; + } + + @GetMapping("/{appName}/{appType}") + public ApplicationInfo appInfo( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("appName") String appName, + @PathVariable("appType") String appType) { + String idc = config.get(HubbleOptions.IDC); + if (AppType.GENERAL.name().equals(appType) && "GREMLIN".equals(appName)) { + return SaaSMetricsController.defaultGremlinApp(idc, graphSpace, graph); + } + if (AppType.GENERAL.name().equals(appType) && "VERTEX-UPDATE".equals(appName)) { + return SaaSMetricsController.defaultVertexUpdateApp(idc, graphSpace, graph); + } + if (AppType.GENERAL.name().equals(appType) && "EDGE-UPDATE".equals(appName)) { + return SaaSMetricsController.defaultEdgeUpdateApp(idc, graphSpace, graph); + } + + List apps = + appInfoService.query(join(idc, graphSpace, graph), appName, appType); + assert apps != null && apps.size() == 1; + return apps.get(0); + } + + @DeleteMapping("/{appName}/{appType}") + public void delete(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("appName") String appName, + @PathVariable("appType") String appType) { + appInfoService.delete( + join(config.get(HubbleOptions.IDC), graphSpace, graph), appName, appType); + } + + private void checkParams(ApplicationInfo appInfo, String graphspace) { + E.checkArgument( + appInfo.getGraphName() != null && + appInfo.getAppType() != null && + appInfo.getAppName() != null && + appInfo.getCountQuery() != null && + appInfo.getDistributionQuery() != null, + "application info each filed can not be null!"); + } + + private static String join(String idc, String graphSpace, String graph) { + return String.join("-", idc, graphSpace, graph); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/CypherController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/CypherController.java new file mode 100644 index 000000000..e98272cb6 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/CypherController.java @@ -0,0 +1,143 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.query; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.enums.AsyncTaskStatus; +import org.apache.hugegraph.entity.enums.ExecuteStatus; +import org.apache.hugegraph.entity.enums.ExecuteType; +import org.apache.hugegraph.entity.query.ExecuteHistory; +import org.apache.hugegraph.entity.query.GremlinQuery; +import org.apache.hugegraph.entity.query.GremlinResult; +import org.apache.hugegraph.service.query.ExecuteHistoryService; +import org.apache.hugegraph.service.query.QueryService; +import org.apache.hugegraph.util.Ex; +import org.apache.hugegraph.util.HubbleUtil; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.StopWatch; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Log4j2 +@RestController +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/cypher") +public class CypherController extends GremlinController { + @Autowired + private ExecuteHistoryService historyService; + + @Autowired + private QueryService queryService; + + @GetMapping + public GremlinResult execute(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestParam(name = "cypher") String query) { + this.checkParamsValid(query); + + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.CYPHER, query, + status, AsyncTaskStatus.UNKNOWN, + -1L, createTime); + this.historyService.save(history); + + StopWatch timer = StopWatch.createStarted(); + try { + HugeClient client = this.authClient(graphSpace, graph); + GremlinResult result = + this.queryService.executeCypherQuery(client, query); + status = ExecuteStatus.SUCCESS; + return result; + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + + } + + @PostMapping("async-task") + public Map executeAsyncTask( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody GremlinQuery query) { + this.checkParamsValid(query.getContent()); + + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.ASYNC_TASK_RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.CYPHER_ASYNC, + query.getContent(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + + StopWatch timer = StopWatch.createStarted(); + long asyncId = 0L; + Map result = new HashMap<>(3); + try { + HugeClient client = this.authClient(graphSpace, graph); + asyncId = this.queryService.executeCypherAsyncTask(client, query.getContent()); + status = ExecuteStatus.ASYNC_TASK_SUCCESS; + result.put("task_id", asyncId); + result.put("execute_status", status); + return result; + } catch (Throwable e) { + status = ExecuteStatus.ASYNC_TASK_FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + history.setAsyncId(asyncId); + this.historyService.update(history); + } + } + + private void checkParamsValid(String query) { + Ex.check(!StringUtils.isEmpty(query), + "common.param.cannot-be-null-or-empty", + "gremlin-query.content"); + checkContentLength(query); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/EditElementHistoryController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/EditElementHistoryController.java new file mode 100644 index 000000000..4f1bec674 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/EditElementHistoryController.java @@ -0,0 +1,260 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.query; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.query.ElementEditHistory; +import org.apache.hugegraph.entity.query.GremlinQuery; +import org.apache.hugegraph.entity.query.GremlinResult; +import org.apache.hugegraph.service.query.EditElementHistoryService; +import org.apache.hugegraph.structure.GraphElement; +import org.apache.hugegraph.structure.SchemaElement; +import org.apache.hugegraph.structure.graph.Edge; +import org.apache.hugegraph.structure.graph.Vertex; +import org.apache.hugegraph.structure.schema.EdgeLabel; +import org.apache.hugegraph.structure.schema.VertexLabel; +import org.apache.hugegraph.util.PageUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Builder; +import lombok.Data; + +@RestController +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/edit-histories") +public class EditElementHistoryController extends BaseController { + + @Autowired + private EditElementHistoryService service; + + @Autowired + private GremlinQueryController gremlinService; + + /** + * 根据条件查询编辑历史记录 + * @param graphSpace 图空间 + * @param graph 图 + * @param optionPersons 操作人 + * @param optionTimeFrom 操作时间from + * @param optionTimeTo 操作时间to + * @param optionTypes 操作类型 + * @param elementId 元素id + * @param pageNo 页码 + * @param pageSize 每页大小 + * @return 返回分页后的编辑历史记录 + */ + @GetMapping("filter") + public IPage queryByConditions( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestParam(name = "option_person", + required = false, + defaultValue = "") String optionPersons, + @RequestParam(name = "option_time_from", + required = false, + defaultValue = "") String optionTimeFrom, + @RequestParam(name = "option_time_to", + required = false, + defaultValue = "") String optionTimeTo, + @RequestParam(name = "option_type", + required = false, + defaultValue = "") String optionTypes, + @RequestParam(name = "element_id", + required = false, + defaultValue = "") String elementId, + @RequestParam(name = "page_no", + required = false, + defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", + required = false, + defaultValue = "10") int pageSize) { + boolean hasNoConditions = + hasNoConditions(optionPersons, optionTimeFrom, optionTimeTo, + optionTypes, elementId); + if (hasNoConditions) { + return this.service.list(graphSpace, graph, pageNo, pageSize); + } + + List optionPersonsList = + optionPersons.isEmpty() ? new ArrayList<>() : + Arrays.asList(optionPersons.split(",")); + + List optionTypesList = + optionTypes.isEmpty() ? new ArrayList<>() : + Arrays.asList(optionTypes.split(",")); + + return this.service.queryByConditions(graphSpace, graph, + optionPersonsList, + optionTypesList, + elementId, + optionTimeFrom, + optionTimeTo, + pageNo, pageSize); + } + + @GetMapping("gremlin") + public IPage queryByGremlin( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestParam(name = "page_no", + required = false, + defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", + required = false, + defaultValue = "10") int pageSize, + @RequestParam(name = "gremlin_query", + required = true) String gremlinQuery) { + GremlinResult gremlin = + gremlinService.gremlin(graphSpace, graph, + new GremlinQuery(gremlinQuery)); + List elements = collectElements(gremlin); + if (elements.isEmpty()) { + return PageUtil.page(new ArrayList<>(), pageNo, pageSize); + } + + List subElements = getSubList(elements, pageNo, pageSize); + + List elementIds = new ArrayList<>(); + subElements.forEach(e -> elementIds.add(e.id().toString())); + + Map histories = + service.queryByElementIds(graphSpace, graph, elementIds); + + List mergedElements = + mergeEditHistory(this.authClient(graphSpace, graph), histories, + elements); + return PageUtil.page(mergedElements, pageNo, pageSize); + } + + private List mergeEditHistory(HugeClient client, + Map histories, + List elements) { + List mergedElements = new ArrayList<>(); + + Map vlMap = new HashMap<>(); + client.schema().getVertexLabels() + .forEach(vl -> vlMap.put(vl.name(), vl)); + + Map elMap = new HashMap<>(); + client.schema().getEdgeLabels() + .forEach(el -> elMap.put(el.name(), el)); + + + for (GraphElement e : elements) { + Element.ElementBuilder eBuilder = + Element.builder() + .element(e) + .propertyNum(e.properties().size()); + if (e instanceof Vertex) { + eBuilder.label(vlMap.get(e.label())); + } else if (e instanceof Edge) { + eBuilder.label(elMap.get(e.label())); + } + ElementEditHistory his = histories.get(e.id().toString()); + if (his != null) { + eBuilder.lastContent(his.getContent()) + .lastOptionTime(his.getOptionTime()) + .lastOptionPerson(his.getOptionPerson()) + .lastOptionType(his.getOptionType()); + } + mergedElements.add(eBuilder.build()); + } + return mergedElements; + } + + private List getSubList(List elements, + int pageNo, int pageSize) { + int start = Math.min((pageNo - 1) * pageSize, elements.size()); + int end = Math.min(pageNo * pageSize, elements.size()); + return elements.subList(start, end); + } + + + private List collectElements(GremlinResult gremlin) { + List elements = new ArrayList<>(); + if (gremlin.getType().isEmpty()) { + return elements; + } + + for (Object obj : gremlin.getJsonView().getData()) { + if (obj instanceof Vertex) { + Vertex v = (Vertex) obj; + elements.add(v); + } else if (obj instanceof Edge) { + Edge e = (Edge) obj; + elements.add(e); + } + } + return elements; + } + + + private boolean hasNoConditions(String optionPersons, + String optionTimeFrom, + String optionTimeTo, + String optionTypes, + String elementId) { + return optionPersons.isEmpty() && optionTimeFrom.isEmpty() + && optionTimeTo.isEmpty() && optionTypes.isEmpty() && + elementId.isEmpty(); + } + + + @Data + @Builder + public static class Element { + @JsonProperty("element") + private GraphElement element; + + @JsonProperty("label") + private SchemaElement label; + + @JsonProperty("property_num") + private int propertyNum; + + @JsonProperty("last_option_type") + private String lastOptionType; + + @JsonProperty("last_option_time") + private Date lastOptionTime; + + @JsonProperty("last_option_person") + private String lastOptionPerson; + + @JsonProperty("last_content") + private String lastContent; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/ExecuteHistoryController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/ExecuteHistoryController.java index 733028678..2b810b882 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/ExecuteHistoryController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/ExecuteHistoryController.java @@ -18,29 +18,27 @@ package org.apache.hugegraph.controller.query; +import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.query.ExecuteHistory; import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.service.query.ExecuteHistoryService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/execute-histories") +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/execute-histories") public class ExecuteHistoryController extends GremlinController { @Autowired private ExecuteHistoryService service; @GetMapping - public IPage list(@PathVariable("connId") int connId, + public IPage list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestParam(name = "type") int type, @RequestParam(name = "page_no", required = false, defaultValue = "1") @@ -48,24 +46,33 @@ public IPage list(@PathVariable("connId") int connId, @RequestParam(name = "page_size", required = false, defaultValue = "10") - int pageSize) { - return this.service.list(connId, pageNo, pageSize); + int pageSize, + @RequestParam(name = "text2gremlin", + required = false, + defaultValue = "false") + boolean text2Gremlin) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.list(client, type, pageNo, pageSize, text2Gremlin); } @GetMapping("{id}") - public ExecuteHistory get(@PathVariable("connId") int connId, + public ExecuteHistory get(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") int id) { - return this.service.get(connId, id); + HugeClient client = this.authClient(graphSpace, graph); + return this.service.get(client, id); } @DeleteMapping("{id}") - public ExecuteHistory delete(@PathVariable("connId") int connId, + public ExecuteHistory delete(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") int id) { - ExecuteHistory oldEntity = this.service.get(connId, id); + HugeClient client = this.authClient(graphSpace, graph); + ExecuteHistory oldEntity = this.service.get(client, id); if (oldEntity == null) { throw new ExternalException("execute-history.not-exist.id", id); } - this.service.remove(connId, id); + this.service.remove(client, id); return oldEntity; } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinCollectionController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinCollectionController.java index dd515271a..fa19103d3 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinCollectionController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinCollectionController.java @@ -18,13 +18,9 @@ package org.apache.hugegraph.controller.query; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.enums.ExecuteType; import org.apache.commons.lang3.StringUtils; -import org.apache.hugegraph.common.Constant; -import org.apache.hugegraph.entity.query.GremlinCollection; -import org.apache.hugegraph.exception.ExternalException; -import org.apache.hugegraph.service.query.GremlinCollectionService; -import org.apache.hugegraph.util.Ex; -import org.apache.hugegraph.util.HubbleUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -36,10 +32,17 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.entity.query.GremlinCollection; +import org.apache.hugegraph.exception.ExternalException; +import org.apache.hugegraph.service.query.GremlinCollectionService; +import org.apache.hugegraph.util.Ex; +import org.apache.hugegraph.util.HubbleUtil; import com.baomidou.mybatisplus.core.metadata.IPage; @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/gremlin-collections") +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/gremlin-collections") public class GremlinCollectionController extends GremlinController { private static final int LIMIT = 100; @@ -52,7 +55,10 @@ public GremlinCollectionController(GremlinCollectionService service) { } @GetMapping - public IPage list(@PathVariable("connId") int connId, + public IPage list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestParam(name = "type") + String type, @RequestParam(name = "content", required = false) String content, @@ -85,7 +91,15 @@ public IPage list(@PathVariable("connId") int connId, "common.time-order.invalid", timeOrder); timeOrderAsc = ORDER_ASC.equals(timeOrder); } - return this.service.list(connId, content, nameOrderAsc, timeOrderAsc, + + if (!StringUtils.isEmpty(type)) { + Ex.check(ExecuteType.GREMLIN.name().equals(type) || ExecuteType.CYPHER.name().equals(type) + || ExecuteType.ALGORITHM.name().equals(type), + "common.type.invalid", type); + } + + HugeClient client = this.authClient(graphSpace, graph); + return this.service.list(client, content, type, nameOrderAsc, timeOrderAsc, pageNo, pageSize); } @@ -95,14 +109,16 @@ public GremlinCollection get(@PathVariable("id") int id) { } @PostMapping - public GremlinCollection create(@PathVariable("connId") int connId, + public GremlinCollection create(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody GremlinCollection newEntity) { this.checkParamsValid(newEntity, true); - newEntity.setConnId(connId); + newEntity.setGraphSpace(graphSpace); + newEntity.setGraph(graph); newEntity.setCreateTime(HubbleUtil.nowDate()); this.checkEntityUnique(newEntity, true); // The service is an singleton object - synchronized (this.service) { + synchronized(this.service) { Ex.check(this.service.count() < LIMIT, "gremlin-collection.reached-limit", LIMIT); this.service.save(newEntity); @@ -163,10 +179,17 @@ private void checkParamsValid(GremlinCollection newEntity, private void checkEntityUnique(GremlinCollection newEntity, boolean creating) { - int connId = newEntity.getConnId(); + String graphSpace = newEntity.getGraphSpace(); + String graph = newEntity.getGraph(); String name = newEntity.getName(); + String type = newEntity.getType(); // NOTE: Full table scan may slow, it's better to use index - GremlinCollection oldEntity = this.service.getByName(connId, name); + GremlinCollection oldEntity = this.service.getByName(graphSpace, graph, + name, type); + Ex.check(newEntity.getType().equals(ExecuteType.GREMLIN.name()) + || newEntity.getType().equals(ExecuteType.CYPHER.name()) || + newEntity.getType().equals(ExecuteType.ALGORITHM.name()) , + "gremlin-collection.type.invalid", newEntity.getType()); if (creating) { Ex.check(oldEntity == null, "gremlin-collection.exist.name", name); } else { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinController.java index 3af15c282..abbc3489f 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinController.java @@ -18,11 +18,11 @@ package org.apache.hugegraph.controller.query; -import java.util.regex.Pattern; - import org.apache.hugegraph.controller.BaseController; import org.apache.hugegraph.util.Ex; +import java.util.regex.Pattern; + public abstract class GremlinController extends BaseController { public static final Pattern CONTENT_PATTERN = Pattern.compile( diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinQueryController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinQueryController.java index 58f7fcc5d..08e2a6ff7 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinQueryController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/GremlinQueryController.java @@ -19,11 +19,25 @@ package org.apache.hugegraph.controller.query; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import org.apache.hugegraph.driver.HugeClient; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.entity.enums.AsyncTaskStatus; import org.apache.hugegraph.entity.enums.ExecuteStatus; @@ -34,52 +48,111 @@ import org.apache.hugegraph.entity.query.GremlinResult; import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.service.query.ExecuteHistoryService; -import org.apache.hugegraph.service.query.GremlinQueryService; +import org.apache.hugegraph.service.query.QueryService; import org.apache.hugegraph.util.Ex; import org.apache.hugegraph.util.HubbleUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import lombok.extern.log4j.Log4j2; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; -@Log4j2 @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/gremlin-query") +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/gremlin-query") public class GremlinQueryController extends GremlinController { + private static final Logger LOG = + LoggerFactory.getLogger(GremlinQueryController.class); + private static final Set CONDITION_OPERATORS = ImmutableSet.of( "eq", "gt", "gte", "lt", "lte" ); @Autowired - private GremlinQueryService queryService; + private QueryService queryService; @Autowired private ExecuteHistoryService historyService; + + @GetMapping + public Map execute(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph) { + +// HugeClient client = this.authClient(graphSpace, graph); +// String vertexCount = ""; +// String edgeCount = ""; +// try{ +// ResultSet gremlinVertexCount = queryService.executeQueryCount(client, "g.V().count()"); +// vertexCount = gremlinVertexCount.data().get(0).toString(); +// } catch (Throwable e) { +// vertexCount = "max"; +// } +// try { +// ResultSet gremlinEdgeCount = queryService.executeQueryCount(client, "g.E().count()"); +// edgeCount = gremlinEdgeCount.data().get(0).toString(); +// } catch (Throwable e) { +// edgeCount = "max"; +// } + Map graphCount = new HashMap<>(); + graphCount.put("vertexcount", "0"); + graphCount.put("edgecount", "0"); + return graphCount; + } + + /** + * 正常gremlin请求 && 图分析页面gremlin请求 + */ @PostMapping - public GremlinResult execute(@PathVariable("connId") int connId, + public GremlinResult gremlin(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody GremlinQuery query) { + return this.executeGremlin(graphSpace, graph, query); + } + + + + /* + * 用户对大模型生成的gremlin评价 + */ + @PostMapping("text2gremlin-report") + public Map reportText2Gremlin(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody Text2Gremlin text2Gremlin) { + // username graphspace graph text llm-gremlin exec-gremlin success nice + text2Gremlin.setText(text2Gremlin.getText().replaceAll(",", ",")); + LOG.info("{},{},{},{},{},{},{},{}", text2Gremlin.getUsername(), + graphSpace, graph, text2Gremlin.getText(), + text2Gremlin.getLlmGremlin(), text2Gremlin.getExecGremlin(), + text2Gremlin.getSuccess(), + text2Gremlin.getScore()); + return ImmutableMap.of("text2gremlin-report", "success"); + } + + + private GremlinResult executeGremlin(String graphSpace, String graph, + GremlinQuery query) { this.checkParamsValid(query); Date createTime = HubbleUtil.nowDate(); // Insert execute history ExecuteStatus status = ExecuteStatus.RUNNING; ExecuteHistory history; - history = new ExecuteHistory(null, connId, 0L, ExecuteType.GREMLIN, - query.getContent(), status, AsyncTaskStatus.UNKNOWN, + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.GREMLIN, query.getContent(), + query.getText(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); this.historyService.save(history); StopWatch timer = StopWatch.createStarted(); try { - GremlinResult result = this.queryService.executeQuery(connId, query); + HugeClient client = this.authClient(graphSpace, graph); + GremlinResult result = + this.queryService.executeGremlinQuery(client, query); status = ExecuteStatus.SUCCESS; return result; } catch (Throwable e) { @@ -94,26 +167,36 @@ public GremlinResult execute(@PathVariable("connId") int connId, } } + + @PostMapping("async-task") - public ExecuteStatus executeAsyncTask(@PathVariable("connId") int connId, - @RequestBody GremlinQuery query) { + public Map executeAsyncTask( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody GremlinQuery query) { this.checkParamsValid(query); Date createTime = HubbleUtil.nowDate(); // Insert execute history ExecuteStatus status = ExecuteStatus.ASYNC_TASK_RUNNING; ExecuteHistory history; - history = new ExecuteHistory(null, connId, 0L, ExecuteType.GREMLIN_ASYNC, - query.getContent(), status, - AsyncTaskStatus.UNKNOWN, -1L, createTime); + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.GREMLIN_ASYNC, + query.getContent(), query.getText(), + status, AsyncTaskStatus.UNKNOWN, -1L, + createTime); this.historyService.save(history); StopWatch timer = StopWatch.createStarted(); long asyncId = 0L; + Map result = new HashMap<>(3); try { - asyncId = this.queryService.executeAsyncTask(connId, query); + HugeClient client = this.authClient(graphSpace, graph); + asyncId = this.queryService.executeGremlinAsyncTask(client, query); status = ExecuteStatus.ASYNC_TASK_SUCCESS; - return status; + result.put("task_id", asyncId); + result.put("execute_status", status); + return result; } catch (Throwable e) { status = ExecuteStatus.ASYNC_TASK_FAILED; throw e; @@ -128,11 +211,13 @@ public ExecuteStatus executeAsyncTask(@PathVariable("connId") int connId, } @PutMapping - public GremlinResult expand(@PathVariable("connId") int connId, + public GremlinResult expand(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody AdjacentQuery query) { this.checkParamsValid(query); try { - return this.queryService.expandVertex(connId, query); + HugeClient client = this.authClient(graphSpace, graph); + return this.queryService.expandVertex(client, query); } catch (Exception e) { Throwable rootCause = Ex.rootCause(e); throw new ExternalException("gremlin.expand.failed", rootCause, @@ -168,4 +253,33 @@ private void checkParamsValid(AdjacentQuery query) { } } } + + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + private static class Text2Gremlin { + @JsonProperty("username") + private String username; + + // 执行的gremlin语句 + @JsonProperty("exec-gremlin") + private String execGremlin; + + @JsonProperty("text") + private String text; + + // 大模型生成的gremlin语句 + @JsonProperty("llm-gremlin") + private String llmGremlin; + + // 语句成功与否 + @JsonProperty("success") + private Boolean success; + + // 用户点赞与否 + @JsonProperty("score") + private Boolean score; + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/GraphMetricsController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/GraphMetricsController.java new file mode 100644 index 000000000..93e3034e0 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/GraphMetricsController.java @@ -0,0 +1,473 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.saas; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.hugegraph.api.graph.GraphMetricsAPI; +// TODO fix import +//import org.apache.hugegraph.client.api.graph.GraphMetricsAPI; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.date.SafeDateFormat; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.exception.HugeException; +import org.apache.hugegraph.util.DateUtil; +import org.apache.hugegraph.util.E; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.*; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +@RestController +@RequestMapping(Constant.API_VERSION + "/graphspaces/{graphspace}/graphs/{graph}/metrics") +public class GraphMetricsController extends BaseController { + private static final Logger LOG = LoggerFactory.getLogger( + GraphMetricsController.class); + + public static final SafeDateFormat SAFE_DATE_FORMAT = new SafeDateFormat("yyyyMMdd"); + + + @GetMapping("schema") + public Object schemaMetrics(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph) { + + HugeClient client = this.authClient(graphSpace, graph); + String today = SAFE_DATE_FORMAT.format(DateUtil.now()); + + // 获取当前日期前14天的记录 + List dateRange = getRangeDate(today, -13); + + LOG.info("schema metrics info: query type count from = [{}], to = [{}]", + dateRange.get(0), dateRange.get(13)); + + SchemaCount schemaCount = + new SchemaCount<>(client.schema().getPropertyKeys().size(), + client.schema().getVertexLabels().size(), + client.schema().getEdgeLabels().size(), + client.schema().getIndexLabels().size()); + + GraphMetricsAPI.TypeCounts rangeTypeCount = + client.graph().getTypeCounts(dateRange.get(0), dateRange.get(dateRange.size() - 1)); + + SchemaCount schemaWeekRate = + weeklyGrowthRate(rangeTypeCount.getTypeCounts(), dateRange, schemaCount); + + return new SchemaMetrics(schemaWeekRate, schemaCount); + } + + + /** + * @return 返回当前日期前14天的日期列表 + */ + @GetMapping("element") + public Object elementMetrics( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestParam(name = "from", required = true) + @DateTimeFormat(pattern = "yyyyMMdd") String from, + @RequestParam(name = "to", required = true) + @DateTimeFormat(pattern = "yyyyMMdd") String to) { + HugeClient client = this.authClient(graphSpace, graph); + return getEvCount(client, graphSpace, graph, from, to); + } + + + /** + * 统计单种类型顶点或者边的日增长率及其存量数据增长率 + * 及其他统计信息 + * @param from 起始日期 + * @param to 终止日期 + * @param type 顶点或边 + * @param schema schema名称 + * @return + */ + @GetMapping("element/schema") + public Object elementSchemaMetrics( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestParam(name = "from", required = true) + @DateTimeFormat(pattern = "yyyyMMdd") String from, + @RequestParam(name = "to", required = true) + @DateTimeFormat(pattern = "yyyyMMdd") String to, + @RequestParam(name = "type", required = true) String type, + @RequestParam(name = "schema", required = true) String schema) { + // 校验type参数 + E.checkArgument("vertex".equals(type) || "edge".equals(type), + String.format("type must in [vertex, edge], but got '%s'", type)); + + // 校验schema存不存在 + HugeClient client = this.authClient(graphSpace, graph); + boolean schemaExisted = false; + if("vertex".equals(type)) { + schemaExisted = client.schema().getVertexLabel(schema) != null; + } else { + schemaExisted = client.schema().getEdgeLabel(schema) != null; + } + E.checkArgument(schemaExisted, + String.format("schema '%s' not existed", schema)); + + // 计算单种类型顶点或者边的日增长率及其存量数据增长率 + PerEvEntity result = calGrowthRates(client, type, schema); + + // 组织当前schema顶点或者边按日期分布的数据 + ArrayList itemCounts = new ArrayList<>(); + GraphMetricsAPI.TypeCounts typeCounts = + client.graph().getTypeCounts(from, to); + for (Map.Entry entry : + typeCounts.getTypeCounts().entrySet()) { + String k = entry.getKey(); + GraphMetricsAPI.TypeCount v = entry.getValue(); + if (v == null) { + itemCounts.add(new ItemCount(k, null, 0L)); + }else { + itemCounts.add(new ItemCount(k, v.getDatetime(), + getEleCount(type, schema, v))); + } + } + result.setCountBySchema(itemCounts); + + return result; + } + + private PerEvEntity calGrowthRates(HugeClient client, String type, + String schema) { + String today = SAFE_DATE_FORMAT.format(DateUtil.now()); + List last4Days = getRangeDate(today, -3); + GraphMetricsAPI.TypeCounts last3TypeCount = + client.graph().getTypeCounts(last4Days.get(0), last4Days.get(2)); + + Long[] last3Days = extractTotalCountLast3Days(last3TypeCount, type, schema, + last4Days.subList(0, 3)); + Long totalCount1 = last3Days[2]; // 前1天当前schema总数 + Long totalCount2 = last3Days[1]; // 前2天当前schema总数 + Long totalCount3 = last3Days[0]; // 前3天当前schema总数 + + // 设置总数值及增长量值 + return PerEvEntity.builder() + .addedGrowthRate(growthRate( + totalCount2 - totalCount3, + totalCount1 - totalCount2)) + .totalGrowthRate(growthRate(totalCount2, totalCount1)) + .preDayAdded(totalCount1 - totalCount2) + .preDayTotal(totalCount1) + .type(schema).build(); + } + + public static List getEvCount(HugeClient client, String gs, + String graph, String from, + String to) { + client.assignGraph(gs, graph); + GraphMetricsAPI.TypeCounts typeCounts = + client.graph().getTypeCounts(from, to); + + List list = new ArrayList<>(); + for (Map.Entry entry : + typeCounts.getTypeCounts().entrySet()) { + list.add(new EvCountEntity(entry.getKey(), entry.getValue())); + } + return list; + + } + + private Long[] extractTotalCountLast3Days( + GraphMetricsAPI.TypeCounts typeCounts, String type, + String schema, List dateRange) { + + if (typeCounts.getTypeCounts() == null) { + return new Long[]{0L, 0L, 0L}; + } + + ArrayList list = new ArrayList<>(); + for (int i = 0; i < dateRange.size(); i++) { + GraphMetricsAPI.TypeCount typeCount = + typeCounts.getTypeCounts().get(dateRange.get(i)); + Long totalCount = getEleCount(type, schema, typeCount); + list.add(totalCount); + } + + assert list.size() == 3; + return list.toArray(new Long[3]); + } + + private Long getEleCount(String type, String schema, GraphMetricsAPI.TypeCount typeCount) { + if (typeCount == null) { + return 0L; + } + + Map countMap; + if ("vertex".equals(type)) { + countMap = typeCount.getVertices(); + } else if ("edge".equals(type)) { + countMap = typeCount.getEdges(); + } else { + throw new HugeException("undefine type: type must in [vertex, edge]"); + } + + if (countMap == null || countMap.get(schema) == null) { + return 0L; + } + + return countMap.get(schema); + } + + + /** + * 计算周增长率 + * + * @param map 日期范围下类型统计数据 + * @param dateRange 日期范围 + * @param todaySchema 当前日期下的schema统计 + * @return schema的周增长率 + */ + public static SchemaCount weeklyGrowthRate( + Map map, + List dateRange, + SchemaCount todaySchema) { + + assert dateRange.size() == 14 && map.size() == 14; + + SchemaCount s1 = new SchemaCount<>(0L, 0L, 0L, 0L); + SchemaCount s2 = new SchemaCount<>(0L, 0L, 0L, 0L); + // 统计近一周的前一周 + for (int i = 0; i < 7; i++) { + GraphMetricsAPI.TypeCount typeCount = map.get(dateRange.get(i)); + if (typeCount == null) { + continue; + } + s1.pk = s1.pk + typeCount.getSchemas().get("pk_count"); + s1.vl = s1.vl + typeCount.getSchemas().get("vl_count"); + s1.el = s1.el + typeCount.getSchemas().get("el_count"); + s1.il = s1.il + typeCount.getSchemas().get("il_count"); + } + + // 近一周:取最近6天的数据 + 当天数据用实时数据 + s2.pk = s2.pk + todaySchema.pk; + s2.vl = s2.vl + todaySchema.vl; + s2.el = s2.el + todaySchema.el; + s2.il = s2.il + todaySchema.il; + for (int i = 7; i < 13; i++) { + GraphMetricsAPI.TypeCount typeCount = map.get(dateRange.get(i)); + if (typeCount == null) { + continue; + } + s2.pk = s2.pk + typeCount.getSchemas().get("pk_count"); + s2.vl = s2.vl + typeCount.getSchemas().get("vl_count"); + s2.el = s2.el + typeCount.getSchemas().get("el_count"); + s2.il = s2.il + typeCount.getSchemas().get("il_count"); + } + return new SchemaCount<>(growthRate(s1.pk, s2.pk), + growthRate(s1.vl, s2.vl), + growthRate(s1.el, s2.el), + growthRate(s1.il, s2.il)); + } + + /** + * @return num2 - num1 相比于 num1 的增长率 + * 只保留两位小数 + */ + private static Double growthRate(Long num1, Long num2) { + assert num1 != null; + assert num2 != null; + assert num1 >= 0; + assert num2 >= 0; + if(num1 == 0 && num2 == 0){ + return 0.0; + } + if (num1 == 0) { + return 1.0; + } + if (num2 == 0) { + return -1.0; + } + // 保留两位小数 + DecimalFormat decimalFormat = new DecimalFormat("#.##"); + String formattedResult = decimalFormat.format((num2 - num1) / ((double) num1)); + return Double.parseDouble(formattedResult); + } + + public static List getRangeDate(String start, int days) { + List dateList = new ArrayList<>(); + try { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(SAFE_DATE_FORMAT.parse(start)); + + for (int i = 0; i <= Math.abs(days); i++) { + dateList.add(SAFE_DATE_FORMAT.format(calendar.getTime())); + if (days > 0) { + calendar.add(Calendar.DAY_OF_MONTH, 1); + } else { + calendar.add(Calendar.DAY_OF_MONTH, -1); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + return dateList.stream().sorted().collect(Collectors.toList()); + } + + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class PerEvEntity { + @JsonProperty("total_growth_rate") + public Double totalGrowthRate = 0.0; + @JsonProperty("added_growth_rate") + public Double addedGrowthRate = 0.0; + + @JsonProperty("pre_day_total") + public Long preDayTotal = 0L; + @JsonProperty("pre_day_added") + public Long preDayAdded = 0L; + @JsonProperty("type") + public String type; + @JsonProperty("count_by_schema") + public List countBySchema = new ArrayList<>(); + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class EvCountEntity { + @JsonProperty("vertices_count") + public Long verticesCount = 0L; + + @JsonProperty("edges_count") + public Long edgesCount = 0L; + + @JsonProperty("date") + public String date; + + @JsonProperty("update_time") + public String updateTime; + + @JsonProperty("vertices") + public List vertices = new ArrayList<>(); + @JsonProperty("edges") + public List edges = new ArrayList<>(); + + public EvCountEntity(String date, GraphMetricsAPI.TypeCount typeCount) { + this.date = date; + if (typeCount == null) { + return; + } + this.vertices = mergeItem(typeCount.getVertices()); + this.edges = mergeItem(typeCount.getEdges()); + this.updateTime = typeCount.getDatetime(); + this.verticesCount = mergeCount(typeCount.getVertices()); + this.edgesCount = mergeCount( typeCount.getEdges()); + } + + private List mergeItem(Map evTypeCount) { + ArrayList list = new ArrayList<>(); + if (evTypeCount == null) { + return list; + } + for (Map.Entry entry : evTypeCount.entrySet()) { + Item item = new Item(entry.getKey(), entry.getValue()); + list.add(item); + } + return list; + } + + private Long mergeCount(Map map) { + Long count = 0L; + for (Map.Entry entry : map.entrySet()) { + count += entry.getValue(); + } + return count; + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class Item { + @JsonProperty("type") + private String type; + + @JsonProperty("count") + private Long count; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class ItemCount { + @JsonProperty("date") + private String date; + + @JsonProperty("update_time") + private String updateTime; + + @JsonProperty("count") + private Long count; + } + + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class SchemaMetrics { + @JsonProperty("weekly_growth_rate") + private SchemaCount weeklyGrowthRate; + + @JsonProperty("item_count") + private SchemaCount itemCount; + } + + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class SchemaCount { + @JsonProperty("pk") + public T pk; + + @JsonProperty("vl") + public T vl; + + @JsonProperty("el") + public T el; + + @JsonProperty("il") + public T il; + } + +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/GraphSpaceMetricsController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/GraphSpaceMetricsController.java new file mode 100644 index 000000000..fb57b1225 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/GraphSpaceMetricsController.java @@ -0,0 +1,148 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.saas; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.hugegraph.util.DateUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.api.graph.GraphMetricsAPI; +// TODO fix import +//import org.apache.hugegraph.client.api.graph.GraphMetricsAPI; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.service.graphs.GraphsService; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequestMapping(Constant.API_VERSION + "/graphspaces/{graphspace}/metrics") +public class GraphSpaceMetricsController extends BaseController { + @Autowired + private GraphsService g; + + @GetMapping("element") + public Object elementMetrics( + @PathVariable("graphspace") String graphSpace, + @DateTimeFormat(pattern = "yyyyMMdd") String from, + @RequestParam(name = "to", required = true) + @DateTimeFormat(pattern = "yyyyMMdd") String to) { + HugeClient client = this.authClient(graphSpace, null); + Set graphs = g.listGraphNames(client, graphSpace, ""); + + List result = new ArrayList<>(); + + Map gsTypeCounts = new HashMap<>(); + + for (String graph : graphs) { + client.assignGraph(graphSpace, graph); + GraphMetricsAPI.TypeCounts typeCounts = + client.graph().getTypeCounts(from, to); + mergeEvCount(gsTypeCounts, typeCounts); + } + + List list = new ArrayList<>(); + for (Map.Entry entry : + gsTypeCounts.entrySet()) { + list.add(new GraphMetricsController.EvCountEntity(entry.getKey(), + entry.getValue())); + } + return list; + } + + @GetMapping("schema") + public Object schemaMetrics( + @PathVariable("graphspace") String graphSpace) { + HugeClient client = this.authClient(graphSpace, null); + Set graphs = g.listGraphNames(client, graphSpace, ""); + + String today = GraphMetricsController.SAFE_DATE_FORMAT.format(DateUtil.now()); + + // 获取当前日期前14天的记录 + List dateRange = GraphMetricsController.getRangeDate(today, -13); + + Map gsTypeCounts = new HashMap<>(); + + GraphMetricsController.SchemaCount schemaCount = + new GraphMetricsController.SchemaCount<>(0, 0, 0, 0); + for (String graph : graphs) { + client.assignGraph(graphSpace, graph); + GraphMetricsAPI.TypeCounts typeCounts = + client.graph().getTypeCounts(dateRange.get(0), dateRange.get(13)); + mergeEvCount(gsTypeCounts, typeCounts); + schemaCount.pk += client.schema().getPropertyKeys().size(); + schemaCount.vl += client.schema().getVertexLabels().size(); + schemaCount.el += client.schema().getEdgeLabels().size(); + schemaCount.il += client.schema().getIndexLabels().size(); + } + + GraphMetricsController.SchemaCount schemaWeekRate = + GraphMetricsController.weeklyGrowthRate(gsTypeCounts, dateRange, schemaCount); + + return new GraphMetricsController.SchemaMetrics(schemaWeekRate, + schemaCount); + } + + + private void mergeEvCount( + Map merged, + GraphMetricsAPI.TypeCounts evCount) { + for (Map.Entry entry : + evCount.getTypeCounts().entrySet()) { + String k = entry.getKey(); + GraphMetricsAPI.TypeCount v = entry.getValue(); + GraphMetricsAPI.TypeCount gsTypeCount = merged.get(k); + if (gsTypeCount == null) { + merged.put(k, v); + }else { + // 部分图没有数据,continue + if (v == null) { + continue; + } + + String updateTime = + gsTypeCount.getDatetime().compareTo(v.getDatetime()) > + 0 ? gsTypeCount.getDatetime() : v.getDatetime(); + gsTypeCount.setDatetime(updateTime); + mergeEvCount(gsTypeCount.getVertices(), v.getVertices()); + mergeEvCount(gsTypeCount.getEdges(), v.getEdges()); + } + } + } + + private void mergeEvCount(Map merged, Map map) { + for (Map.Entry entry : map.entrySet()) { + merged.merge(entry.getKey(), entry.getValue(), Long::sum); + } + } + +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/SaaSMetricsController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/SaaSMetricsController.java new file mode 100644 index 000000000..f479e2c4c --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/SaaSMetricsController.java @@ -0,0 +1,348 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.saas; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hugegraph.common.AppType; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.query.ApplicationInfo; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.service.query.ApplicationInfoService; +import org.apache.hugegraph.service.saas.PrometheusService; +import org.apache.hugegraph.service.space.GraphSpaceService; +import org.apache.hugegraph.util.HubbleUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +@RestController +@RequestMapping(Constant.API_VERSION + "saas/") +public class SaaSMetricsController extends BaseController { + + Logger logger = LoggerFactory.getLogger(SaaSMetricsController.class); + @Autowired + private GraphSpaceService graphSpaceService; + @Autowired + private PrometheusService prometheusService; + @Autowired + private HugeConfig config; + @Autowired + private ApplicationInfoService appInfoService; + + private Cache saasMetricsCache = + CacheBuilder.newBuilder() + .expireAfterWrite(4 * 3600, TimeUnit.SECONDS) + .build(); + + private static final String BASE_COUNT_QUERY = "sum(nginx_vts_filter_requests_total{__CONDITIONS__})"; + private static final String BASE_DIS_QUERY = "sum(rate(nginx_vts_filter_requests_total{__CONDITIONS__}[2m]))"; + + @GetMapping("graphspaces/{graphspace}/graphs/{graph}/request-details") + public Object appsRequestDetails(@PathVariable String graphspace, + @PathVariable String graph) { + String idc = config.get(HubbleOptions.IDC); + String graphName = join(idc, graphspace, graph); + List appInfos = appInfoService.query(graphName); + // 添加3个以下默认应用 GREMLIN, VERTEX_UPDATE, EDGE_UPDATE + appInfos.add(defaultGremlinApp(idc, graphspace, graph)); + appInfos.add(defaultVertexUpdateApp(idc, graphspace, graph)); + appInfos.add(defaultEdgeUpdateApp(idc, graphspace, graph)); + + long[] timestamps = HubbleUtil.getTimestampsBefore24Hours(); + long from = timestamps[0]; + long to = timestamps[1]; + List appsRequestDetails = new ArrayList<>(); + for (ApplicationInfo appInfo : appInfos) { + appsRequestDetails.add(getAppRequestDetails(appInfo, from, to)); + } + + ApplicationInfo graphAppInfo = defaultGraphApp(idc, graphspace); + AppRequestDetails totalGraph = + getAppRequestDetails(graphAppInfo, from, to); + + return RequestDetails.builder() + .appNum(appInfos.size()) + .appsRequestDetails(appsRequestDetails) + .countDuring24h(totalGraph.getCountDuring24h()) + .distributionDuring24h( + totalGraph.getDistributionDuring24h()) + .distributionQuery( + graphAppInfo.getDistributionQuery()) + .countQuery(graphAppInfo.getCountQuery()) + .build(); + } + + @GetMapping("graphspaces/{graphspace}/graphs/{graph}/request-distribution") + public Object appRequestDetails(@PathVariable String graphspace, + @PathVariable String graph, + @RequestParam(name = "start", required = true) + long start, + @RequestParam(name = "end", required = true) + long end, + @RequestParam(name = "query", required = true) + String query, + @RequestParam(name = "step", required = true) + long step) { + return prometheusService.queryByRange(query, start, end, step); + } + + + private AppRequestDetails getAppRequestDetails(ApplicationInfo appInfo, long from, long to) { + long countDuring24h = + prometheusService.queryByDelta(appInfo.getCountQuery(), from, + to); + List> distributionDuring24h = + prometheusService.queryByRange(appInfo.getDistributionQuery(), + from, to, 900); + return AppRequestDetails.builder() + .appInfo(appInfo) + .countDuring24h(countDuring24h) + .distributionDuring24h(distributionDuring24h) + .build(); + } + + @GetMapping("metrics") + public Object metrics() { + HugeClient client = this.authClient(null, null); + try { + return this.saasMetricsCache.get("saas-metrics", () -> { + Map metrics = + this.graphSpaceService.metrics(client); + String lastDay = HubbleUtil.dateFormatLastDay(); + Long preDayCountTotal = + prometheusService.queryCountOffSet1Day(lastDay + " 23:59:59"); + SaaSMetrics saasMetrics = + SaaSMetrics.builder() + .edgeCount(metrics.get("eCount")) + .edgeLabelCount(metrics.get("elCount")) + .graphCount(metrics.get("gCount")) + .graphSpaceCount(metrics.get("gsCount")) + .vertexCount(metrics.get("vCount")) + .vertexLabelCount(metrics.get("vlCount")) + .preDayTaskCount(metrics.get("preDayTaskCount")) + .preDayQueryCount(preDayCountTotal) + .build(); + logger.info("saas metrics in [{}]: {}", HubbleUtil.dateFormatLastDay(), saasMetrics); + this.saasMetricsCache.put("saas-metrics", saasMetrics); + return saasMetrics; + }); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + } + + public static ApplicationInfo defaultGremlinApp(String idc, + String graphSpace, + String graph) { + // 默认的Gremlin应用 + String department = departmentName(graphSpace); + String baseCondition = "idc=~\"__IDC__\", filter=~\".*__DEPARTMENT__.*\", filter_name=\"POST::/gremlin\""; + + String condition = baseCondition.replace("__DEPARTMENT__", department) + .replace("__IDC__", idc); + + ApplicationInfo.ApplicationInfoBuilder app = + ApplicationInfo.builder(); + app.appName("GREMLIN") + .appType(AppType.GENERAL) + .graphName(join(idc, graphSpace, graph)) + .countQuery(BASE_COUNT_QUERY.replace("__CONDITIONS__", condition)) + .distributionQuery( + BASE_DIS_QUERY.replace("__CONDITIONS__", condition)) + .description("Gremlin查询应用(通用应用)"); + return app.build(); + } + + + public static ApplicationInfo defaultVertexUpdateApp(String idc, + String graphSpace, + String graph) { + // 默认的VertexUpdate应用 + String department = departmentName(graphSpace); + String baseCondition = + "idc=~\"__IDC__\", filter=~\".*__DEPARTMENT__.*\", " + + "filter_name=~\".*/graphspaces/__GRAPH_SPACE__/graphs/__GRAPH__/graph/vertices/batch\""; + + String condition = baseCondition.replace("__DEPARTMENT__", department) + .replace("__IDC__", idc) + .replace("__GRAPH_SPACE__", graphSpace) + .replace("__GRAPH__", graph); + + ApplicationInfo.ApplicationInfoBuilder app = + ApplicationInfo.builder(); + app.appName("VERTEX-UPDATE") + .graphName(join(idc, graphSpace, graph)) + .appType(AppType.GENERAL) + .countQuery(BASE_COUNT_QUERY.replace("__CONDITIONS__", condition)) + .distributionQuery(BASE_DIS_QUERY.replace("__CONDITIONS__", condition)) + .description("批量顶点更新应用(通用应用)"); + return app.build(); + } + + public static ApplicationInfo defaultEdgeUpdateApp(String idc, + String graphSpace, + String graph) { + // 默认的EdgeUpdate应用 + String department = departmentName(graphSpace); + String baseCondition = + "idc=~\"__IDC__\", filter=~\".*__DEPARTMENT__.*\", " + + "filter_name=~\".*/graphspaces/__GRAPH_SPACE__/graphs" + + "/__GRAPH__/graph/edges/batch\""; + + String condition = baseCondition.replace("__DEPARTMENT__", department) + .replace("__IDC__", idc) + .replace("__GRAPH_SPACE__", graphSpace) + .replace("__GRAPH__", graph); + + ApplicationInfo.ApplicationInfoBuilder app = + ApplicationInfo.builder(); + app.appName("EDGE-UPDATE") + .graphName(join(idc, graphSpace, graph)) + .appType(AppType.GENERAL) + .countQuery(BASE_COUNT_QUERY.replace("__CONDITIONS__", condition)) + .distributionQuery(BASE_DIS_QUERY.replace("__CONDITIONS__", condition)) + .description("批量边更新应用(通用应用)"); + return app.build(); + } + + private static ApplicationInfo defaultGraphApp(String idc, String graphSpace) { + // 默认的graph应用 + String department = departmentName(graphSpace); + String baseCondition = + "idc=~\"__IDC__\", filter=~\".*__DEPARTMENT__.*\""; + + String condition = baseCondition.replace("__DEPARTMENT__", department) + .replace("__IDC__", idc); + + ApplicationInfo.ApplicationInfoBuilder app = + ApplicationInfo.builder(); + app.appName("TOTAL-GRAPH") + .appType(AppType.GENERAL) + .countQuery(BASE_COUNT_QUERY.replace("__CONDITIONS__", condition)) + .distributionQuery(BASE_DIS_QUERY.replace("__CONDITIONS__", condition)); + return app.build(); + } + + + private static String departmentName(String graphSpace) { + if (graphSpace.endsWith("gs")) { + return graphSpace.substring(0, graphSpace.length() - 2); + } else { + return graphSpace; + } + } + + + private static String join(String idc, String graphSpace, String graph) { + return String.join("-", idc, graphSpace, graph); + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + private static class SaaSMetrics { + @JsonProperty("vertex-label-count") + private long vertexLabelCount; + + @JsonProperty("vertex-count") + private long vertexCount; + + @JsonProperty("edge-label-count") + private long edgeLabelCount; + + @JsonProperty("edge-count") + private long edgeCount; + + @JsonProperty("graph-space-count") + private long graphSpaceCount; + + @JsonProperty("graph-count") + private long graphCount; + + @JsonProperty("pre-day-task-count") + private long preDayTaskCount; + + @JsonProperty("pre-day-query-count") + private long preDayQueryCount; + } + + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + private static class RequestDetails { + @JsonProperty("app_num") + private int appNum; + + @JsonProperty("count_during24h") + private long countDuring24h; + + @JsonProperty("distribution_during24h") + private List> distributionDuring24h; + + @JsonProperty("count_query") + private String countQuery; + + @JsonProperty("distribution_query") + private String distributionQuery; + + @JsonProperty("apps_request_details") + private List appsRequestDetails; + } + + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + private static class AppRequestDetails { + @JsonProperty("app_info") + private ApplicationInfo appInfo; + + @JsonProperty("count_during24h") + private long countDuring24h; + + @JsonProperty("distribution_during24h") + private List> distributionDuring24h; + } + + public static void main(String[] args) { + System.out.println("gremlin应用" + defaultGremlinApp("bddwd", "astrolabegs", "indexpro_online")); + System.out.println("边更新应用" + defaultEdgeUpdateApp("bddwd", "astrolabegs", "indexpro_online")); + System.out.println("顶点更新应用" + defaultVertexUpdateApp("bddwd", "astrolabegs", "indexpro_online")); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/SaasGraphViewController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/SaasGraphViewController.java new file mode 100644 index 000000000..55db66a5e --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/saas/SaasGraphViewController.java @@ -0,0 +1,176 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.saas; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.time.StopWatch; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.query.GremlinController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.enums.AsyncTaskStatus; +import org.apache.hugegraph.entity.enums.ExecuteStatus; +import org.apache.hugegraph.entity.enums.ExecuteType; +import org.apache.hugegraph.entity.query.ExecuteHistory; +import org.apache.hugegraph.entity.query.GremlinQuery; +import org.apache.hugegraph.entity.query.GremlinResult; +import org.apache.hugegraph.service.query.ExecuteHistoryService; +import org.apache.hugegraph.service.query.QueryService; +import org.apache.hugegraph.util.E; +import org.apache.hugegraph.util.HubbleUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Log4j2 +@RestController +@RequestMapping(Constant.API_VERSION + + "/graphspaces/{graphspace}/graphs/{graph}/graphview") + +/** + * 此接口为定制Gremlin查询接口: + * 用途: 提供给前端查询Gremlin的接口,包装返回的数据用于前端画布展示 + */ +public class SaasGraphViewController extends GremlinController { + + @Autowired + private QueryService queryService; + @Autowired + private ExecuteHistoryService historyService; + + @PostMapping + public GremlinResult execute(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody GraphViewQuery query) { + this.checkParamsValid(query); + + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.GREMLIN, query.getGremlin(), + status, AsyncTaskStatus.UNKNOWN, + -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + + //uuapLoginController.tryLogin(graphSpace, graph, + // query.userName, query.password); + // TODO X Deleted + try { + HugeClient client = this.authClient(graphSpace, graph); + GremlinResult result = + this.queryService.executeGremlinQuery(client, + query.convert2GremlinQuery()); + status = ExecuteStatus.SUCCESS; + return result; + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + @PostMapping("async-task") + public Map executeAsyncTask( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody GraphViewQuery query) { + checkParamsValid(query); + + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.ASYNC_TASK_RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.GREMLIN_ASYNC, + query.getGremlin(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + + StopWatch timer = StopWatch.createStarted(); + long asyncId = 0L; + Map result = new HashMap<>(3); + + //uuapLoginController.tryLogin(graphSpace, graph, + // query.userName, query.password); + // TODO C Deleted + + try { + HugeClient client = this.authClient(graphSpace, graph); + asyncId = this.queryService.executeGremlinAsyncTask(client, + query.convert2GremlinQuery()); + status = ExecuteStatus.ASYNC_TASK_SUCCESS; + result.put("task_id", asyncId); + result.put("execute_status", status); + return result; + } catch (Throwable e) { + status = ExecuteStatus.ASYNC_TASK_FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + history.setAsyncId(asyncId); + this.historyService.update(history); + } + } + + private void checkParamsValid(GraphViewQuery query) { + E.checkNotNull(query.getGremlin(), "params [gremlin] must not be null"); + checkContentLength(query.getGremlin()); + E.checkNotNull(query.getUserName(), "params [username] must not be null"); + E.checkNotNull(query.getGremlin(), "params [password] must not be null"); + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class GraphViewQuery { + @JsonProperty("gremlin") + private String gremlin; + + @JsonProperty("username") + private String userName; + + @JsonProperty("password") + private String password; + + public GremlinQuery convert2GremlinQuery() { + return new GremlinQuery(this.gremlin); + } + } +} + diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/EdgeLabelController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/EdgeLabelController.java index b21a94ed8..f639237be 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/EdgeLabelController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/EdgeLabelController.java @@ -22,6 +22,20 @@ import java.util.List; import java.util.Set; +import org.apache.hugegraph.driver.HugeClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.entity.schema.ConflictCheckEntity; import org.apache.hugegraph.entity.schema.ConflictDetail; @@ -33,27 +47,16 @@ import org.apache.hugegraph.service.schema.PropertyIndexService; import org.apache.hugegraph.service.schema.PropertyKeyService; import org.apache.hugegraph.service.schema.VertexLabelService; +import org.apache.hugegraph.structure.constant.EdgeLabelType; import org.apache.hugegraph.util.CollectionUtil; import org.apache.hugegraph.util.Ex; import org.apache.hugegraph.util.HubbleUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - import com.baomidou.mybatisplus.core.metadata.IPage; import com.google.common.collect.ImmutableList; @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/schema/edgelabels") +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/schema/edgelabels") public class EdgeLabelController extends SchemaController { private static final List PRESET_COLORS = ImmutableList.of( @@ -75,12 +78,17 @@ public class EdgeLabelController extends SchemaController { private EdgeLabelService elService; @GetMapping("optional-colors") - public List getOptionalColors(@PathVariable("connId") int connId) { + public List getOptionalColors() { return PRESET_COLORS; } @GetMapping - public IPage list(@PathVariable("connId") int connId, + public IPage list(@PathVariable("graphspace") + String graphSpace, + @PathVariable("graph") String graph, + @RequestParam(name = "edgelabel_type", + required = false) + String type, @RequestParam(name = "content", required = false) String content, @@ -95,30 +103,37 @@ public IPage list(@PathVariable("connId") int connId, required = false, defaultValue = "10") int pageSize) { - return this.listInPage(id -> this.elService.list(id), - connId, content, nameOrder, pageNo, pageSize); + HugeClient client = this.authClient(graphSpace, graph); + return this.listInPage(id -> this.elService.list(null, id, true, type), + client, content, nameOrder, pageNo, pageSize); } @GetMapping("{name}") - public EdgeLabelEntity get(@PathVariable("connId") int connId, + public EdgeLabelEntity get(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("name") String name) { - return this.elService.get(name, connId); + HugeClient client = this.authClient(graphSpace, graph); + return this.elService.get(name, client); } @PostMapping - public void create(@PathVariable("connId") int connId, + public void create(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody EdgeLabelEntity entity) { - this.checkParamsValid(entity, connId, true); - this.checkEntityUnique(entity, connId, true); + HugeClient client = this.authClient(graphSpace, graph); + this.checkParamsValid(entity, client, true); + this.checkEntityUnique(entity, client, true); entity.setCreateTime(HubbleUtil.nowDate()); - this.elService.add(entity, connId); + this.elService.add(entity, client); } @PostMapping("check_conflict") public ConflictDetail checkConflict( - @PathVariable("connId") int connId, - @RequestParam("reused_conn_id") int reusedConnId, - @RequestBody ConflictCheckEntity entity) { + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestParam("reused_graphspace") String reusedGraphSpace, + @RequestParam("reused_graph") String reusedGraph, + @RequestBody ConflictCheckEntity entity) { Ex.check(!CollectionUtils.isEmpty(entity.getElEntities()), "common.param.cannot-be-empty", "edgelabels"); Ex.check(CollectionUtils.isEmpty(entity.getPkEntities()), @@ -127,7 +142,8 @@ public ConflictDetail checkConflict( "common.param.must-be-null", "propertyindexes"); Ex.check(CollectionUtils.isEmpty(entity.getVlEntities()), "common.param.must-be-null", "vertexlabels"); - Ex.check(connId != reusedConnId, "schema.conn.cannot-reuse-self"); + Ex.check(graphSpace != reusedGraphSpace && graph != reusedGraph, + "schema.conn.cannot-reuse-self"); Set pkNames = new HashSet<>(); Set piNames = new HashSet<>(); @@ -138,59 +154,70 @@ public ConflictDetail checkConflict( vlNames.addAll(e.getLinkLabels()); } List vlEntities; - vlEntities = this.vlService.list(vlNames, reusedConnId, false); + HugeClient client = this.authClient(graphSpace, graph); + HugeClient reusedClient = this.authClient(reusedGraphSpace, + reusedGraph); + vlEntities = this.vlService.list(vlNames, reusedClient, false); for (VertexLabelEntity e : vlEntities) { pkNames.addAll(e.getPropNames()); piNames.addAll(e.getIndexProps()); } - entity.setPkEntities(this.pkService.list(pkNames, reusedConnId, false)); - entity.setPiEntities(this.piService.list(piNames, reusedConnId, false)); + entity.setPkEntities(this.pkService.list(pkNames, reusedClient, false)); + entity.setPiEntities(this.piService.list(piNames, reusedClient, false)); entity.setVlEntities(vlEntities); - return this.elService.checkConflict(entity, connId, false); + return this.elService.checkConflict(entity, client, false); } @PostMapping("recheck_conflict") public ConflictDetail recheckConflict( - @PathVariable("connId") int connId, - @RequestBody ConflictCheckEntity entity) { + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody ConflictCheckEntity entity) { Ex.check(!CollectionUtils.isEmpty(entity.getElEntities()), "common.param.cannot-be-empty", "edgelabels"); - return this.elService.checkConflict(entity, connId, true); + HugeClient client = this.authClient(graphSpace, graph); + return this.elService.checkConflict(entity, client, true); } @PostMapping("reuse") - public void reuse(@PathVariable("connId") int connId, + public void reuse(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody ConflictDetail detail) { - this.elService.reuse(detail, connId); + HugeClient client = this.authClient(graphSpace, graph); + this.elService.reuse(detail, client); } @PutMapping("{name}") - public void update(@PathVariable("connId") int connId, + public void update(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("name") String name, @RequestBody EdgeLabelUpdateEntity entity) { Ex.check(!StringUtils.isEmpty(name), "common.param.cannot-be-null-or-empty", name); entity.setName(name); + HugeClient client = this.authClient(graphSpace, graph); - this.elService.checkExist(name, connId); - checkParamsValid(this.pkService, entity, connId); - this.elService.update(entity, connId); + this.elService.checkExist(name, client); + checkParamsValid(this.pkService, entity, client); + this.elService.update(entity, client); } /** * Delete edge label doesn't need check checkUsing */ @DeleteMapping - public void delete(@PathVariable("connId") int connId, + public void delete(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam("names") List names) { + HugeClient client = this.authClient(graphSpace, graph); for (String name : names) { - this.elService.checkExist(name, connId); - this.elService.remove(name, connId); + this.elService.checkExist(name, client); + this.elService.remove(name, client); } } - private void checkParamsValid(EdgeLabelEntity entity, int connId, + private void checkParamsValid(EdgeLabelEntity entity, HugeClient client, boolean checkCreateTime) { String name = entity.getName(); Ex.check(name != null, "common.param.cannot-be-null", "name"); @@ -198,19 +225,25 @@ private void checkParamsValid(EdgeLabelEntity entity, int connId, "schema.edgelabel.unmatch-regex"); Ex.check(checkCreateTime, () -> entity.getCreateTime() == null, "common.param.must-be-null", "create_time"); + + EdgeLabelType type = EdgeLabelType.valueOf(entity.getEdgeLabelType()); + // skip check for PARENT type + if (type.parent()) { + return ; + } // Check source label and target label - checkRelation(entity, connId); + checkRelation(entity, client); // Check properties - checkProperties(this.pkService, entity.getProperties(), false, connId); + checkProperties(this.pkService, entity.getProperties(), false, client); // Check sort keys checkSortKeys(entity); // Check property index - checkPropertyIndexes(entity, connId); + checkPropertyIndexes(entity, client); // Check display fields and join symbols checkDisplayFields(entity); } - private void checkRelation(EdgeLabelEntity entity, int connId) { + private void checkRelation(EdgeLabelEntity entity, HugeClient client) { String sourceLabel = entity.getSourceLabel(); String targetLabel = entity.getTargetLabel(); Ex.check(!StringUtils.isEmpty(sourceLabel), @@ -220,8 +253,8 @@ private void checkRelation(EdgeLabelEntity entity, int connId) { "common.param.cannot-be-null-or-empty", "edgelabel.target_label"); - this.vlService.checkExist(sourceLabel, connId); - this.vlService.checkExist(targetLabel, connId); + this.vlService.checkExist(sourceLabel, client); + this.vlService.checkExist(targetLabel, client); } private void checkSortKeys(EdgeLabelEntity entity) { @@ -264,10 +297,10 @@ private static void checkDisplayFields(EdgeLabelEntity entity) { } } - private void checkEntityUnique(EdgeLabelEntity newEntity, int connId, + private void checkEntityUnique(EdgeLabelEntity newEntity, HugeClient client, boolean creating) { // The name must be unique String name = newEntity.getName(); - this.elService.checkNotExist(name, connId); + this.elService.checkNotExist(name, client); } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/PropertyIndexController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/PropertyIndexController.java index 731b11f82..d84692030 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/PropertyIndexController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/PropertyIndexController.java @@ -18,29 +18,27 @@ package org.apache.hugegraph.controller.schema; +import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.schema.PropertyIndex; import org.apache.hugegraph.service.schema.PropertyIndexService; import org.apache.hugegraph.structure.constant.HugeType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/schema/propertyindexes") +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs/" + + "{graph}/schema/propertyindexes") public class PropertyIndexController extends SchemaController { @Autowired private PropertyIndexService service; @GetMapping - public IPage list(@PathVariable("connId") int connId, + public IPage list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam(name = "is_vertex_label") boolean isVertexLabel, @RequestParam(name = "content", @@ -55,11 +53,12 @@ public IPage list(@PathVariable("connId") int connId, defaultValue = "10") int pageSize) { HugeType type = isVertexLabel ? HugeType.VERTEX_LABEL : - HugeType.EDGE_LABEL; + HugeType.EDGE_LABEL; + HugeClient client = this.authClient(graphSpace, graph); if (StringUtils.isEmpty(content)) { - return this.service.list(connId, type, pageNo, pageSize); + return this.service.list(client, type, pageNo, pageSize); } else { - return this.service.list(connId, type, content, pageNo, pageSize); + return this.service.list(client, type, content, pageNo, pageSize); } } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/PropertyKeyController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/PropertyKeyController.java index cdb56acc3..1adca0147 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/PropertyKeyController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/PropertyKeyController.java @@ -18,11 +18,10 @@ package org.apache.hugegraph.controller.schema; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.extern.log4j.Log4j2; import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.schema.ConflictCheckEntity; import org.apache.hugegraph.entity.schema.ConflictDetail; import org.apache.hugegraph.entity.schema.PropertyKeyEntity; @@ -33,29 +32,24 @@ import org.apache.hugegraph.util.HubbleUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import com.baomidou.mybatisplus.core.metadata.IPage; - -import lombok.extern.log4j.Log4j2; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Log4j2 @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/schema/propertykeys") +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/schema/propertykeys") public class PropertyKeyController extends SchemaController { @Autowired private PropertyKeyService service; @GetMapping - public IPage list(@PathVariable("connId") int connId, + public IPage list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam(name = "content", required = false) String content, @@ -70,29 +64,35 @@ public IPage list(@PathVariable("connId") int connId, required = false, defaultValue = "10") int pageSize) { + HugeClient client = this.authClient(graphSpace, graph); return this.listInPage(id -> this.service.list(id), - connId, content, nameOrder, pageNo, pageSize); + client, content, nameOrder, pageNo, pageSize); } @GetMapping("{name}") - public PropertyKeyEntity get(@PathVariable("connId") int connId, + public PropertyKeyEntity get(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("name") String name) { - return this.service.get(name, connId); + HugeClient client = this.authClient(graphSpace, graph); + return this.service.get(name, client); } @PostMapping - public void create(@PathVariable("connId") int connId, + public void create(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody PropertyKeyEntity entity) { + HugeClient client = this.authClient(graphSpace, graph); this.checkParamsValid(entity, true); - this.checkEntityUnique(entity, connId); + this.checkEntityUnique(entity, client); entity.setCreateTime(HubbleUtil.nowDate()); - this.service.add(entity, connId); + this.service.add(entity, client); } @PostMapping("check_conflict") public ConflictDetail checkConflict( - @PathVariable("connId") int connId, - @RequestBody ConflictCheckEntity entity) { + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody ConflictCheckEntity entity) { List entities = entity.getPkEntities(); Ex.check(!CollectionUtils.isEmpty(entities), "common.param.cannot-be-empty", "entities"); @@ -103,13 +103,15 @@ public ConflictDetail checkConflict( Ex.check(CollectionUtils.isEmpty(entity.getElEntities()), "common.param.must-be-null", "edgelabels"); entities.forEach(e -> this.checkParamsValid(e, false)); - return this.service.checkConflict(entity, connId, false); + HugeClient client = this.authClient(graphSpace, graph); + return this.service.checkConflict(entity, client, false); } @PostMapping("recheck_conflict") public ConflictDetail recheckConflict( - @PathVariable("connId") int connId, - @RequestBody ConflictCheckEntity entity) { + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody ConflictCheckEntity entity) { Ex.check(!CollectionUtils.isEmpty(entity.getPkEntities()), "common.param.cannot-be-empty", "propertykeys"); Ex.check(CollectionUtils.isEmpty(entity.getPiEntities()), @@ -118,26 +120,31 @@ public ConflictDetail recheckConflict( "common.param.must-be-null", "vertexlabels"); Ex.check(CollectionUtils.isEmpty(entity.getElEntities()), "common.param.must-be-null", "edgelabels"); - return this.service.checkConflict(entity, connId, true); + HugeClient client = this.authClient(graphSpace, graph); + return this.service.checkConflict(entity, client, true); } @PostMapping("reuse") - public void reuse(@PathVariable("connId") int connId, + public void reuse(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody ConflictDetail detail) { Ex.check(!CollectionUtils.isEmpty(detail.getPkConflicts()), "common.param.cannot-be-empty", "propertykey_conflicts"); - this.service.reuse(detail, connId); + HugeClient client = this.authClient(graphSpace, graph); + this.service.reuse(detail, client); } @PostMapping("check_using") - public Map checkUsing(@PathVariable("connId") int connId, + public Map checkUsing(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody UsingCheckEntity entity) { Ex.check(!CollectionUtils.isEmpty(entity.getNames()), "common.param.cannot-be-empty", "names"); Map inUsing = new LinkedHashMap<>(); + HugeClient client = this.authClient(graphSpace, graph); for (String name : entity.getNames()) { - this.service.checkExist(name, connId); - inUsing.put(name, this.service.checkUsing(name, connId)); + this.service.checkExist(name, client); + inUsing.put(name, this.service.checkUsing(name, client)); } return inUsing; } @@ -146,14 +153,16 @@ public Map checkUsing(@PathVariable("connId") int connId, * Should request "check_using" before delete */ @DeleteMapping - public void delete(@PathVariable("connId") int connId, + public void delete(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam List names, @RequestParam(name = "skip_using", defaultValue = "false") boolean skipUsing) { + HugeClient client = this.authClient(graphSpace, graph); for (String name : names) { - this.service.checkExist(name, connId); - if (this.service.checkUsing(name, connId)) { + this.service.checkExist(name, client); + if (this.service.checkUsing(name, client)) { if (skipUsing) { continue; } else { @@ -161,7 +170,7 @@ public void delete(@PathVariable("connId") int connId, name); } } - this.service.remove(name, connId); + this.service.remove(name, client); } } @@ -179,9 +188,10 @@ private void checkParamsValid(PropertyKeyEntity entity, "common.param.must-be-null", "create_time"); } - private void checkEntityUnique(PropertyKeyEntity newEntity, int connId) { + private void checkEntityUnique(PropertyKeyEntity newEntity, + HugeClient client) { // The name must be unique String name = newEntity.getName(); - this.service.checkNotExist(name, connId); + this.service.checkNotExist(name, client); } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/SchemaController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/SchemaController.java index 9924afca5..e76ade617 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/SchemaController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/SchemaController.java @@ -18,139 +18,134 @@ package org.apache.hugegraph.controller.schema; -import java.util.ArrayList; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; import java.util.Comparator; import java.util.Date; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.exception.ExternalException; +import org.apache.hugegraph.exception.HugeException; +import org.apache.hugegraph.service.schema.SchemaService; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.collect.ImmutableMap; + +import org.apache.hugegraph.util.Log; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.controller.BaseController; -import org.apache.hugegraph.entity.schema.EdgeLabelEntity; import org.apache.hugegraph.entity.schema.LabelUpdateEntity; import org.apache.hugegraph.entity.schema.Property; import org.apache.hugegraph.entity.schema.PropertyIndex; -import org.apache.hugegraph.entity.schema.PropertyKeyEntity; import org.apache.hugegraph.entity.schema.SchemaEntity; import org.apache.hugegraph.entity.schema.SchemaLabelEntity; import org.apache.hugegraph.entity.schema.Timefiable; -import org.apache.hugegraph.entity.schema.VertexLabelEntity; import org.apache.hugegraph.exception.InternalException; -import org.apache.hugegraph.service.schema.EdgeLabelService; import org.apache.hugegraph.service.schema.PropertyKeyService; -import org.apache.hugegraph.service.schema.VertexLabelService; -import org.apache.hugegraph.structure.constant.IdStrategy; import org.apache.hugegraph.util.Ex; import org.apache.hugegraph.util.PageUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - import com.baomidou.mybatisplus.core.metadata.IPage; -import com.fasterxml.jackson.annotation.JsonProperty; + +import javax.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/schema") +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/schema") public class SchemaController extends BaseController { - @Autowired - private PropertyKeyService pkService; - @Autowired - private VertexLabelService vlService; - @Autowired - private EdgeLabelService elService; - - @GetMapping("graphview") - public SchemaView displayInSchemaView(@PathVariable("connId") int connId) { - List propertyKeys = this.pkService.list(connId); - List vertexLabels = this.vlService.list(connId); - List edgeLabels = this.elService.list(connId); - - List> vertices = new ArrayList<>(vertexLabels.size()); - for (VertexLabelEntity entity : vertexLabels) { - Map vertex = new LinkedHashMap<>(); - vertex.put("id", entity.getName()); - vertex.put("label", entity.getName()); - if (entity.getIdStrategy() == IdStrategy.PRIMARY_KEY) { - vertex.put("primary_keys", entity.getPrimaryKeys()); - } else { - vertex.put("primary_keys", new ArrayList<>()); - } - Map properties = new LinkedHashMap<>(); - this.fillProperties(properties, entity, propertyKeys); - vertex.put("properties", properties); - vertex.put("~style", entity.getStyle()); - vertices.add(vertex); - } + public static Logger log = Log.logger(SchemaController.class); - List> edges = new ArrayList<>(edgeLabels.size()); - for (EdgeLabelEntity entity : edgeLabels) { - Map edge = new LinkedHashMap<>(); - String edgeId = String.format( - "%s-%s->%s", entity.getSourceLabel(), - entity.getName(), entity.getTargetLabel()); - edge.put("id", edgeId); - edge.put("label", entity.getName()); - edge.put("source", entity.getSourceLabel()); - edge.put("target", entity.getTargetLabel()); - if (entity.isLinkMultiTimes()) { - edge.put("sort_keys", entity.getSortKeys()); - } else { - edge.put("sort_keys", new ArrayList<>()); - } - Map properties = new LinkedHashMap<>(); - this.fillProperties(properties, entity, propertyKeys); - edge.put("properties", properties); - edge.put("~style", entity.getStyle()); - edges.add(edge); - } - return new SchemaView(vertices, edges); + @Autowired + private SchemaService schemaService; + @GetMapping("groovy") + public Object schemaGroovy(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph) { + HugeClient client = this.authClient(graphSpace, graph); + return ImmutableMap.of("schema", client.schema().getGroovySchema()); } - private void fillProperties(Map properties, - SchemaLabelEntity entity, - List propertyKeys) { - for (Property property : entity.getProperties()) { - String name = property.getName(); - PropertyKeyEntity pkEntity = findPropertyKey(propertyKeys, name); - properties.put(name, pkEntity.getDataType().string()); + @PostMapping("groovy") + public Object addSchemaGroovy(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody SchemaGroovy schemaGroovy) { + HugeClient client = this.authClient(graphSpace, graph); + String content = schemaGroovy.getSchemaGroovy(); + log.info("Add schema groovy: {}", content); + checkSchemaGroovy(content); + try { + client.gremlin().gremlin(content).execute(); + }catch (Exception e) { + throw new HugeException( + "Add schema groovy failed. caused by" + e.getMessage()); } + return ImmutableMap.of("schema-groovy", content); } - private PropertyKeyEntity findPropertyKey(List entities, - String name) { - for (PropertyKeyEntity entity : entities) { - if (entity.getName().equals(name)) { - return entity; + private void checkSchemaGroovy(String content) { + String[] lines = content.split("\n|;"); + for (String line : lines) { + if (StringUtils.isEmpty(line)) { + continue; + } + if (!line.startsWith("graph.schema()")) { + throw new ExternalException( + "Schema Groovy each row must start with 'graph.schema" + + "().'"); } } - throw new InternalException("schema.propertykey.not-exist", name); } - @AllArgsConstructor - private static class SchemaView { + @GetMapping("groovy/export") + public void schemaGroovyExport(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + HttpServletResponse response) { + HugeClient client = this.authClient(graphSpace, graph); + String schema = client.schema().getGroovySchema(); - @JsonProperty("vertices") - private List> vertices; + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html"); + String fileName = String.format("%s_%s.schema", graphSpace, graph); + response.setHeader("Content-Disposition", "attachment;fileName=" + fileName); + try { + OutputStream os = response.getOutputStream(); + os.write(schema.getBytes(StandardCharsets.UTF_8)); + os.close(); + } catch (IOException e) { + throw new InternalException("Schema File Write Error", e); + } + } - @JsonProperty("edges") - private List> edges; + @GetMapping("graphview") + public SchemaService.SchemaView displayInSchemaView(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph) { + HugeClient client = this.authClient(graphSpace, graph); + return schemaService.getSchemaView(client); } public IPage listInPage( - Function> fetcher, - int connId, String content, - String nameOrder, - int pageNo, int pageSize) { + Function> fetcher, + HugeClient client, String content, + String nameOrder, + int pageNo, int pageSize) { Boolean nameOrderAsc = null; if (!StringUtils.isEmpty(nameOrder)) { Ex.check(ORDER_ASC.equals(nameOrder) || ORDER_DESC.equals(nameOrder), @@ -158,7 +153,7 @@ public IPage listInPage( nameOrderAsc = ORDER_ASC.equals(nameOrder); } - List entities = fetcher.apply(connId); + List entities = fetcher.apply(client); if (!StringUtils.isEmpty(content)) { // Select by content entities = entities.stream() @@ -238,20 +233,21 @@ public void sortByRelativity(List entities, */ public static void checkProperties(PropertyKeyService service, Set properties, - boolean mustNullable, int connId) { + boolean mustNullable, + HugeClient client) { if (properties == null) { return; } for (Property property : properties) { String pkName = property.getName(); - service.checkExist(pkName, connId); + service.checkExist(pkName, client); Ex.check(mustNullable, property::isNullable, "schema.propertykey.must-be-nullable", pkName); } } public static void checkPropertyIndexes(SchemaLabelEntity entity, - int connId) { + HugeClient client) { List propertyIndexes = entity.getPropertyIndexes(); if (propertyIndexes != null) { for (PropertyIndex propertyIndex : propertyIndexes) { @@ -268,8 +264,24 @@ public static void checkPropertyIndexes(SchemaLabelEntity entity, } public static void checkParamsValid(PropertyKeyService service, - LabelUpdateEntity entity, int connId) { + LabelUpdateEntity entity, + HugeClient client) { // All append property should be nullable - checkProperties(service, entity.getAppendProperties(), true, connId); + checkProperties(service, entity.getAppendProperties(), true, client); + } + + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class SchemaGroovy { + @JsonProperty("schema-groovy") + private String schemaGroovy; + + @Override + public String toString() { + return this.schemaGroovy; + } } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/VertexLabelController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/VertexLabelController.java index b34608d56..07c250c2d 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/VertexLabelController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/VertexLabelController.java @@ -18,11 +18,29 @@ package org.apache.hugegraph.controller.schema; -import java.util.HashSet; -import java.util.LinkedHashMap; +//import java.util.*; import java.util.List; -import java.util.Map; import java.util.Set; +import java.util.HashSet; +import java.util.Map; +import java.util.LinkedHashMap; +import java.util.stream.Collectors; + +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.schema.vertexlabel.ParamEntity; +import org.apache.hugegraph.entity.schema.vertexlabel.ParamStyle; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.entity.schema.ConflictCheckEntity; @@ -39,24 +57,12 @@ import org.apache.hugegraph.util.CollectionUtil; import org.apache.hugegraph.util.Ex; import org.apache.hugegraph.util.HubbleUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - import com.baomidou.mybatisplus.core.metadata.IPage; import com.google.common.collect.ImmutableList; @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/schema/vertexlabels") +@RequestMapping(Constant.API_V1_3 + "graphspaces/{graphspace}/graphs" + + "/{graph}/schema/vertexlabels") public class VertexLabelController extends SchemaController { private static final List PRESET_COLORS = ImmutableList.of( @@ -76,19 +82,22 @@ public class VertexLabelController extends SchemaController { private VertexLabelService vlService; @GetMapping("optional-colors") - public List getOptionalColors(@PathVariable("connId") int connId) { + public List getOptionalColors() { return PRESET_COLORS; } @GetMapping("{name}/link") - public List getLinkEdgeLabels(@PathVariable("connId") int connId, + public List getLinkEdgeLabels(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("name") String name) { - this.vlService.checkExist(name, connId); - return this.vlService.getLinkEdgeLabels(name, connId); + HugeClient client = this.authClient(graphSpace, graph); + this.vlService.checkExist(name, client); + return this.vlService.getLinkEdgeLabels(name, client); } @GetMapping - public IPage list(@PathVariable("connId") int connId, + public IPage list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam(name = "content", required = false) String content, @@ -103,30 +112,38 @@ public IPage list(@PathVariable("connId") int connId, required = false, defaultValue = "10") int pageSize) { - return this.listInPage(id -> this.vlService.list(id), - connId, content, nameOrder, pageNo, pageSize); + HugeClient client = this.authClient(graphSpace, graph); + return this.listInPage(c -> this.vlService.list(c), + client, content, nameOrder, pageNo, pageSize); } @GetMapping("{name}") - public VertexLabelEntity get(@PathVariable("connId") int connId, + public VertexLabelEntity get(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("name") String name) { - return this.vlService.get(name, connId); + HugeClient client = this.authClient(graphSpace, graph); + return this.vlService.get(name, client); } @PostMapping - public void create(@PathVariable("connId") int connId, + public void create(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody VertexLabelEntity entity) { - this.checkParamsValid(entity, connId, true); - this.checkEntityUnique(entity, connId, true); + HugeClient client = this.authClient(graphSpace, graph); + + this.checkParamsValid(entity, client, true); + this.checkEntityUnique(entity, client, true); entity.setCreateTime(HubbleUtil.nowDate()); - this.vlService.add(entity, connId); + this.vlService.add(entity, client); } @PostMapping("check_conflict") public ConflictDetail checkConflicts( - @PathVariable("connId") int connId, - @RequestParam("reused_conn_id") int reusedConnId, - @RequestBody ConflictCheckEntity entity) { + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestParam("reused_graphspace") String reusedGraphSpace, + @RequestParam("reused_graph") String reusedGraph, + @RequestBody ConflictCheckEntity entity) { Ex.check(!CollectionUtils.isEmpty(entity.getVlEntities()), "common.param.cannot-be-empty", "vertexlabels"); Ex.check(CollectionUtils.isEmpty(entity.getPkEntities()), @@ -135,7 +152,8 @@ public ConflictDetail checkConflicts( "common.param.must-be-null", "propertyindexes"); Ex.check(CollectionUtils.isEmpty(entity.getElEntities()), "common.param.must-be-null", "edgelabels"); - Ex.check(connId != reusedConnId, "schema.conn.cannot-reuse-self"); + Ex.check(graphSpace != reusedGraphSpace && graph != reusedGraph, + "schema.conn.cannot-reuse-self"); Set pkNames = new HashSet<>(); Set piNames = new HashSet<>(); @@ -144,64 +162,78 @@ public ConflictDetail checkConflicts( piNames.addAll(e.getIndexProps()); } - entity.setPkEntities(this.pkService.list(pkNames, reusedConnId, false)); - entity.setPiEntities(this.piService.list(piNames, reusedConnId, false)); - return this.vlService.checkConflict(entity, connId, false); + HugeClient client = this.authClient(graphSpace, graph); + HugeClient reusedClient = this.authClient(reusedGraphSpace, reusedGraph); + + entity.setPkEntities(this.pkService.list(pkNames, reusedClient, false)); + entity.setPiEntities(this.piService.list(piNames, reusedClient, false)); + return this.vlService.checkConflict(entity, client, false); } @PostMapping("recheck_conflict") public ConflictDetail recheckConflicts( - @PathVariable("connId") int connId, - @RequestBody ConflictCheckEntity entity) { + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody ConflictCheckEntity entity) { Ex.check(!CollectionUtils.isEmpty(entity.getVlEntities()), "common.param.cannot-be-empty", "vertexlabels"); Ex.check(CollectionUtils.isEmpty(entity.getElEntities()), "common.param.must-be-null", "edgelabels"); - return this.vlService.checkConflict(entity, connId, true); + + HugeClient client = this.authClient(graphSpace, graph); + return this.vlService.checkConflict(entity, client, true); } @PostMapping("reuse") - public void reuse(@PathVariable("connId") int connId, + public void reuse(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestBody ConflictDetail detail) { - this.vlService.reuse(detail, connId); + HugeClient client = this.authClient(graphSpace, graph); + this.vlService.reuse(detail, client); } @PutMapping("{name}") - public void update(@PathVariable("connId") int connId, + public void update(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("name") String name, @RequestBody VertexLabelUpdateEntity entity) { Ex.check(!StringUtils.isEmpty(name), "common.param.cannot-be-null-or-empty", name); entity.setName(name); + HugeClient client = this.authClient(graphSpace, graph); - this.vlService.checkExist(name, connId); - checkParamsValid(this.pkService, entity, connId); - this.vlService.update(entity, connId); + this.vlService.checkExist(name, client); + checkParamsValid(this.pkService, entity, client); + this.vlService.update(entity, client); } @PostMapping("check_using") public Map checkUsing( - @PathVariable("connId") int connId, - @RequestBody UsingCheckEntity entity) { + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody UsingCheckEntity entity) { Ex.check(!CollectionUtils.isEmpty(entity.getNames()), "common.param.cannot-be-empty", "names"); Map inUsing = new LinkedHashMap<>(); + HugeClient client = this.authClient(graphSpace, graph); for (String name : entity.getNames()) { - this.vlService.checkExist(name, connId); - inUsing.put(name, this.vlService.checkUsing(name, connId)); + this.vlService.checkExist(name, client); + inUsing.put(name, this.vlService.checkUsing(name, client)); } return inUsing; } @DeleteMapping - public void delete(@PathVariable("connId") int connId, + public void delete(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam("names") List names, @RequestParam(name = "skip_using", defaultValue = "false") boolean skipUsing) { + HugeClient client = this.authClient(graphSpace, graph); for (String name : names) { - this.vlService.checkExist(name, connId); - if (this.vlService.checkUsing(name, connId)) { + this.vlService.checkExist(name, client); + if (this.vlService.checkUsing(name, client)) { if (skipUsing) { continue; } else { @@ -209,11 +241,11 @@ public void delete(@PathVariable("connId") int connId, name); } } - this.vlService.remove(name, connId); + this.vlService.remove(name, client); } } - private void checkParamsValid(VertexLabelEntity entity, int connId, + private void checkParamsValid(VertexLabelEntity entity, HugeClient client, boolean checkCreateTime) { String name = entity.getName(); Ex.check(name != null, "common.param.cannot-be-null", "name"); @@ -222,11 +254,11 @@ private void checkParamsValid(VertexLabelEntity entity, int connId, Ex.check(checkCreateTime, () -> entity.getCreateTime() == null, "common.param.must-be-null", "create_time"); // Check properties - checkProperties(this.pkService, entity.getProperties(), false, connId); + checkProperties(this.pkService, entity.getProperties(), false, client); // Check primary keys checkPrimaryKeys(entity); // Check property index - checkPropertyIndexes(entity, connId); + checkPropertyIndexes(entity, client); // Check display fields and join symbols checkDisplayFields(entity); } @@ -271,10 +303,98 @@ private void checkPrimaryKeys(VertexLabelEntity entity) { } } - private void checkEntityUnique(VertexLabelEntity newEntity, int connId, + private void checkEntityUnique(VertexLabelEntity newEntity, + HugeClient client, boolean creating) { // The name must be unique String name = newEntity.getName(); - this.vlService.checkNotExist(name, connId); + this.vlService.checkNotExist(name, client); + } + + @GetMapping("{name}/new") + public ParamEntity getNew(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("name") String name) { + HugeClient client = this.authClient(graphSpace, graph); + return this.labelDataToParam(this.vlService.get(name, client)); + } + + @PutMapping("{name}/new") + public void updateNew(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("name") String name, + @RequestBody VertexLabelUpdateEntity entity) { + Ex.check(!StringUtils.isEmpty(name), + "common.param.cannot-be-null-or-empty", name); + entity.setName(name); + HugeClient client = this.authClient(graphSpace, graph); + + this.vlService.checkExist(name, client); + checkParamsValid(this.pkService, entity, client); + this.vlService.update(entity, client); + } + + @PostMapping("create_new") + public void createNew(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @RequestBody ParamEntity entity) { + HugeClient client = this.authClient(graphSpace, graph); + + VertexLabelEntity formatEntity = this.paramToLabelData(entity); + + this.checkParamsValid(formatEntity, client, true); + this.checkEntityUnique(formatEntity, client, true); + formatEntity.setCreateTime(HubbleUtil.nowDate()); + this.vlService.add(formatEntity, client); + } + + private VertexLabelEntity paramToLabelData(ParamEntity entity) { + List displayFields = entity.getDisplayFields(); + + if (!CollectionUtils.isEmpty(displayFields)) { + displayFields.add("~id"); + } else { + displayFields = ImmutableList.of("~id"); + } + + VertexLabelStyle style = new VertexLabelStyle(); + style.setColor(entity.getStyle().getColor()); + style.setSize(entity.getStyle().getSize()); + style.setDisplayFields(displayFields); + + VertexLabelEntity newEntity = new VertexLabelEntity(); + newEntity.setIdStrategy(entity.getIdStrategy()); + newEntity.setName(entity.getName()); + newEntity.setProperties(entity.getProperties()); + newEntity.setPropertyIndexes(entity.getPropertyIndexes()); + newEntity.setOpenLabelIndex(entity.getOpenLabelIndex()); + newEntity.setPrimaryKeys(entity.getPrimaryKeys()); + newEntity.setStyle(style); + + return newEntity; + } + + // format backend data to front + private ParamEntity labelDataToParam(VertexLabelEntity entity) { +// Logger Logger = LoggerFactory.getLogger(getClass()); + + ParamStyle style = new ParamStyle(); + style.setColor(entity.getStyle().getColor()); + style.setSize(entity.getStyle().getSize()); + + List displayFields = entity.getStyle().getDisplayFields().stream() + .filter(v -> !("~id".equals(v))).collect(Collectors.toList()); + + ParamEntity newEntity = new ParamEntity(); + newEntity.setIdStrategy(entity.getIdStrategy()); + newEntity.setName(entity.getName()); + newEntity.setProperties(entity.getProperties()); + newEntity.setPropertyIndexes(entity.getPropertyIndexes()); + newEntity.setOpenLabelIndex(entity.getOpenLabelIndex()); + newEntity.setPrimaryKeys(entity.getPrimaryKeys()); + newEntity.setStyle(style); + newEntity.setDisplayFields(displayFields); + + return newEntity; } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/sketch/GraphSketchController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/sketch/GraphSketchController.java new file mode 100644 index 000000000..7e3b834b4 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/sketch/GraphSketchController.java @@ -0,0 +1,169 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.sketch;///* +// * Copyright 2017 HugeGraph Authors +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.controller.sketch; +// +//import org.apache.hadoop.fs.FSDataInputStream; +//import org.apache.hadoop.fs.FileStatus; +//import org.apache.hadoop.fs.FileSystem; +//import org.apache.hadoop.fs.Path; +//import org.apache.hadoop.fs.PathFilter; +//import org.apache.hugegraph.config.HugeConfig; +//import org.apache.hugegraph.util.E; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.PathVariable; +//import org.springframework.web.bind.annotation.PostMapping; +//import org.springframework.web.bind.annotation.RequestBody; +//import org.springframework.web.bind.annotation.RequestMapping; +// +//import org.springframework.web.bind.annotation.RequestParam; +//import org.springframework.web.bind.annotation.RestController; +//import org.apache.hadoop.conf.Configuration; +// +//import java.net.URI; +//import java.net.URLEncoder; +//import java.util.List; +//import java.util.Map; +// +//import javax.servlet.ServletOutputStream; +//import javax.servlet.http.HttpServletResponse; +// +//import org.apache.hugegraph.client.api.graph.GraphSketchAPI; +//import org.apache.hugegraph.common.Constant; +//import org.apache.hugegraph.controller.BaseController; +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.options.HubbleOptions; +// +// +//@RestController +//@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs/" + +// "{graph}/graph-sketch") +//public class GraphSketchController extends BaseController { +// +// @Autowired +// private HugeConfig config; +// +// @GetMapping +// public Object get(@PathVariable("graphspace") String graphSpace, +// @PathVariable("graph") String graph) { +// HugeClient hugeClient = this.authClient(graphSpace, graph); +// return hugeClient.graph().getSketch(); +// } +// +// @PostMapping +// public Object createSketchTask( +// @PathVariable("graphspace") String graphSpace, +// @PathVariable("graph") String graph, +// @RequestBody Map> algorithms) { +// List list = algorithms.get("algorithms"); +// E.checkArgument(algorithms.get("algorithms") != null && +// algorithms.size() == 1, "Invalid algorithms param."); +// HugeClient hugeClient = this.authClient(graphSpace, graph); +// GraphSketchAPI.JsonSketchTask sketchTask = GraphSketchAPI.JsonSketchTask +// .builder().algorithms(list) +// .afsPassword(config.get(HubbleOptions.AFS_PASSWORD)) +// .afsUser(config.get(HubbleOptions.AFS_USER)) +// .afsUri(config.get(HubbleOptions.AFS_URI)) +// .afsDir(config.get(HubbleOptions.AFS_DIR)) +// .username(this.getUser()) +// .password((String) this.getSession("password")) +// .build(); +// return hugeClient.graph().createSketchTask(sketchTask); +// } +// +// +// @GetMapping("/download") +// public void download( +// @PathVariable("graphspace") String graphSpace, +// @PathVariable("graph") String graph, +// @RequestParam(name = "afs_uri", required = true) String afsUri, +// @RequestParam(name = "afs_file", required = true) String afsFile, +// HttpServletResponse response) throws Exception { +// // 获取配置 +// String afsUriConf = config.get(HubbleOptions.AFS_URI); +// String afsDirConf = config.get(HubbleOptions.AFS_DIR); +// String afsUserConf = config.get(HubbleOptions.AFS_USER); +// String afsPasswordConf = config.get(HubbleOptions.AFS_PASSWORD); +// +// // 校验参数 +// E.checkArgument(afsUriConf.equals(afsUri), "Invalid afs uri"); +// E.checkArgument(afsFile.startsWith(afsDirConf), "Invalid afs file"); +// String fileName = afsFile.substring(afsDirConf.length()); +// String[] split = fileName.split("-"); +// E.checkArgument(split[0].equals(graphSpace), "Invalid graphspace"); +// E.checkArgument(split[1].equals(graph), "Invalid graph"); +// +// // 配置afs conf +// Configuration conf = new Configuration(); +// conf.set("fs.afs.impl", "org.apache.hadoop.fs.DFileSystem"); +// conf.set("fs.AbstractFileSystem.afs.impl", "org.apache.hadoop.fs.Afs"); +// conf.set("hadoop.job.ugi", afsUserConf + "," + afsPasswordConf); +// conf.set("dfs.use.native.api", "0"); // 0是默认值,需要afs_agent,1不需要afs_agent +// URI uri = new URI(afsUriConf); +// FileSystem fs = FileSystem.get(uri, conf); +// +// // 获取文件列表 +// Path directoryPath = new Path(afsDirConf); +// // 获取fileName开头的所有文件 (vermeer写入的文件数目不固定) +// FileStatus[] fileStatuses = +// fs.listStatus(directoryPath, new PathFilter() { +// @Override +// public boolean accept(Path path) { +// return path.getName().startsWith(fileName); +// } +// }); +// response.setHeader("content-disposition", "attachment;filename=" + +// URLEncoder.encode(fileName, "utf-8")); +// ServletOutputStream outputStream = response.getOutputStream(); +// // 遍历所有文件,将文件内容写入输出流 +// for (FileStatus status : fileStatuses) { +// Path filePath = status.getPath(); +// FSDataInputStream inputStream = fs.open(filePath); +// // 读取文件并写入输出流 +// byte[] bytes = new byte[1024 * 10]; +// int read; +// do { +// read = inputStream.read(bytes); +// outputStream.write(bytes, 0, read); +// } while (-1 != read); +// inputStream.close(); +// } +// outputStream.close(); +// } +//} +//TODO removed diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/ComputerDisController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/ComputerDisController.java new file mode 100644 index 000000000..631a3f02c --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/ComputerDisController.java @@ -0,0 +1,75 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.space; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.service.space.ComputerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/jobs/computerdis") +public class ComputerDisController extends BaseController { + + @Autowired + ComputerService computerService; + + @GetMapping + public IPage queryPage(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph, + @RequestParam(name = "query", required = false, + defaultValue = "") String query, + @RequestParam(name = "page_no", required = false, + defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", required = false, + defaultValue = "10") int pageSize) { + HugeClient client = this.authClient(graphspace, graph); + return computerService.queryPage(client, query, pageNo, pageSize); + } + + @GetMapping("{id}/cancel") + public void cancel(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph, + @PathVariable("id") long id) { + + HugeClient client = this.authClient(graphspace, graph); + computerService.cancel(client, id); + } + + @GetMapping("{id}") + public Object get(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph, + @PathVariable("id") long id) { + HugeClient client = this.authClient(graphspace, graph); + return computerService.get(client, id); + } + + @DeleteMapping("{id}") + public void delete(@PathVariable("graphspace") String graphspace, + @PathVariable("graph") String graph, + @PathVariable("id") long id) { + HugeClient client = this.authClient(graphspace, graph); + computerService.delete(client, id); + + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/GraphSpaceController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/GraphSpaceController.java new file mode 100644 index 000000000..30068558d --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/GraphSpaceController.java @@ -0,0 +1,244 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.space; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import org.apache.commons.collections4.SetUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.GraphConnection; +import org.apache.hugegraph.entity.space.BuiltInEntity; +import org.apache.hugegraph.entity.space.GraphSpaceEntity; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.service.auth.UserService; +import org.apache.hugegraph.service.graphs.GraphsService; +import org.apache.hugegraph.service.space.GraphSpaceService; +import org.apache.hugegraph.structure.space.GraphSpace; +import org.apache.hugegraph.util.E; +import org.apache.hugegraph.util.Ex; +import org.apache.hugegraph.util.UrlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping(Constant.API_VERSION + "graphspaces") +public class GraphSpaceController extends BaseController { + private static final int DEFAULT_MEMORY_VALUE = 128; + private static final int DEFAULT_CPU_VALUE = 64; + + @Autowired + private GraphSpaceService graphSpaceService; + + @Autowired + private UserService userService; + + @Autowired + GraphsService graphsService; + @Autowired + HugeConfig config; + + private boolean isPdEnabled() { + return config.get(HubbleOptions.PD_ENABLED); + } + + @GetMapping("list") + public Object list() { + if (!isPdEnabled()) { + return ImmutableMap.of("graphspaces", + Collections.singletonList("DEFAULT")); + } + + List graphSpaces = + this.graphSpaceService.listAll(this.authClient(null, null)); + return ImmutableMap.of("graphspaces", graphSpaces); + } + + @GetMapping + public Object queryPage(@RequestParam(name = "query", required = false, + defaultValue = "") String query, + @RequestParam(name = "create_time", required = false, + defaultValue = "") String createTime, + @RequestParam(name = "page_no", required = false, + defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", required = false, + defaultValue = "10") int pageSize, + @RequestParam(name = "all", required = false, + defaultValue = "false") boolean all) { + if (!isPdEnabled()) { + return ImmutableMap.of("records", Collections.emptyList(), + "total", 0); + } + if (all) { + return this.graphSpaceService.queryAllGs( + this.authClient(null, null), query, createTime); + } + return graphSpaceService.queryPage(this.authClient(null, null), + query, createTime, pageNo, pageSize); + } + + @GetMapping("{graphspace}/auth") + public Object isAuth(@PathVariable("graphspace") String graphSpace) { + if (!isPdEnabled()) { + return ImmutableMap.of("auth", false); + } + boolean isAuth = graphSpaceService.isAuth(this.authClient(null, null), + graphSpace); + return ImmutableMap.of("auth", isAuth); + } + + @GetMapping("{graphspace}") + public GraphSpaceEntity get(@PathVariable("graphspace") String graphspace) { + if (!isPdEnabled()) { + // Return a minimal stub entity for non-PD mode + GraphSpaceEntity stub = new GraphSpaceEntity(); + stub.setName(graphspace); + stub.setNickname(graphspace); + return stub; + } + HugeClient client = this.authClient(null, null); + // Get GraphSpace Info + return graphSpaceService.getWithAdmins(client, graphspace); + } + + @PostMapping + public Object add(@RequestBody GraphSpaceEntity graphSpaceEntity) { + E.checkArgument(isPdEnabled(), + "GraphSpace management is not supported in standalone mode"); + // Create GraphSpace + HugeClient client = this.authClient(null, null); + if (graphSpaceEntity.getCpuLimit() <= 0) { + graphSpaceEntity.setCpuLimit(DEFAULT_CPU_VALUE); + } + if (graphSpaceEntity.getMemoryLimit() <= 0) { + graphSpaceEntity.setMemoryLimit(DEFAULT_MEMORY_VALUE); + } + if (graphSpaceEntity.getComputeCpuLimit() <= 0) { + graphSpaceEntity.setComputeCpuLimit(DEFAULT_CPU_VALUE); + } + if (graphSpaceEntity.getComputeMemoryLimit() <= 0) { + graphSpaceEntity.setComputeCpuLimit(DEFAULT_MEMORY_VALUE); + } + + graphSpaceService.create(client, graphSpaceEntity.convertGraphSpace()); + + // Add GraphSpace Admin + graphSpaceEntity.graphspaceAdmin.forEach(u -> { + client.auth().addSpaceAdmin(u, graphSpaceEntity.getName()); + }); + + return get(graphSpaceEntity.getName()); + } + + @PutMapping("{graphspace}") + public GraphSpace update(@PathVariable("graphspace") String graphspace, + @RequestBody GraphSpaceEntity graphSpaceEntity) { + E.checkArgument(isPdEnabled(), + "GraphSpace management is not supported in standalone mode"); + + graphSpaceEntity.setName(graphspace); + + HugeClient client = this.authClient(null, null); + + // Update graphspace + graphSpaceService.update(client, graphSpaceEntity.convertGraphSpace()); + + // Update graphspace admin + ImmutableSet oldSpaceAdmins + = ImmutableSet.copyOf(userService.listGraphSpaceAdmin(client, + graphspace)); + ImmutableSet curSpaceAdmins + = ImmutableSet.copyOf(graphSpaceEntity.graphspaceAdmin); + + // a. Del + SetUtils.difference(oldSpaceAdmins, curSpaceAdmins).forEach(u -> { + client.auth().delSpaceAdmin(u, graphspace); + }); + // b. Add + SetUtils.difference(curSpaceAdmins, oldSpaceAdmins).forEach(u -> { + client.auth().addSpaceAdmin(u, graphspace); + }); + + return get(graphSpaceEntity.getName()); + } + + @DeleteMapping("{graphspace}") + public void delete(@PathVariable("graphspace") String graphspace) { + E.checkArgument(isPdEnabled(), + "GraphSpace management is not supported in standalone mode"); + E.checkArgument(StringUtils.isNotEmpty(graphspace), "graphspace " + + "must not null"); + + HugeClient client = this.authClient(null, null); + + // Delete graphspace admin + userService.listGraphSpaceAdmin(client, graphspace).forEach(u -> { + client.auth().delSpaceAdmin(u, graphspace); + }); + + // delete graphspace + graphSpaceService.delete(client, graphspace); + } + + @GetMapping("{graphspace}/setdefault") + public Map setdefault(@PathVariable("graphspace") String graphspace) { + return graphSpaceService.setdefault(this.authClient(null, null), graphspace); + } + + @GetMapping("getdefault") + public Map getdefault() { + return graphSpaceService.getdefault(this.authClient(null, null)); + } + + @PostMapping("builtin") + public Object initBuiltIn(@RequestBody BuiltInEntity entity) { + E.checkArgument(isPdEnabled(), + "Built-in initialization is not supported in standalone mode"); + GraphConnection connection = new GraphConnection(); + + String url = this.getUrl(); + UrlUtil.Host host = UrlUtil.parseHost(url); + connection.setProtocol(host.getScheme()); + connection.setHost(host.getHost()); + connection.setPort(host.getPort()); + + connection.setCluster(config.get(HubbleOptions.PD_CLUSTER)); + connection.setRouteType(config.get(HubbleOptions.ROUTE_TYPE)); + connection.setPdPeers(config.get(HubbleOptions.PD_PEERS)); + connection.setGraphSpace(Constant.BUILT_IN); + connection.setToken(this.getToken()); + + HugeClient client = this.authClient(null, null); + Ex.check(userService.isSuperAdmin(client), "仅限系统管理员操作"); + if (entity.initSpace) { + graphSpaceService.initBuiltIn(client); + } + client.assignGraph(Constant.BUILT_IN, null); + graphsService.initBuiltIn(client, connection, entity); + return null; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/SchemaTemplateController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/SchemaTemplateController.java new file mode 100644 index 000000000..2d6efee26 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/SchemaTemplateController.java @@ -0,0 +1,118 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.space; + +import java.util.List; + +import com.google.common.collect.ImmutableMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.service.space.SchemaTemplateService; +import org.apache.hugegraph.structure.space.SchemaTemplate; +import org.apache.hugegraph.util.E; + + +@RestController +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace" + + "}/schematemplates") +public class SchemaTemplateController extends BaseController { + @Autowired + SchemaTemplateService schemaTemplateService; + + @Autowired + HugeConfig config; + + private boolean isPdEnabled() { + return config.get(HubbleOptions.PD_ENABLED); + } + + @GetMapping("list") + public Object listName(@PathVariable("graphspace") String graphSpace) { + if (!isPdEnabled()) { + return ImmutableMap.of("schemas", java.util.Collections.emptyList()); + } + HugeClient client = this.authClient(graphSpace, null); + List names = schemaTemplateService.listName(client); + + return ImmutableMap.of("schemas", names); + } + + @GetMapping() + public Object list(@PathVariable("graphspace") String graphSpace, + @RequestParam(name = "query", required = false, + defaultValue = "") String query, + @RequestParam(name = "page_no", required = false, + defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", required = false, + defaultValue = "10") int pageSize) { + if (!isPdEnabled()) { + return ImmutableMap.of("records", java.util.Collections.emptyList(), + "total", 0); + } + HugeClient client = this.authClient(graphSpace, null); + return schemaTemplateService.queryPage(client, query, pageNo, pageSize); + } + + @GetMapping("{name}") + public Object get(@PathVariable("graphspace") String graphSpace, + @PathVariable("name") String name) { + HugeClient client = this.authClient(graphSpace, null); + return schemaTemplateService.get(client, name); + } + + @PostMapping + public Object create(@PathVariable("graphspace") String graphSpace, + @RequestBody SchemaTemplate schemaTemplate) { + E.checkArgument(isPdEnabled(), + "Schema template is not supported in standalone mode"); + HugeClient client = this.authClient(graphSpace, null); + + return schemaTemplateService.create(client, schemaTemplate); + } + + @DeleteMapping("{name}") + public void delete(@PathVariable("graphspace") String graphSpace, + @PathVariable("name") String name) { + HugeClient client = this.authClient(graphSpace, null); + schemaTemplateService.delete(client, name); + } + + @PutMapping("{name}") + public Object update(@PathVariable("graphspace") String graphSpace, + @PathVariable("name") String name, + @RequestBody SchemaTemplate schemaTemplate) { + HugeClient client = this.authClient(graphSpace, null); + schemaTemplate.name(name); + return schemaTemplateService.update(client, schemaTemplate); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/ServiceController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/ServiceController.java new file mode 100644 index 000000000..de8869e9f --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/ServiceController.java @@ -0,0 +1,182 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.space; + +import com.google.common.collect.ImmutableMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.util.E; +import org.apache.hugegraph.exception.ParameterizedException; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.service.space.OLTPServerService; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.structure.space.OLTPService; + +import java.util.List; + +@RestController +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/services/oltp") +public class ServiceController extends BaseController { + + @Autowired + OLTPServerService oltpService; + + @Autowired + HugeConfig config; + + private void checkPdMode() { + E.checkArgument(config.get(HubbleOptions.PD_ENABLED), + "Service management is not supported in standalone mode"); + } + + @GetMapping + public Object queryPage(@PathVariable("graphspace") String graphspace, + @RequestParam(name = "query", required = false, + defaultValue = "") String query, + @RequestParam(name = "page_no", required = false, + defaultValue = "1") int pageNo, + @RequestParam(name = "page_size", required = false, + defaultValue = "10") int pageSize) { + checkPdMode(); + try (HugeClient client = defaultClient(graphspace, null);){ + return oltpService.queryPage(client, query, pageNo, pageSize); + } catch (Throwable t) { + throw t; + } + } + + @GetMapping("{service}") + public Object get(@PathVariable("graphspace") String graphspace, + @PathVariable("service") String service) { + checkPdMode(); + try (HugeClient client = defaultClient(graphspace, null);){ + return oltpService.get(client, service); + } catch (Throwable t) { + throw t; + } + } + + @PostMapping + public Object create(@PathVariable("graphspace") String graphspace, + @RequestBody OLTPService serviceEntity) { + + checkPdMode(); + // return serviceEntity; + // TODO url or routetype + if (serviceEntity.getDepleymentType() + == OLTPService.DepleymentType.MANUAL) { + serviceEntity.setRouteType(null); + } else { + serviceEntity.setRouteType("NodePort"); + serviceEntity.setUrls(null); + } + + try (HugeClient client = defaultClient(graphspace, null);){ + return oltpService.create(client, serviceEntity); + } catch (Throwable t) { + throw t; + } + } + + @PutMapping("{service}") + public Object update(@PathVariable("graphspace") String graphspace, + @PathVariable("service") String service, + @RequestBody OLTPService serviceEntity) { + + checkPdMode(); + E.checkArgument(!serviceEntity.getDepleymentType() + .equals(OLTPService.DepleymentType.MANUAL), + "service.manual.disable.modify"); + + serviceEntity.setName(service); + serviceEntity.setRouteType("NodePort"); + serviceEntity.setUrls(null); + + try (HugeClient client = defaultClient(graphspace, null);){ + return oltpService.update(client, serviceEntity); + } catch (Throwable t) { + throw t; + } + } + + @DeleteMapping("{service}") + public void delete(@PathVariable("graphspace") String graphspace, + @PathVariable("service") String service) { + checkPdMode(); + if (("DEFAULT".equals(graphspace)) && ("DEFAULT".equals(service))) { + throw new ParameterizedException("Do not delete the service " + + "'DEFAULT' under the graphspace " + + "named 'DEFAULT'!"); + } + try (HugeClient client = defaultClient(graphspace, null);){ + oltpService.delete(client, service); + } catch (Throwable t) { + throw t; + } + } + + @GetMapping("{service}/start") + public void start(@PathVariable("graphspace") String graphspace, + @PathVariable("service") String service) { + + checkPdMode(); + try (HugeClient client = defaultClient(graphspace, null);){ + oltpService.start(client, service); + } catch (Throwable t) { + throw t; + } + } + + @GetMapping("{service}/stop") + public void stop(@PathVariable("graphspace") String graphspace, + @PathVariable("service") String service) { + + checkPdMode(); + try (HugeClient client = defaultClient(graphspace, null);){ + oltpService.stop(client, service); + } catch (Throwable t) { + throw t; + } + } + + @GetMapping("options/list") + public Object configOptions(@PathVariable("graphspace") String graphspace) { + checkPdMode(); + try (HugeClient client = defaultClient(graphspace, null);){ + List fields = oltpService.configOptionList(client); + + return ImmutableMap.of("options", fields); + } catch (Throwable t) { + throw t; + } + } + +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/VermeerController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/VermeerController.java new file mode 100644 index 000000000..b15e986ff --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/space/VermeerController.java @@ -0,0 +1,134 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.controller.space; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.loader.util.JsonUtil; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.service.space.VermeerService; +import com.fasterxml.jackson.annotation.JsonProperty; + +@RestController +@RequestMapping(Constant.API_VERSION + "vermeer") +public class VermeerController extends BaseController { + + @Autowired + VermeerService vermeerService; + @Autowired + private HugeConfig config; + + private static final String GRAPH_LOADED = "loaded"; + + @GetMapping + public Map getStatus(@RequestParam(value="check", + required = false, + defaultValue = "false") + boolean check) { + String username = this.getUser(); + String password = (String) this.getSession("password"); + return vermeerService.getVermeer(username, password, check); + } + + @PostMapping("task") + public void load(@RequestBody JsonLoad body) { + String graphspace = body.graphspace; + String graph = body.graph; + String vGraph = vermeerService.convert2VG(graphspace, graph); + HugeClient client = this.authClient(null, null); + + Map graphInfo = + (Map) client.vermeer() + .getGraphInfoByName(vGraph) + .get("graph"); + + // if (graphInfo != null && !graphInfo.isEmpty()) { + // E.checkArgument(body.force || !GRAPH_LOADED.equals(graphInfo.get( + // "status")), "graph already loaded"); + // vermeerService.deleteGraph(client, graphspace, graph); + // } + + Map params = new HashMap<>(); + String pdPeers = config.get(HubbleOptions.PD_PEERS); + String pdJson = JsonUtil.toJson(Arrays.asList(pdPeers.split(","))); + params.put("load.parallel", "50"); + params.put("load.type", "hugegraph"); + params.put("load.hg_pd_peers", pdJson); + params.put("load.use_outedge", "1"); + params.put("load.use_out_degree", "1"); + params.put("load.hugegraph_name", graphspace + "/" + graph + "/g"); + params.put("load.hugegraph_username", this.getUser()); + params.put("load.hugegraph_password", (String) this.getSession("password")); + + if (body.params != null) { + params.putAll(body.analyze()); + } + + vermeerService.load(client, graphspace, graph, body.taskType, params); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + @DeleteMapping("{name}") + public void deleteGraph(@RequestBody Map body) { + String graphspace = body.get("graphspace"); + String graph = body.get("graph"); + HugeClient client = this.authClient(graphspace, graph); + vermeerService.deleteGraph(client, graphspace, graph); + } + + private static class JsonLoad { + @JsonProperty("graphspace") + public String graphspace; + @JsonProperty("graph") + public String graph; + @JsonProperty("force") + public boolean force = false; + @JsonProperty("params") + public Map params; + + @JsonProperty("task_type") + public String taskType; + + public Map analyze() { + for (Map.Entry entry : params.entrySet()) { + entry.setValue(entry.getValue().toString()); + } + return params; + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/task/AsyncTaskController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/task/AsyncTaskController.java index 989cca5b7..37f9976d4 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/task/AsyncTaskController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/task/AsyncTaskController.java @@ -18,29 +18,23 @@ package org.apache.hugegraph.controller.task; -import java.util.List; - +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.extern.log4j.Log4j2; import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.controller.BaseController; +import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.service.algorithm.AsyncTaskService; import org.apache.hugegraph.structure.Task; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import com.baomidou.mybatisplus.core.metadata.IPage; - -import lombok.extern.log4j.Log4j2; +import java.util.List; @Log4j2 @RestController -@RequestMapping(Constant.API_VERSION + "graph-connections/{connId}/async-tasks") +@RequestMapping(Constant.API_VERSION + "graphspaces/{graphspace}/graphs" + + "/{graph}/async-tasks") public class AsyncTaskController extends BaseController { private final AsyncTaskService service; @@ -51,9 +45,11 @@ public AsyncTaskController(AsyncTaskService service) { } @GetMapping("{id}") - public Task get(@PathVariable("connId") int connId, + public Task get(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") int id) { - Task task = this.service.get(connId, id); + HugeClient client = this.authClient(graphSpace, graph); + Task task = this.service.get(client, id); if (task == null) { throw new ExternalException("async.task.not-exist.id", id); } @@ -61,9 +57,11 @@ public Task get(@PathVariable("connId") int connId, } @PostMapping("cancel/{id}") - public Task cancel(@PathVariable("connId") int connId, + public Task cancel(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @PathVariable("id") int id) { - Task task = this.service.cancel(connId, id); + HugeClient client = this.authClient(graphSpace, graph); + Task task = this.service.cancel(client, id); if (task == null) { throw new ExternalException("async.task.not-exist.id", id); } @@ -71,45 +69,51 @@ public Task cancel(@PathVariable("connId") int connId, } @GetMapping("ids") - public List list(@PathVariable("connId") int connId, + public List list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam("ids") List taskIds) { - return this.service.list(connId, taskIds); + HugeClient client = this.authClient(graphSpace, graph); + return this.service.list(client, taskIds); } @GetMapping - public IPage list(@PathVariable("connId") int connId, + public IPage list(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam(name = "page_no", required = false, defaultValue = "1") - int pageNo, + int pageNo, @RequestParam(name = "page_size", required = false, defaultValue = "10") - int pageSize, + int pageSize, @RequestParam(name = "content", required = false, defaultValue = "") - String content, + String content, @RequestParam(name = "type", required = false, defaultValue = "") - String type, + String type, @RequestParam(name = "status", required = false, defaultValue = "") - String status) { - return this.service.list(connId, pageNo, pageSize, content, type, status); + String status) { + HugeClient client = this.authClient(graphSpace, graph); + return this.service.list(client, pageNo, pageSize, content, type, status); } @DeleteMapping - public void delete(@PathVariable("connId") int connId, + public void delete(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, @RequestParam("ids") List ids) { + HugeClient client = this.authClient(graphSpace, graph); for (int id : ids) { - Task task = this.service.get(connId, id); + Task task = this.service.get(client, id); if (task == null) { throw new ExternalException("async.task.not-exist.id", id); } - this.service.remove(connId, id); + this.service.remove(client, id); } } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/GraphConnection.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/GraphConnection.java index 3957f836f..c434afce4 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/GraphConnection.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/GraphConnection.java @@ -18,29 +18,28 @@ package org.apache.hugegraph.entity; -import java.util.Date; - -import org.apache.hugegraph.annotation.MergeProperty; -import org.apache.hugegraph.common.Identifiable; -import org.apache.hugegraph.common.Mergeable; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.hugegraph.annotation.MergeProperty; +import org.apache.hugegraph.common.Identifiable; +import org.apache.hugegraph.common.Mergeable; + +import java.util.Date; @Data @NoArgsConstructor @AllArgsConstructor @Builder -@JsonIgnoreProperties({"protocol", "truststore_file", "truststore_password"}) +@JsonIgnoreProperties({"protocol", "truststore_file", "truststore_password", + "password", "token"}) @TableName(value = "graph_connection", autoResultMap = true) public class GraphConnection implements Identifiable, Mergeable { @@ -53,6 +52,20 @@ public class GraphConnection implements Identifiable, Mergeable { @JsonProperty("name") private String name; + @JsonProperty("route_type") + private String routeType; + + @JsonProperty("pd_peers") + private String pdPeers; + + @MergeProperty + @JsonProperty("cluster") + private String cluster; + + @MergeProperty + @JsonProperty("graphspace") + private String graphSpace; + @MergeProperty @JsonProperty("graph") private String graph; @@ -77,6 +90,10 @@ public class GraphConnection implements Identifiable, Mergeable { @JsonProperty("password") private String password; + @MergeProperty + @JsonProperty("token") + private String token; + @MergeProperty(useNew = false) @JsonProperty("enabled") private Boolean enabled; @@ -103,4 +120,8 @@ public class GraphConnection implements Identifiable, Mergeable { @MergeProperty(useNew = false) @JsonProperty("truststore_password") private String trustStorePassword; + + public String getGraphId() { + return String.format("%s/%s/%s", cluster, graphSpace, graph); + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/AdamicadarEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/AdamicadarEntity.java new file mode 100644 index 000000000..ffe63f9f4 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/AdamicadarEntity.java @@ -0,0 +1,51 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AdamicadarEntity { + @JsonProperty("vertex") + private Object vertex; + + @JsonProperty("other") + private Object other; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("limit") + private int limit; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/AllShortestPathsEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/AllShortestPathsEntity.java new file mode 100644 index 000000000..e8e0f8317 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/AllShortestPathsEntity.java @@ -0,0 +1,58 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AllShortestPathsEntity { + + @JsonProperty("source") + private Object source; + + @JsonProperty("target") + private Object target; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_depth") + private int maxDepth; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("skip_degree") + private long skipDegree; + + @JsonProperty("capacity") + private long capacity = Traverser.DEFAULT_CAPACITY; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/CrossPointsEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/CrossPointsEntity.java new file mode 100644 index 000000000..818065666 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/CrossPointsEntity.java @@ -0,0 +1,58 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CrossPointsEntity { + + @JsonProperty("source") + private Object source; + + @JsonProperty("target") + private Object target; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("max_depth") + private int maxDepth; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("capacity") + private long capacity = Traverser.DEFAULT_CAPACITY; + + @JsonProperty("limit") + private long limit = Traverser.DEFAULT_PATHS_LIMIT; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/JaccardSimilarityEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/JaccardSimilarityEntity.java new file mode 100644 index 000000000..63a4afaea --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/JaccardSimilarityEntity.java @@ -0,0 +1,48 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import org.apache.hugegraph.structure.constant.Direction; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class JaccardSimilarityEntity { + @JsonProperty("vertex") + private Object vertex; + + @JsonProperty("other") + private Object other; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_degree") + private long maxDegree; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/KneighborEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/KneighborEntity.java new file mode 100644 index 000000000..21703e145 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/KneighborEntity.java @@ -0,0 +1,51 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class KneighborEntity { + @JsonProperty("source") + private Object source; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("max_depth") + private int maxDepth; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("limit") + private int limit; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/KoutEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/KoutEntity.java new file mode 100644 index 000000000..01adc09ac --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/KoutEntity.java @@ -0,0 +1,61 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class KoutEntity { + + @JsonProperty("source") + private Object source; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("max_depth") + private int maxDepth; + + @JsonProperty("label") + private String label; + + @JsonProperty("nearest") + private boolean nearest; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("capacity") + private long capacity; + + @JsonProperty("limit") + private int limit; + + @JsonProperty("algorithm") + private String algorithm; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/OlapEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/OlapEntity.java new file mode 100644 index 000000000..a9d1306a7 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/OlapEntity.java @@ -0,0 +1,44 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class OlapEntity { + + @JsonProperty("algorithm") + private String algorithm; + + @JsonProperty("worker") + private long worker; + + @JsonProperty("params") + private Map params; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/PathsEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/PathsEntity.java new file mode 100644 index 000000000..e01c5114f --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/PathsEntity.java @@ -0,0 +1,58 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PathsEntity { + + @JsonProperty("source") + private Object source; + + @JsonProperty("target") + private Object target; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("max_depth") + private int maxDepth; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("capacity") + private long capacity = Traverser.DEFAULT_CAPACITY; + + @JsonProperty("limit") + private long limit = Traverser.DEFAULT_PATHS_LIMIT; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/RaysEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/RaysEntity.java new file mode 100644 index 000000000..379b34df2 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/RaysEntity.java @@ -0,0 +1,55 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class RaysEntity { + + @JsonProperty("source") + private Object source; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("max_depth") + private int maxDepth; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("capacity") + private long capacity = Traverser.DEFAULT_CAPACITY; + + @JsonProperty("limit") + private long limit = Traverser.DEFAULT_PATHS_LIMIT; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/ResourceallocationEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/ResourceallocationEntity.java new file mode 100644 index 000000000..daffb2b7e --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/ResourceallocationEntity.java @@ -0,0 +1,51 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ResourceallocationEntity { + @JsonProperty("vertex") + private Object vertex; + + @JsonProperty("other") + private Object other; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("limit") + private int limit; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/RingsEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/RingsEntity.java new file mode 100644 index 000000000..8d3cbffbb --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/RingsEntity.java @@ -0,0 +1,58 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class RingsEntity { + + @JsonProperty("source") + private Object source; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_depth") + private int maxDepth; + + @JsonProperty("source_in_ring") + private boolean sourceInRing; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("capacity") + private long capacity; + + @JsonProperty("limit") + private int limit; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/SameNeighborsEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/SameNeighborsEntity.java new file mode 100644 index 000000000..8892099a4 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/SameNeighborsEntity.java @@ -0,0 +1,52 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SameNeighborsEntity { + + @JsonProperty("vertex") + private Object vertex; + + @JsonProperty("other") + private Object other; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("limit") + private int limit; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/ShortestPath.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/ShortestPathEntity.java similarity index 88% rename from hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/ShortestPath.java rename to hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/ShortestPathEntity.java index e70b366f0..29c506798 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/ShortestPath.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/ShortestPathEntity.java @@ -19,7 +19,7 @@ package org.apache.hugegraph.entity.algorithm; import org.apache.hugegraph.structure.constant.Direction; - +import org.apache.hugegraph.structure.constant.Traverser; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; @@ -31,7 +31,7 @@ @NoArgsConstructor @AllArgsConstructor @Builder -public class ShortestPath { +public class ShortestPathEntity { @JsonProperty("source") private Object source; @@ -49,11 +49,11 @@ public class ShortestPath { private int maxDepth; @JsonProperty("max_degree") - private long maxDegree; + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; @JsonProperty("skip_degree") private long skipDegree; @JsonProperty("capacity") - private long capacity; + private long capacity = Traverser.DEFAULT_CAPACITY; } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/SingleSourceShortestPathEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/SingleSourceShortestPathEntity.java new file mode 100644 index 000000000..b053f5c5c --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/SingleSourceShortestPathEntity.java @@ -0,0 +1,61 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SingleSourceShortestPathEntity { + + @JsonProperty("source") + private Object source; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("weight") + private String weight; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("skip_degree") + private long skipDegree; + + @JsonProperty("capacity") + private long capacity = Traverser.DEFAULT_CAPACITY; + + @JsonProperty("with_vertex") + private boolean withVertex; + + @JsonProperty("limit") + private long limit = Traverser.DEFAULT_PATHS_LIMIT; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/WeightedShortestPathEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/WeightedShortestPathEntity.java new file mode 100644 index 000000000..8d51e8ced --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/algorithm/WeightedShortestPathEntity.java @@ -0,0 +1,61 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.algorithm; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hugegraph.structure.constant.Direction; +import org.apache.hugegraph.structure.constant.Traverser; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class WeightedShortestPathEntity { + + @JsonProperty("source") + private Object source; + + @JsonProperty("target") + private Object target; + + @JsonProperty("direction") + private Direction direction; + + @JsonProperty("weight") + private String weight; + + @JsonProperty("label") + private String label; + + @JsonProperty("max_degree") + private long maxDegree = Traverser.DEFAULT_MAX_DEGREE; + + @JsonProperty("skip_degree") + private long skipDegree; + + @JsonProperty("capacity") + private long capacity = Traverser.DEFAULT_CAPACITY; + + @JsonProperty("with_vertex") + private boolean withVertex; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/AccessEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/AccessEntity.java new file mode 100644 index 000000000..84a195ea4 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/AccessEntity.java @@ -0,0 +1,68 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.auth; + +import java.util.List; +import java.util.Set; + +import org.apache.hugegraph.structure.auth.HugePermission; +import org.apache.hugegraph.structure.auth.HugeResource; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AccessEntity { + + @JsonProperty("target_id") + private String targetId; + + @JsonProperty("target_name") + private String targetName; + + @JsonProperty("role_id") + private String roleId; + + @JsonProperty("role_name") + private String roleName; + + @JsonProperty("graphspace") + private String graphSpace; + + @JsonProperty("graph") + private String graph; + + @JsonProperty("permissions") + private Set permissions; + + @JsonProperty("target_description") + protected String description; + + @JsonProperty("target_resources") + protected List resources; + + public void addPermission(HugePermission p) { + permissions.add(p); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/BelongEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/BelongEntity.java new file mode 100644 index 000000000..e5ca9718f --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/BelongEntity.java @@ -0,0 +1,57 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.auth; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import org.apache.hugegraph.common.Identifiable; + +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class BelongEntity implements Identifiable { + + @JsonProperty("id") + private String id; + + @JsonProperty("user_id") + private String userId; + + @JsonProperty("user_name") + private String userName; + + @JsonProperty("role_id") + private String roleId; + + @JsonProperty("role_name") + private String roleName; + + @JsonProperty("user_description") + private String description; + + @JsonProperty("user_create") + protected Date create; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/PasswordEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/PasswordEntity.java new file mode 100644 index 000000000..36538b1a1 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/PasswordEntity.java @@ -0,0 +1,40 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.auth; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PasswordEntity { + + @JsonProperty("username") + private String username; + + @JsonProperty("oldpwd") + private String oldpwd; + + @JsonProperty("newpwd") + private String newpwd; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/RoleEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/RoleEntity.java new file mode 100644 index 000000000..5da056121 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/RoleEntity.java @@ -0,0 +1,40 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.auth; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import org.apache.hugegraph.common.Identifiable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class RoleEntity implements Identifiable { + + @JsonProperty("role_id") + private String id; + + @JsonProperty("role_name") + private String name; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/UserEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/UserEntity.java new file mode 100644 index 000000000..e17cd22aa --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/UserEntity.java @@ -0,0 +1,82 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.auth; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import org.apache.hugegraph.common.Identifiable; + +import java.util.Date; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UserEntity implements Identifiable { + + @JsonProperty("id") + private String id; + + @JsonProperty("user_name") + private String name; + + @JsonProperty("user_nickname") + private String nickname; + + @JsonProperty("user_email") + private String email; + + @JsonProperty("user_password") + private String password; + + @JsonProperty("user_phone") + private String phone; + + @JsonProperty("user_avatar") + private String avatar; + + @JsonProperty("user_description") + private String description; + + @JsonProperty("user_create") + protected Date create; + @JsonProperty("user_update") + protected Date update; + @JsonProperty("user_creator") + protected String creator; + + @JsonProperty("adminSpaces") + protected List adminSpaces; + + @JsonProperty("resSpaces") + protected List resSpaces; + + @JsonProperty("spacenum") + protected Integer spacenum; + + @JsonProperty("is_superadmin") + private boolean isSuperadmin; +} + + diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/UserView.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/UserView.java new file mode 100644 index 000000000..5b1fc8195 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/UserView.java @@ -0,0 +1,48 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.auth; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UserView { + + @JsonProperty("user_id") + private String id; + + @JsonProperty("user_name") + private String name; + + @JsonProperty("roles") + private List roles; + + public void addRole(RoleEntity g) { + this.roles.add(g); + } + +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/WhiteIpListEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/WhiteIpListEntity.java new file mode 100644 index 000000000..8dad0b607 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/auth/WhiteIpListEntity.java @@ -0,0 +1,39 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.auth; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class WhiteIpListEntity { + @JsonProperty("action") + private String action; + + @JsonProperty("ips") + private List ips; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/enums/ExecuteType.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/enums/ExecuteType.java index 01ad2494d..fc1c4363e 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/enums/ExecuteType.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/enums/ExecuteType.java @@ -19,14 +19,21 @@ package org.apache.hugegraph.entity.enums; import com.baomidou.mybatisplus.core.enums.IEnum; +import org.apache.hugegraph.exception.InternalException; + +import java.util.HashSet; +import java.util.Set; public enum ExecuteType implements IEnum { GREMLIN(0), ALGORITHM(1), - - GREMLIN_ASYNC(5); + CYPHER(2), + CYPHER_ASYNC(4), + GREMLIN_ASYNC(5), + GREMLIN_ALL(6), + CYPHER_ALL(7); private byte code; @@ -39,4 +46,24 @@ public enum ExecuteType implements IEnum { public Byte getValue() { return this.code; } + + public static boolean isSingle(int type) { + return type < GREMLIN_ALL.getValue(); + } + + public static Set getMatchedTypes(int type) { + Set types = new HashSet<>(); + if (isSingle(type)) { + types.add(type); + } else if (type == GREMLIN_ALL.getValue()) { + types.add(GREMLIN_ASYNC.getValue().intValue()); + types.add(GREMLIN.getValue().intValue()); + } else if (type == CYPHER_ALL.getValue()) { + types.add(CYPHER.getValue().intValue()); + types.add(CYPHER_ASYNC.getValue().intValue()); + } else { + throw new InternalException("executehistory type invalid"); + } + return types; + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/enums/LoadStatus.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/enums/LoadStatus.java index 678ed6e21..6db79f45e 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/enums/LoadStatus.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/enums/LoadStatus.java @@ -30,7 +30,10 @@ public enum LoadStatus implements IEnum { PAUSED(3), - STOPPED(4); + STOPPED(4), + + // No Used + INIT(5); private byte code; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/EdgeEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/EdgeEntity.java index cb3824ef6..9e955dcd4 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/EdgeEntity.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/EdgeEntity.java @@ -18,16 +18,14 @@ package org.apache.hugegraph.entity.graph; -import java.util.Map; - -import org.apache.hugegraph.common.Identifiable; - import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.hugegraph.common.Identifiable; + +import java.util.Map; @Data @NoArgsConstructor diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/VertexEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/VertexEntity.java index 9cf6fd3fb..215c226be 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/VertexEntity.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/VertexEntity.java @@ -21,7 +21,6 @@ import java.util.Map; import org.apache.hugegraph.common.Identifiable; - import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/VertexQueryEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/VertexQueryEntity.java new file mode 100644 index 000000000..4b8f93173 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graph/VertexQueryEntity.java @@ -0,0 +1,73 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.graph; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; +import org.apache.hugegraph.structure.graph.Vertex; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +@Getter +@Setter +public class VertexQueryEntity extends Vertex { + @JsonProperty("statistics") + private Map statistics; + + public VertexQueryEntity(String label) { + super(label); + this.statistics = new HashMap<>(); + } + + public void setProperties(Map properties) { + this.properties = properties; + } + + public static VertexQueryEntity fromVertex(Vertex vertex) { + VertexQueryEntity vertexQE = + new VertexQueryEntity(vertex.label()); + vertexQE.id(vertex.id()); + vertexQE.setProperties(vertex.properties()); + return vertexQE; + } + + public static Collection fromVertices(Collection vertices) { + Collection vertexQueryEntities = new ArrayList<>(); + for (Vertex vertex: vertices) { + vertexQueryEntities.add(fromVertex(vertex)); + } + return vertexQueryEntities; + } + + public Vertex convertVertex() { + // get Vertex instance from VertexQueryEntity + return this; + } + + @Override + public String toString() { + return String.format("{id=%s, label=%s, properties=%s, statistics=%s}", + this.id(), + this.label(), this.properties(), this.statistics); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphCloneEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphCloneEntity.java new file mode 100644 index 000000000..2f9ed054b --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphCloneEntity.java @@ -0,0 +1,67 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.graphs; + +import java.util.HashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class GraphCloneEntity { + @JsonProperty("graphspace") + public String graphSpace; + @JsonProperty("name") + public String name; + @JsonProperty("nickname") + public String nickname; + @JsonProperty("load_data") + public int loadData = 0; + + public Map convertMap(String graphSpace, String graph) { + Map params = new HashMap<>(4); + + String name = (this.name == null) ? graph : this.name; + String nickname = (this.nickname == null) ? graph : this.nickname; + String space = (this.graphSpace == null) ? graphSpace : this.graphSpace; + + Map configs = new HashMap<>(); + configs.put("backend", "hstore"); + configs.put("serializer", "binary"); + configs.put("name", name); + configs.put("nickname", nickname); + configs.put("search.text_analyzer", "jieba"); + configs.put("search.text_analyzer_mode", "INDEX"); + + params.put("configs", configs); + params.put("create", true); + params.put("init_schema", true); + params.put("graphspace", space); + params.put("load_data", (boolean) (this.loadData == 1)); + return params; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphEntity.java new file mode 100644 index 000000000..70db00441 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphEntity.java @@ -0,0 +1,34 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.graphs; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class GraphEntity { + public String cluster; + public String graphSpace; + public String graph; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphStatisticsEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphStatisticsEntity.java new file mode 100644 index 000000000..0dfee7287 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/graphs/GraphStatisticsEntity.java @@ -0,0 +1,58 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.graphs; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.collect.ImmutableMap; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class GraphStatisticsEntity { + @JsonProperty("storage") + public long storage; + @JsonProperty("vertex_count") + public String vertexCount; + @JsonProperty("edge_count") + public String edgeCount; + @JsonProperty("update_time") + public String updateTime; + @JsonProperty("vertices") + public Map vertices; + @JsonProperty("edges") + public Map edges; + + public static GraphStatisticsEntity emptyEntity() { + GraphStatisticsEntity empty = new GraphStatisticsEntity(); + empty.setStorage(0); + empty.setVertexCount("0"); + empty.setEdgeCount("0"); + empty.setVertices(ImmutableMap.of()); + empty.setEdges(ImmutableMap.of()); + empty.setUpdateTime("1970-01-01 00:00:00.000"); + return empty; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/Datasource.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/Datasource.java new file mode 100644 index 000000000..8d62df388 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/Datasource.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.load; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@TableName(value = "datasource", autoResultMap = true) +public class Datasource { + + @TableId(type = IdType.AUTO) + @JsonProperty("datasource_id") + private Integer id; + + @TableField("datasource_name") + @JsonProperty("datasource_name") + private String datasourceName; + + @TableField(value = "datasource_config", typeHandler = JacksonTypeHandler.class) + @JsonProperty("datasource_config") + private Map datasourceConfig; + + @TableField("creator") + @JsonProperty("creator") + private String creator; + + @TableField("create_time") + @JsonProperty("create_time") + private Date createTime; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/EdgeMapping.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/EdgeMapping.java index 64a9d0365..29e5e8a1a 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/EdgeMapping.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/EdgeMapping.java @@ -18,16 +18,14 @@ package org.apache.hugegraph.entity.load; -import java.util.List; - -import org.apache.hugegraph.annotation.MergeProperty; - import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.apache.hugegraph.annotation.MergeProperty; + +import java.util.List; @Getter @NoArgsConstructor diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ElementMapping.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ElementMapping.java index 7c9ac7f6c..fc6fe17cd 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ElementMapping.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ElementMapping.java @@ -18,18 +18,16 @@ package org.apache.hugegraph.entity.load; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.apache.hugegraph.annotation.MergeProperty; -import org.apache.hugegraph.common.Mergeable; - import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.hugegraph.annotation.MergeProperty; +import org.apache.hugegraph.common.Mergeable; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Data @NoArgsConstructor diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FieldMappingItem.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FieldMappingItem.java index b01be289a..892f0aeba 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FieldMappingItem.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FieldMappingItem.java @@ -19,7 +19,6 @@ package org.apache.hugegraph.entity.load; import org.apache.hugegraph.annotation.MergeProperty; - import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileMapping.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileMapping.java index 5f23c2135..de3edb6eb 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileMapping.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileMapping.java @@ -30,7 +30,6 @@ import org.apache.hugegraph.handler.VertexMappingTypeHandler; import org.apache.hugegraph.util.HubbleUtil; import org.apache.hugegraph.util.SerializeUtil; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -62,6 +61,14 @@ public class FileMapping { @JsonIgnore private Integer connId; + @TableField("graphspace") + @JsonIgnore + private String graphSpace; + + @TableField("graph") + @JsonIgnore + private String graph; + @TableField(value = "job_id") @MergeProperty @JsonProperty("job_id") @@ -121,14 +128,36 @@ public long getTotalSizeBytes() { return this.totalSize; } + public FileMapping(String graphSpace, String graph, String name, + String path) { + this(graphSpace, graph, name, path, HubbleUtil.nowDate()); + } + public FileMapping(int connId, String name, String path) { this(connId, name, path, HubbleUtil.nowDate()); } - public FileMapping(int connId, String name, String path, - Date lastAccessTime) { + public FileMapping(int connId, String name, String path, Date lastAccessTime) { this.id = null; this.connId = connId; + this.graphSpace = null; + this.graph = null; + this.name = name; + this.path = path; + this.fileSetting = new FileSetting(); + this.vertexMappings = new LinkedHashSet<>(); + this.edgeMappings = new LinkedHashSet<>(); + this.loadParameter = new LoadParameter(); + this.createTime = lastAccessTime; + this.updateTime = lastAccessTime; + } + + public FileMapping(String graphSpace, String graph, String name, String path, + Date lastAccessTime) { + this.id = null; + this.connId = null; + this.graphSpace = graphSpace; + this.graph = graph; this.name = name; this.path = path; this.fileSetting = new FileSetting(); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileSetting.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileSetting.java index c682f8f61..a90bcb078 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileSetting.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileSetting.java @@ -18,13 +18,6 @@ package org.apache.hugegraph.entity.load; -import java.io.IOException; -import java.util.List; - -import org.apache.hugegraph.annotation.MergeProperty; -import org.apache.hugegraph.common.Constant; -import org.apache.hugegraph.common.Mergeable; - import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; @@ -34,11 +27,16 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.ser.std.StdSerializer; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.hugegraph.annotation.MergeProperty; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.common.Mergeable; + +import java.io.IOException; +import java.util.List; @Data @NoArgsConstructor @@ -80,7 +78,7 @@ public class FileSetting implements Mergeable { @MergeProperty @JsonProperty("skipped_line") - private String skippedLine = "(^#|^//).*|"; + private String skippedLine = "(^#|^//).*"; @MergeProperty @JsonProperty("list_format") @@ -118,7 +116,7 @@ protected DelimiterDeserializer() { @Override public String deserialize(JsonParser jsonParser, DeserializationContext context) - throws IOException { + throws IOException { String delimiter = jsonParser.getText(); if ("\\t".equals(delimiter)) { return "\t"; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileUploadResult.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileUploadResult.java index 967c2da6f..6e2fee5c5 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileUploadResult.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/FileUploadResult.java @@ -19,7 +19,6 @@ package org.apache.hugegraph.entity.load; import org.apache.hugegraph.util.SerializeUtil; - import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -58,6 +57,6 @@ public enum Status { FAILURE, - SUSPEND + SUSPEND; } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManager.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManager.java index 283000905..03d4e4c22 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManager.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManager.java @@ -18,24 +18,22 @@ package org.apache.hugegraph.entity.load; -import java.util.Date; - -import org.apache.hugegraph.annotation.MergeProperty; -import org.apache.hugegraph.entity.enums.JobStatus; -import org.apache.hugegraph.util.SerializeUtil; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import org.apache.hugegraph.annotation.MergeProperty; +import org.apache.hugegraph.entity.enums.JobStatus; +import org.apache.hugegraph.util.SerializeUtil; + +import java.util.Date; @Data @NoArgsConstructor @@ -55,6 +53,16 @@ public class JobManager { @JsonProperty("conn_id") private Integer connId; + @TableField(value = "graphspace") + @MergeProperty + @JsonProperty("graphspace") + private String graphSpace; + + @TableField(value = "graph") + @MergeProperty + @JsonProperty("graph") + private String graph; + @TableField(value = "job_name") @MergeProperty @JsonProperty("job_name") diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManagerItem.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManagerItem.java index 28de6ebe4..d489928cf 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManagerItem.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManagerItem.java @@ -20,7 +20,6 @@ import org.apache.hugegraph.annotation.MergeProperty; import org.apache.hugegraph.util.SerializeUtil; - import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManagerReasonResult.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManagerReasonResult.java index 55a2717ca..7a8489d6e 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManagerReasonResult.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/JobManagerReasonResult.java @@ -19,7 +19,6 @@ package org.apache.hugegraph.entity.load; import org.apache.hugegraph.annotation.MergeProperty; - import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ListFormat.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ListFormat.java index edcf2404c..3d6c304fd 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ListFormat.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ListFormat.java @@ -18,14 +18,13 @@ package org.apache.hugegraph.entity.load; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.hugegraph.loader.constant.Constants; + import java.util.Collections; import java.util.HashSet; import java.util.Set; -import org.apache.hugegraph.loader.constant.Constants; - -import com.fasterxml.jackson.annotation.JsonProperty; - public final class ListFormat { private static final String DEFAULT_START_SYMBOL = ""; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/LoadParameter.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/LoadParameter.java index 1da3af183..ab0b88803 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/LoadParameter.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/LoadParameter.java @@ -18,15 +18,13 @@ package org.apache.hugegraph.entity.load; -import org.apache.hugegraph.annotation.MergeProperty; -import org.apache.hugegraph.common.Mergeable; - import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.hugegraph.annotation.MergeProperty; +import org.apache.hugegraph.common.Mergeable; @Data @NoArgsConstructor diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/LoadTask.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/LoadTask.java index 16422afab..c6bd363b0 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/LoadTask.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/LoadTask.java @@ -32,7 +32,6 @@ import org.apache.hugegraph.util.Ex; import org.apache.hugegraph.util.HubbleUtil; import org.apache.hugegraph.util.SerializeUtil; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -58,7 +57,7 @@ public class LoadTask implements Runnable { @TableField(exist = false) @JsonIgnore - private final transient Lock lock = new ReentrantLock(); + private transient final Lock lock = new ReentrantLock(); @TableField(exist = false) @JsonIgnore @@ -78,6 +77,16 @@ public class LoadTask implements Runnable { @JsonProperty("conn_id") private Integer connId; + @TableField(value = "graphspace") + @MergeProperty + @JsonProperty("graphspace") + private String graphSpace; + + @TableField(value = "graph") + @MergeProperty + @JsonProperty("graph") + private String graph; + @TableField(value = "job_id") @MergeProperty @JsonProperty("job_id") @@ -144,6 +153,8 @@ public LoadTask(LoadOptions options, GraphConnection connection, this.finished = false; this.id = null; this.connId = connection.getId(); + this.graphSpace = connection.getGraphSpace(); + this.graph = connection.getGraph(); this.jobId = mapping.getJobId(); this.fileId = mapping.getId(); this.fileName = mapping.getName(); @@ -156,13 +167,14 @@ public LoadTask(LoadOptions options, GraphConnection connection, this.lastDuration = 0L; this.currDuration = 0L; this.createTime = HubbleUtil.nowDate(); + + this.loader = new HugeGraphLoader(this.options); } @Override public void run() { Ex.check(this.options != null, "The load options shouldn't be null"); log.info("LoadTask is start running : {}", this.id); - this.loader = new HugeGraphLoader(this.options); boolean noError; try { @@ -182,7 +194,12 @@ public void run() { this.status = LoadStatus.FAILED; } } - this.fileReadLines = this.context().newProgress().totalInputRead(); + // Restore file read lines progress tracking + long readLines = this.context().newProgress().totalInputRead(); + if (readLines == 0L) { + readLines = this.context().oldProgress().totalInputRead(); + } + this.fileReadLines = readLines; this.lastDuration += this.context().summary().totalTime(); this.currDuration = 0L; } finally { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/NullValues.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/NullValues.java index 874b8f13a..979003e45 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/NullValues.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/NullValues.java @@ -21,7 +21,6 @@ import java.util.Set; import org.apache.hugegraph.annotation.MergeProperty; - import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ValueMappingItem.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ValueMappingItem.java index 9bfe1d917..5a72f1444 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ValueMappingItem.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/ValueMappingItem.java @@ -21,7 +21,6 @@ import java.util.List; import org.apache.hugegraph.annotation.MergeProperty; - import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/VertexMapping.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/VertexMapping.java index 7c6f394fd..5c87fbab4 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/VertexMapping.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/load/VertexMapping.java @@ -21,7 +21,6 @@ import java.util.List; import org.apache.hugegraph.annotation.MergeProperty; - import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; @@ -39,6 +38,10 @@ public class VertexMapping extends ElementMapping { @JsonProperty("id_fields") private List idFields; + public VertexMapping(String s, boolean b) { + // TODO Rmving? + } + @Override public boolean equals(Object object) { if (!(object instanceof VertexMapping)) { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/op/AuditEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/op/AuditEntity.java new file mode 100644 index 000000000..8d85ce375 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/op/AuditEntity.java @@ -0,0 +1,71 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.op; + +import org.apache.hugegraph.util.JsonUtil; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonIgnoreProperties(ignoreUnknown = true) +public class AuditEntity { + @JsonProperty("audit_datetime") + private String datetime; + + @JsonProperty("audit_operation") + private String operation; + + @JsonProperty("audit_action") + private String action; + + @JsonProperty("audit_service") + private String service; + + @JsonProperty("audit_graphspace") + private String graphSpace; + + @JsonProperty("audit_graph") + private String graph; + + @JsonProperty("audit_level") + private String level; + + @JsonProperty("audit_user") + private String user; + + @JsonProperty("audit_ip") + private String ip; + + @JsonProperty("audit_result") + private String result = "Success"; + + public static AuditEntity fromMap(Map source) { + Map jsonData = (Map) source.get("json"); + return JsonUtil.fromJson(JsonUtil.toJson(jsonData), AuditEntity.class); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/op/LogEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/op/LogEntity.java new file mode 100644 index 000000000..d5a13ec8e --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/op/LogEntity.java @@ -0,0 +1,69 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.op; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hugegraph.util.ESUtil; + +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonIgnoreProperties(ignoreUnknown = true) +public class LogEntity { + @JsonProperty("log_datetime") + private String datetime; + + @JsonProperty("log_service") + private String service; + + @JsonProperty("log_host") + private String host; + + @JsonProperty("log_level") + private String level; + + @JsonProperty("log_message") + private String message; + + public static LogEntity fromMap(Map map) { + LogEntity logEntity = new LogEntity(); + logEntity.setDatetime( + ESUtil.parseTimestamp( + (String) ESUtil.getValueByPath(map, "@timestamp".split("\\.")))); + logEntity.setHost( + (String) ESUtil.getValueByPath(map, "host.name".split("\\."))); + logEntity.setService( + (String) ESUtil.getValueByPath(map, "fields.source" + .split("\\."))); + logEntity.setLevel( + (String) ESUtil.getValueByPath(map, "level".split("\\."))); + logEntity.setMessage( + (String) ESUtil.getValueByPath(map, "message".split("\\."))); + return logEntity; + } +} + diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/AdjacentQuery.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/AdjacentQuery.java index e9cf11e2a..9aece6b71 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/AdjacentQuery.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/AdjacentQuery.java @@ -24,7 +24,6 @@ import org.apache.hugegraph.structure.constant.Direction; import org.apache.hugegraph.structure.graph.Edge; import org.apache.hugegraph.structure.graph.Vertex; - import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ApplicationInfo.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ApplicationInfo.java new file mode 100644 index 000000000..03295b2bf --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ApplicationInfo.java @@ -0,0 +1,71 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.query; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Data; +import org.apache.hugegraph.annotation.MergeProperty; +import org.apache.hugegraph.common.AppType; +import org.apache.hugegraph.common.Mergeable; +import org.apache.hugegraph.util.JsonUtil; + + +@Data +@Builder +@TableName("app_info") +public class ApplicationInfo implements Mergeable { + // graph_name in mysql {idc}-{graph_space}-{graph} (eg:bddwd-DEFAULT-graph) + @TableField(value = "graph_name") + @MergeProperty + @JsonProperty("graph_name") + private String graphName; + + @TableField(value = "app_name") + @MergeProperty + @JsonProperty("app_name") + private String appName; + + @TableField(value = "app_type") + @MergeProperty + @JsonProperty("app_type") + private AppType appType; + + @TableField(value = "count_query") + @MergeProperty + @JsonProperty("count_query") + private String countQuery; + + @TableField(value = "distribution_query") + @MergeProperty + @JsonProperty("distribution_query") + private String distributionQuery; + + @TableField(value = "description") + @MergeProperty + @JsonProperty("description") + private String description; + + @Override + public String toString() { + return JsonUtil.toJson(this); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/EgonetView.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/EgonetView.java new file mode 100644 index 000000000..b1cd6fdfa --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/EgonetView.java @@ -0,0 +1,46 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.query; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class EgonetView { + + @JsonProperty("json_view") + private JsonView jsonView; + + @JsonProperty("table_view") + private TableView tableView; + + @JsonProperty("graph_view") + private GraphView graphView; + + @JsonProperty("egonet") + private Set ids; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ElementEditHistory.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ElementEditHistory.java new file mode 100644 index 000000000..811fc160d --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ElementEditHistory.java @@ -0,0 +1,111 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.query; + +import java.util.Date; + +import org.apache.hugegraph.annotation.MergeProperty; +import org.apache.hugegraph.common.Identifiable; +import org.apache.hugegraph.common.Mergeable; +import org.apache.hugegraph.util.JsonUtil; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@TableName("edit_history") +public class ElementEditHistory implements Identifiable, Mergeable { + + @TableId(type = IdType.AUTO) + @MergeProperty(useNew = false) + @JsonProperty("id") + private Integer id; + + @TableField(value = "graphspace") + @MergeProperty + @JsonProperty("graphspace") + private String graphspace; + + @TableField(value = "graph") + @MergeProperty + @JsonProperty("graph") + private String graph; + + @TableField(value = "element_id") + @MergeProperty + @JsonProperty("element_id") + private String elementId; + + @TableField(value = "label") + @MergeProperty + @JsonProperty("label") + private String label; + + @TableField(value = "property_num") + @MergeProperty + @JsonProperty("property_num") + private int propertyNum; + + @TableField(value = "option_type") + @MergeProperty + @JsonProperty("option_type") + private String optionType; + + @TableField(value = "option_time") + @MergeProperty + @JsonProperty("option_time") + private Date optionTime; + + @TableField(value = "option_person") + @MergeProperty + @JsonProperty("option_person") + private String optionPerson; + + @TableField(value = "content") + @MergeProperty + @JsonProperty("content") + private String content; + + public ElementEditHistory(Integer id, String graphspace, String graph, + String elementId, String label, int propertyNum, + String optionType, Date optionTime, + String optionPerson, String content) { + this.id = id; + this.graphspace = graphspace; + this.graph = graph; + this.elementId = elementId; + this.label = label; + this.propertyNum = propertyNum; + this.optionType = optionType; + this.optionTime = optionTime; + this.optionPerson = optionPerson; + this.content = content; + } + + @Override + public String toString() { + return JsonUtil.toJson(this); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ExecuteHistory.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ExecuteHistory.java index f1ddc3333..8e9d8ef96 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ExecuteHistory.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/ExecuteHistory.java @@ -27,7 +27,6 @@ import org.apache.hugegraph.entity.enums.ExecuteStatus; import org.apache.hugegraph.entity.enums.ExecuteType; import org.apache.hugegraph.util.SerializeUtil; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -35,14 +34,12 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor -@AllArgsConstructor @Builder @TableName("execute_history") public class ExecuteHistory implements Identifiable, Mergeable { @@ -52,10 +49,15 @@ public class ExecuteHistory implements Identifiable, Mergeable { @JsonProperty("id") private Integer id; - @TableField(value = "conn_id") + @TableField(value = "graphspace") + @MergeProperty + @JsonProperty("graphspace") + private String graphspace; + + @TableField(value = "graph") @MergeProperty - @JsonProperty("conn_id") - private Integer connId; + @JsonProperty("graphe") + private String graph; @TableField(value = "async_id") @MergeProperty @@ -67,10 +69,17 @@ public class ExecuteHistory implements Identifiable, Mergeable { @JsonProperty("type") private ExecuteType type; + // gremlin/cypher @MergeProperty @JsonProperty("content") private String content; + // 用户输入的语义文本 + @TableField(value = "text") + @MergeProperty + @JsonProperty("text") + private String text; + @TableField(value = "execute_status") @MergeProperty @JsonProperty("status") @@ -90,6 +99,34 @@ public class ExecuteHistory implements Identifiable, Mergeable { @JsonProperty("create_time") private Date createTime; + public ExecuteHistory(Integer id, String graphspace, String graph, + Long asyncId, + ExecuteType type, String content, + ExecuteStatus status, + AsyncTaskStatus asyncStatus, Long duration, + Date createTime) { + this(id, graphspace, graph, asyncId, type, content, "", status, + asyncStatus, duration, createTime); + } + + public ExecuteHistory(Integer id, String graphspace, String graph, + Long asyncId, + ExecuteType type, String content, String text, + ExecuteStatus status, AsyncTaskStatus asyncStatus, + Long duration, Date createTime) { + this.id = id; + this.graphspace = graphspace; + this.graph = graph; + this.asyncId = asyncId; + this.type = type; + this.content = content; + this.text = text; + this.status = status; + this.asyncStatus = asyncStatus; + this.duration = duration; + this.createTime = createTime; + } + public void setAsyncStatus(AsyncTaskStatus status) { this.asyncStatus = status; } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/FusiformsimilarityView.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/FusiformsimilarityView.java new file mode 100644 index 000000000..7d4648eaa --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/FusiformsimilarityView.java @@ -0,0 +1,48 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.query; + +import org.apache.hugegraph.structure.traverser.FusiformSimilarity; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; +import java.util.Set; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class FusiformsimilarityView { + + @JsonProperty("json_view") + private JsonView jsonView; + + @JsonProperty("table_view") + private TableView tableView; + + @JsonProperty("graph_view") + private GraphView graphView; + + @JsonProperty("similars") + private Map> similarsMap; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GraphView.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GraphView.java index 4d2d8d9c6..4e219f81c 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GraphView.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GraphView.java @@ -18,11 +18,19 @@ package org.apache.hugegraph.entity.query; +import java.util.ArrayList; import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import org.apache.hugegraph.entity.graph.VertexQueryEntity; import org.apache.hugegraph.structure.graph.Edge; import org.apache.hugegraph.structure.graph.Vertex; - import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; @@ -37,9 +45,179 @@ public class GraphView { public static final GraphView EMPTY = new GraphView(); + private static final int STATISTICS_ROWS = 10; + private static final int TOP_DEGREE_NUMBER = 10; @JsonProperty("vertices") - private Collection vertices; + private Collection vertices; @JsonProperty("edges") private Collection edges; + @JsonProperty("statistics") + private Map statistics = new HashMap<>(); + + public GraphView(Collection vertices, + Collection edges) { + Collection vertexQueryEntities = + new ArrayList<>(vertices.size()); + for (Vertex vertex: vertices) { + vertexQueryEntities.add(VertexQueryEntity.fromVertex(vertex)); + } + this.vertices = vertexQueryEntities; + this.edges = edges; + this.statistics = fillStatistics(vertexQueryEntities, edges); + } + + private Map fillStatistics( + Collection vertexList, + Collection edges) { + // 悬空边: 顶点展开或者图本身有悬空边 + // incidence_vertices, etc.. + Map vertices = + new HashMap<>(vertexList.size()); + for (VertexQueryEntity vertex: vertexList) { + vertices.put(vertex.id(), vertex); + } + + fillVertexStatistics(vertices, edges); + Map degrees = getDegrees(edges, vertices); + + Map statistics = new HashMap<>(STATISTICS_ROWS); + List> highestDegreeVertices = + getHighestDegreeVertices(degrees); + List isolatedVertices = getIsolatedVertices(degrees); + List> vertexLabelList = getVertexLabelList(vertices); + List isolatedEdges = getIsolatedEdges(edges, vertices); + List> edgeLabelList = getEdgeLabelList(edges); + + statistics.put("highest_degree_vertices", highestDegreeVertices); + statistics.put("isolated_vertices", isolatedVertices); + statistics.put("isolated_edges", isolatedEdges); + statistics.put("vertex_label", vertexLabelList); + statistics.put("edge_label", edgeLabelList); + return statistics; + } + + private Map getDegrees(Collection edges, + Map vertices) { + Map degrees = new HashMap<>(vertices.size()); + for (Map.Entry entry: vertices.entrySet()) { + degrees.put(entry.getKey(), 0); + } + + for (Edge edge: edges) { + // 悬空边: 会为相邻顶点计算度 + degrees.compute(edge.sourceId(), (k, v) -> v == null ? 1 : v + 1); + degrees.compute(edge.targetId(), (k, v) -> v == null ? 1 : v + 1); + } + return degrees; + } + + private void fillVertexStatistics(Map vertices, + Collection edges) { + // init + for (VertexQueryEntity vertex: vertices.values()) { + if (vertex.getStatistics().get("incidence_vertices") == null) { + Set incidenceVertices = new HashSet<>(edges.size()); + vertex.getStatistics().put("incidence_vertices", + incidenceVertices); + } + } + + // calculate + for (Edge edge: edges) { + Object source = edge.sourceId(); + Object target = edge.targetId(); + + if (vertices.get(source) == null || vertices.get(target) == null) { + continue; + } + Set incidenceVertices = + (Set) vertices.get(source) + .getStatistics() + .get("incidence_vertices"); + incidenceVertices.add(target); + incidenceVertices = + (Set) vertices.get(target) + .getStatistics() + .get("incidence_vertices"); + incidenceVertices.add(source); + } + } + + private List> getVertexLabelList(Map vertices) { + Map vertexLabels = new HashMap<>(vertices.size()); + for (Map.Entry entry: vertices.entrySet()) { + VertexQueryEntity vertex = entry.getValue(); + vertexLabels.compute(vertex.label(), (k, v) -> v == null ? 1 : v + 1); + } + return vertexLabels.entrySet().stream().map(e -> { + Map res = new HashMap<>(); + res.put("label", e.getKey()); + res.put("count", e.getValue()); + return res; + }).collect(Collectors.toList()); + } + + private List> getEdgeLabelList(Collection edges) { + Map edgeLabels = new HashMap<>(edges.size()); + for (Edge edge: edges) { + edgeLabels.compute(edge.label(), (k, v) -> v == null ? 1 : v + 1); + } + return edgeLabels.entrySet().stream().map(e -> { + Map res = new HashMap<>(); + res.put("label", e.getKey()); + res.put("count", e.getValue()); + return res; + }).collect(Collectors.toList()); + } + + private List> getHighestDegreeVertices(Map degrees) { + return degrees.entrySet().stream() + .sorted(Comparator.comparing(e -> e.getValue(), + Comparator.reverseOrder())) + .map(e -> { + Map res = new HashMap<>(); + res.put("id", e.getKey()); + res.put("degree", e.getValue()); + return res; + }).collect(Collectors.toList()) + .subList(0, Math.min(TOP_DEGREE_NUMBER, + degrees.size())); + } + + private List getIsolatedVertices(Map degrees) { + return degrees.entrySet().stream() + .filter(e -> e.getValue() == 0) + .map(e -> e.getKey()) + .collect(Collectors.toList()); + } + + private List getIsolatedEdges( + Collection edges, Map vertices) { + List isolatedEdges = new ArrayList<>(edges.size()); + for (Edge edge: edges) { + Object source = edge.sourceId(); + Object target = edge.targetId(); + + if (vertices.get(source) == null || vertices.get(target) == null) { + continue; + } + Set sourceIncidenceVertices = + (Set) vertices.get(source) + .getStatistics() + .get("incidence_vertices"); + Set targetIncidenceVertices = + (Set) vertices.get(target) + .getStatistics() + .get("incidence_vertices"); + + if (sourceIncidenceVertices.size() == 1 && + targetIncidenceVertices.size() == 1) { + isolatedEdges.add(edge.id()); + } + } + return isolatedEdges; + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinCollection.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinCollection.java index 73747c79f..9de1edae8 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinCollection.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinCollection.java @@ -23,8 +23,8 @@ import org.apache.hugegraph.annotation.MergeProperty; import org.apache.hugegraph.common.Identifiable; import org.apache.hugegraph.common.Mergeable; - import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonProperty; @@ -50,10 +50,23 @@ public class GremlinCollection implements Identifiable, Mergeable { @JsonProperty("conn_id") private Integer connId; + @MergeProperty + @JsonProperty("graphspace") + @TableField("graphspace") + private String graphSpace; + + @MergeProperty + @JsonProperty("graph") + private String graph; + @MergeProperty @JsonProperty("name") private String name; + @MergeProperty + @JsonProperty("type") + private String type; + @MergeProperty @JsonProperty("content") private String content; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinQuery.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinQuery.java index 3f6c15a1c..3927e28d9 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinQuery.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinQuery.java @@ -20,17 +20,29 @@ import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor -@AllArgsConstructor @Builder public class GremlinQuery { @JsonProperty("content") private String content; + + @JsonProperty("text") + private String text; + + public GremlinQuery() { + this.text = ""; + } + public GremlinQuery(String content) { + this.content = content; + this.text = ""; + } + + public GremlinQuery(String content, String text) { + this.content = content; + this.text = text; + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinResult.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinResult.java index 83d43d253..96297994b 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinResult.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/GremlinResult.java @@ -19,7 +19,6 @@ package org.apache.hugegraph.entity.query; import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -43,6 +42,9 @@ public class GremlinResult { @JsonProperty("graph_view") private GraphView graphView; + @JsonProperty("pathnum") + private Integer pathnum; + public enum Type { EMPTY, diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/JaccardsimilarityView.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/JaccardsimilarityView.java new file mode 100644 index 000000000..20862a3e5 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/JaccardsimilarityView.java @@ -0,0 +1,35 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.query; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class JaccardsimilarityView { + + @JsonProperty("jaccardsimilarity") + private Object jaccardsimilarity; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/JsonView.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/JsonView.java index 3569de53f..340297916 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/JsonView.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/JsonView.java @@ -18,15 +18,14 @@ package org.apache.hugegraph.entity.query; -import java.util.List; - import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + @Data @NoArgsConstructor @AllArgsConstructor diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/OlapView.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/OlapView.java new file mode 100644 index 000000000..f6ce5c3a8 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/OlapView.java @@ -0,0 +1,34 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.query; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class OlapView { + @JsonProperty("task_id") + private long taskId; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/RanksView.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/RanksView.java new file mode 100644 index 000000000..745fc7914 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/RanksView.java @@ -0,0 +1,40 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.query; + +import org.apache.hugegraph.structure.traverser.Ranks; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class RanksView { + @JsonProperty("ranks") + private Ranks ranks; + + @JsonProperty("rankslist") + private List ranksList; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/SameneighborsbatchView.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/SameneighborsbatchView.java new file mode 100644 index 000000000..73578646d --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/query/SameneighborsbatchView.java @@ -0,0 +1,38 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.query; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SameneighborsbatchView { + + @JsonProperty("same_neighbors") + public List> sameNeighbors; + +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/ConflictDetail.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/ConflictDetail.java index 8886a1500..cab8fcdbe 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/ConflictDetail.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/ConflictDetail.java @@ -18,19 +18,17 @@ package org.apache.hugegraph.entity.schema; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import org.springframework.util.CollectionUtils; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; @Data @NoArgsConstructor @@ -64,7 +62,7 @@ public ConflictDetail(SchemaType type) { @SuppressWarnings("unchecked") public List> getConflicts( - SchemaType type) { + SchemaType type) { switch (type) { case PROPERTY_KEY: return (List>) (Object) this.pkConflicts; @@ -76,7 +74,7 @@ public List> getConflicts( return (List>) (Object) this.elConflicts; default: throw new AssertionError(String.format( - "Unknown schema type '%s'", type)); + "Unknown schema type '%s'", type)); } } @@ -109,8 +107,8 @@ public boolean anyVertexLabelConflict(Collection names) { } private boolean anyConflict( - List> conflicts, - Collection names) { + List> conflicts, + Collection names) { if (CollectionUtils.isEmpty(names)) { return false; } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/EdgeLabelEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/EdgeLabelEntity.java index 4bd97090e..a10958ae9 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/EdgeLabelEntity.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/EdgeLabelEntity.java @@ -18,20 +18,18 @@ package org.apache.hugegraph.entity.schema; -import java.util.Date; -import java.util.List; -import java.util.Set; - -import org.apache.hugegraph.util.HubbleUtil; - import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableSet; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.hugegraph.util.HubbleUtil; + +import java.util.Date; +import java.util.List; +import java.util.Set; @Data @NoArgsConstructor @@ -42,6 +40,15 @@ public class EdgeLabelEntity implements SchemaLabelEntity, Timefiable { @JsonProperty("name") private String name; + @JsonProperty("edgelabel_type") + private String edgeLabelType; + + @JsonProperty("parent_label") + private String parentLabel; + + @JsonProperty("children") + private List children; + @JsonProperty("source_label") private String sourceLabel; @@ -61,7 +68,7 @@ public class EdgeLabelEntity implements SchemaLabelEntity, Timefiable { private List propertyIndexes; @JsonProperty("open_label_index") - private boolean openLabelIndex; + private Boolean openLabelIndex; @JsonProperty("style") private EdgeLabelStyle style; @@ -86,6 +93,8 @@ public boolean equals(Object object) { } EdgeLabelEntity other = (EdgeLabelEntity) object; return this.name.equals(other.name) && + this.edgeLabelType.equals(other.edgeLabelType) && + this.parentLabel.equals(other.parentLabel) && this.sourceLabel.equals(other.sourceLabel) && this.targetLabel.equals(other.targetLabel) && this.linkMultiTimes == other.linkMultiTimes && diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/EdgeLabelStyle.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/EdgeLabelStyle.java index a45951cf2..53e0215f6 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/EdgeLabelStyle.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/EdgeLabelStyle.java @@ -18,18 +18,16 @@ package org.apache.hugegraph.entity.schema; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.util.CollectionUtils; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableList; - import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; + +import java.util.List; @Data @EqualsAndHashCode(callSuper = true) diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/LabelUpdateEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/LabelUpdateEntity.java index 78be7da66..60398bff7 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/LabelUpdateEntity.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/LabelUpdateEntity.java @@ -18,15 +18,14 @@ package org.apache.hugegraph.entity.schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import com.fasterxml.jackson.annotation.JsonProperty; - -import lombok.Data; - @Data public abstract class LabelUpdateEntity implements Typifiable { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/Property.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/Property.java index c43681a54..aabdb8db3 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/Property.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/Property.java @@ -19,11 +19,12 @@ package org.apache.hugegraph.entity.schema; import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.hugegraph.structure.constant.Cardinality; +import org.apache.hugegraph.structure.constant.DataType; @Data @NoArgsConstructor @@ -36,4 +37,10 @@ public class Property { @JsonProperty("nullable") private boolean nullable; + + @JsonProperty("data_type") + private DataType dataType; + + @JsonProperty("cardinality") + private Cardinality cardinality; } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/PropertyIndex.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/PropertyIndex.java index 29d798863..e5fab52cd 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/PropertyIndex.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/PropertyIndex.java @@ -18,17 +18,15 @@ package org.apache.hugegraph.entity.schema; -import java.util.List; - -import org.apache.hugegraph.structure.constant.IndexType; -import org.apache.hugegraph.util.HubbleUtil; - import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.hugegraph.structure.constant.IndexType; +import org.apache.hugegraph.util.HubbleUtil; + +import java.util.List; @Data @NoArgsConstructor diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/PropertyKeyEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/PropertyKeyEntity.java index e9b6f9a1e..81b712d55 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/PropertyKeyEntity.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/PropertyKeyEntity.java @@ -22,7 +22,6 @@ import org.apache.hugegraph.structure.constant.Cardinality; import org.apache.hugegraph.structure.constant.DataType; - import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaConflict.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaConflict.java index ff956bf02..77210a6d4 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaConflict.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaConflict.java @@ -1,22 +1,24 @@ /* + * * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * * http://www.apache.org/licenses/LICENSE-2.0 + * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. */ package org.apache.hugegraph.entity.schema; import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaLabelEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaLabelEntity.java index f1b1f17d7..b40d15cc4 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaLabelEntity.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaLabelEntity.java @@ -34,7 +34,7 @@ public interface SchemaLabelEntity extends SchemaEntity { List getPropertyIndexes(); - boolean isOpenLabelIndex(); + Boolean getOpenLabelIndex(); SchemaStyle getStyle(); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaStyle.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaStyle.java index 624a01ff6..027e02999 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaStyle.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaStyle.java @@ -19,5 +19,4 @@ package org.apache.hugegraph.entity.schema; public class SchemaStyle { - } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaType.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaType.java index 8e3b1c85b..669ef14bc 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaType.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/SchemaType.java @@ -69,7 +69,7 @@ public static SchemaType convert(HugeType type) { return PROPERTY_INDEX; default: throw new InternalException( - "Can't convert HugeType '%s' to SchemaType", type); + "Can't convert HugeType '%s' to SchemaType", type); } } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/VertexLabelEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/VertexLabelEntity.java index 3edb81f97..34c6efd1f 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/VertexLabelEntity.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/VertexLabelEntity.java @@ -24,7 +24,6 @@ import org.apache.hugegraph.structure.constant.IdStrategy; import org.apache.hugegraph.util.HubbleUtil; - import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; @@ -54,7 +53,7 @@ public class VertexLabelEntity implements SchemaLabelEntity, Timefiable { private List propertyIndexes; @JsonProperty("open_label_index") - private boolean openLabelIndex; + private Boolean openLabelIndex; @JsonProperty("style") private VertexLabelStyle style; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/VertexLabelStyle.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/VertexLabelStyle.java index 8c8e11700..0a27a4381 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/VertexLabelStyle.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/VertexLabelStyle.java @@ -18,22 +18,22 @@ package org.apache.hugegraph.entity.schema; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.util.CollectionUtils; - import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableList; - import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; + +import java.util.List; @Data @EqualsAndHashCode(callSuper = true) @Builder +@JsonIgnoreProperties(ignoreUnknown = true) public class VertexLabelStyle extends SchemaStyle { @JsonProperty("icon") diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/vertexlabel/ParamEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/vertexlabel/ParamEntity.java new file mode 100644 index 000000000..54defb7d6 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/vertexlabel/ParamEntity.java @@ -0,0 +1,96 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.schema.vertexlabel; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hugegraph.entity.schema.*; +import org.apache.hugegraph.structure.constant.IdStrategy; +import org.apache.hugegraph.util.HubbleUtil; + +import java.util.Date; +import java.util.List; +import java.util.Set; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ParamEntity implements SchemaLabelEntity, Timefiable { + + @JsonProperty("name") + private String name; + + @JsonProperty("id_strategy") + private IdStrategy idStrategy; + + @JsonProperty("properties") + private Set properties; + + @JsonProperty("primary_keys") + private List primaryKeys; + + @JsonProperty("display_fields") + private List displayFields; + + @JsonProperty("property_indexes") + private List propertyIndexes; + + @JsonProperty("open_label_index") + private Boolean openLabelIndex; + + @JsonProperty("style") + private ParamStyle style; + + @JsonProperty("create_time") + private Date createTime; + + @Override + public SchemaType getSchemaType() { + return SchemaType.VERTEX_LABEL; + } + + @Override + public boolean equals(Object object) { + if (!(object instanceof ParamEntity)) { + return false; + } + ParamEntity other = (ParamEntity) object; + return this.name.equals(other.name) && + this.idStrategy == other.idStrategy && + HubbleUtil.equalCollection(this.properties, other.properties) && + HubbleUtil.equalCollection(this.primaryKeys, other.primaryKeys) && + HubbleUtil.equalCollection(this.propertyIndexes, + other.propertyIndexes) && + this.openLabelIndex == other.openLabelIndex; + } + +// @Override + public void setDisplayFields(@JsonProperty("display_fields") List displayFields) { + this.displayFields = displayFields; + } + + @Override + public int hashCode() { + return this.name.hashCode(); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/vertexlabel/ParamStyle.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/vertexlabel/ParamStyle.java new file mode 100644 index 000000000..3c80dba22 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/schema/vertexlabel/ParamStyle.java @@ -0,0 +1,63 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.schema.vertexlabel; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.StringUtils; +import org.apache.hugegraph.entity.schema.SchemaStyle; +import org.apache.hugegraph.entity.schema.VertexLabelStyle; + +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +public class ParamStyle extends SchemaStyle { + @JsonProperty("color") + private String color; + + @JsonProperty("size") + private VertexLabelStyle.Size size; + + public ParamStyle() { + this(null, null); + } + + @JsonCreator + public ParamStyle(@JsonProperty("color") String color, + @JsonProperty("size") VertexLabelStyle.Size size) { + this.color = !StringUtils.isEmpty(color) ? color : "#5C73E6"; + this.size = size != null ? size : VertexLabelStyle.Size.NORMAL; + } + + public enum Size { + + HUGE, + + BIG, + + NORMAL, + + SMALL, + + TINY + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/BuiltInEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/BuiltInEntity.java new file mode 100644 index 000000000..8d4dc865d --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/BuiltInEntity.java @@ -0,0 +1,39 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.space; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class BuiltInEntity { + @JsonProperty("init_space") + public boolean initSpace = true; + @JsonProperty("init_hlm") + public boolean initHlm = true; + @JsonProperty("init_covid19") + public boolean initCovid19 = true; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/ComputerServiceEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/ComputerServiceEntity.java new file mode 100644 index 000000000..6490c2233 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/ComputerServiceEntity.java @@ -0,0 +1,50 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.space; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ComputerServiceEntity { + @JsonProperty("id") + public long id; + @JsonProperty("task_type") + public String type; + @JsonProperty("task_name") + public String name; + @JsonProperty("task_status") + public String status; + @JsonProperty("task_progress") + public long progress; + @JsonProperty("task_algorithm") + public String algorithm; + @JsonProperty("task_description") + public String description; + @JsonProperty("task_create") + public long create; + @JsonProperty("task_input") + public String input; +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/GraphSpaceEntity.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/GraphSpaceEntity.java new file mode 100644 index 000000000..6134d11fb --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/space/GraphSpaceEntity.java @@ -0,0 +1,58 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.entity.space; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.hugegraph.structure.space.GraphSpace; +import org.apache.hugegraph.util.JsonUtil; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class GraphSpaceEntity extends GraphSpace { + @JsonProperty("graphspace_admin") + public List graphspaceAdmin = new ArrayList<>(); + + @JsonProperty("statistic") + public Map statistic = new HashMap<>(); + + public GraphSpaceEntity() { + } + + public static GraphSpaceEntity fromGraphSpace(GraphSpace graphSpace) { + return JsonUtil.fromJson(JsonUtil.toJson(graphSpace), GraphSpaceEntity.class); + } + + public GraphSpace convertGraphSpace() { + // Generate GraphSpace instance From GraphSpaceEntity + return this; + } + + public Map getStatistic() { + return statistic; + } + + public void setStatistic(Map statistic) { + this.statistic = statistic; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/task/AsyncTask.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/task/AsyncTask.java index 015d2c043..f74e2de9a 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/task/AsyncTask.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/task/AsyncTask.java @@ -22,7 +22,6 @@ import org.apache.hugegraph.annotation.MergeProperty; import org.apache.hugegraph.util.SerializeUtil; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/task/AsyncTaskResult.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/task/AsyncTaskResult.java index 6d0dc002c..e204c357d 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/task/AsyncTaskResult.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/entity/task/AsyncTaskResult.java @@ -19,7 +19,6 @@ package org.apache.hugegraph.entity.task; import org.apache.hugegraph.annotation.MergeProperty; - import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/HugeException.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/HugeException.java new file mode 100644 index 000000000..86e743d53 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/HugeException.java @@ -0,0 +1,25 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.exception; +//TODO X Temp Added +public class HugeException extends RuntimeException { + public HugeException(String msg){ + super(msg); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/GenericException.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/UnauthorizedException.java similarity index 66% rename from hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/GenericException.java rename to hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/UnauthorizedException.java index 2f41d40c2..55fd0e71f 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/GenericException.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/UnauthorizedException.java @@ -18,17 +18,8 @@ package org.apache.hugegraph.exception; -/** - * Used to wrap other unexpected exceptions like Client/ServerException, and convert them into this. - * This is typically done to handle exceptions uniformly in the hubble UI. - */ -public class GenericException extends ParameterizedException { - - public GenericException(ServerException e) { - super(e.getMessage(), e.getCause()); - } - - public GenericException(Exception e) { - super(e.getMessage(), e.getCause()); +public class UnauthorizedException extends RuntimeException{ + public UnauthorizedException() { + super("Unauthorized"); } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomApplicationRunner.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomApplicationRunner.java index fa91feef9..0bdcebd91 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomApplicationRunner.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomApplicationRunner.java @@ -18,6 +18,9 @@ package org.apache.hugegraph.handler; +//import org.apache.hugegraph.license.LicenseVerifier; // TODO C Remove Licence + +import lombok.extern.log4j.Log4j2; import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.license.ServerInfo; import org.apache.hugegraph.options.HubbleOptions; @@ -26,11 +29,8 @@ import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; -import lombok.extern.log4j.Log4j2; - @Log4j2 @Component -// TODO: Why we need this class? public class CustomApplicationRunner implements ApplicationRunner { @Autowired @@ -40,5 +40,11 @@ public class CustomApplicationRunner implements ApplicationRunner { public void run(ApplicationArguments args) throws Exception { String serverId = this.config.get(HubbleOptions.SERVER_ID); ServerInfo serverInfo = new ServerInfo(serverId); + log.info("The server info has been inited"); + //this.installLicense(serverInfo, "9662b261c388fc5923ace0ebe2a34b02"); // TODO C Remove Licence + } + + private void installLicense(ServerInfo serverInfo, String md5) { + //LicenseVerifier.instance().install(serverInfo, md5);// TODO C Remove Licence } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomInterceptor.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomInterceptor.java index f7587e2a6..01342e9c3 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomInterceptor.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomInterceptor.java @@ -23,24 +23,29 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; -import org.apache.hugegraph.exception.InternalException; -import org.apache.hugegraph.service.license.LicenseService; +//import org.apache.hugegraph.license.LicenseVerifier; // TODO C Remove Licence +import org.apache.hugegraph.service.HugeClientPoolService; +//import org.apache.hugegraph.service.license.LicenseService;// TODO C Remove Licence import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.driver.HugeClient; + import lombok.extern.log4j.Log4j2; @Log4j2 @Component public class CustomInterceptor extends HandlerInterceptorAdapter { + //@Autowired + //private LicenseService licenseService;// TODO C Remove Licence @Autowired - private LicenseService licenseService; + protected HugeClientPoolService hugeClientPoolService; private static final Pattern CHECK_API_PATTERN = - Pattern.compile(".*/graph-connections/\\d+/.+"); + Pattern.compile(".*/graph-connections/\\d+/.+"); @Override public boolean preHandle(HttpServletRequest request, @@ -48,14 +53,56 @@ public boolean preHandle(HttpServletRequest request, Object handler) { String url = request.getRequestURI(); if (!CHECK_API_PATTERN.matcher(url).matches()) { + setHugeClientToRequest(request); return true; } - String connIdValue = StringUtils.substringBetween( - url, "/graph-connections/", "/"); - if (StringUtils.isEmpty(connIdValue)) { - throw new InternalException("Not found conn id in url"); - } + // String connIdValue = StringUtils.substringBetween( + // url, "/graph-connections/", "/"); + // if (StringUtils.isEmpty(connIdValue)) { + // throw new InternalException("Not found conn id in url"); + // } + + // int connId = Integer.parseInt(connIdValue); + // Check graph connection valid + // this.licenseService.checkGraphStatus(connId); + //LicenseVerifier.instance().verifyIfNeeded(); // TODO C Remove Licence + setHugeClientToRequest(request); return true; } + + public void setHugeClientToRequest(HttpServletRequest request) { + String uri = request.getRequestURI(); + HugeClient client = null; + if ((Constant.API_VERSION + "auth/login").equals(uri)) { + client = unauthClient(); + } else { + String token = + (String) request.getSession().getAttribute(Constant.TOKEN_KEY); + String [] res = uri.split("/"); + String graphSpace = null; + String graph = null; + for (int i = 0; i < res.length; i ++) { + if ("graphspaces".equals(res[i]) && i < res.length - 1) { + graphSpace = res[i + 1]; + } + if ("graphs".equals(res[i]) && i < res.length - 1) { + graph = res[i + 1]; + } + } + client = this.authClient(graphSpace, graph, token); + } + + request.setAttribute("hugeClient", client); + } + + protected HugeClient authClient(String graphSpace, String graph, + String token) { + return this.hugeClientPoolService.createAuthClient(graphSpace, graph, + token); + } + + protected HugeClient unauthClient() { + return this.hugeClientPoolService.createUnauthClient(); + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/EdgeMappingTypeHandler.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/EdgeMappingTypeHandler.java index fbeb04e92..cdac5b206 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/EdgeMappingTypeHandler.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/EdgeMappingTypeHandler.java @@ -25,12 +25,13 @@ import java.util.Set; import org.apache.hugegraph.entity.load.EdgeMapping; -import org.apache.hugegraph.loader.util.JsonUtil; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.MappedTypes; +import org.apache.hugegraph.loader.util.JsonUtil; + @MappedTypes(value = {EdgeMapping.class}) @MappedJdbcTypes(value = {JdbcType.VARCHAR}) public class EdgeMappingTypeHandler extends BaseTypeHandler> { @@ -45,7 +46,7 @@ public void setNonNullParameter(PreparedStatement preparedStatement, @Override public Set getNullableResult(ResultSet resultSet, String columnName) - throws SQLException { + throws SQLException { String json = resultSet.getString(columnName); return JsonUtil.convertSet(json, EdgeMapping.class); } @@ -53,15 +54,15 @@ public Set getNullableResult(ResultSet resultSet, @Override public Set getNullableResult(ResultSet resultSet, int columnIndex) - throws SQLException { + throws SQLException { String json = resultSet.getString(columnIndex); return JsonUtil.convertSet(json, EdgeMapping.class); } @Override public Set getNullableResult( - CallableStatement callableStatement, - int columnIndex) throws SQLException { + CallableStatement callableStatement, + int columnIndex) throws SQLException { String json = callableStatement.getString(columnIndex); return JsonUtil.convertSet(json, EdgeMapping.class); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ErrorCodeMessage.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ErrorCodeMessage.java new file mode 100644 index 000000000..43c32a7a2 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ErrorCodeMessage.java @@ -0,0 +1,193 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.handler; + +import java.util.List; + +public class ErrorCodeMessage { + public static String getErrorMessage(String code, String message, + Object... args) { + // 1: server 2:client + if (code.startsWith("1")) { + return ServerCode.fromCode(code, message, args); + } else if (code.startsWith("2")) { + return ClientCode.fromCode(code, message, args); + } else { + return String.format("无效的错误码: %s,错误信息:%s", code, message); + } + } + + public enum ClientCode { + + // 00-xxx for common error + SUCCEED("200-000", "执行成功"), + + FAILED("200-001", "%s"), + + NULL_VALUE("200-002", "参数 %s 不能为 null"), + + INVALID_VALUE("200-003", "%s!"), + + MISSING_PARAM("200-004", "缺少参数 %s"), + + NOT_EXISTS("200-005", "参数 %s 不存在!"), + + EXISTS("200-006", "%s 已存在!"), + + INVALID_PARAM("200-007", "%s(%s)取值非法!"), + + INVALID_VALUE_OUT_RANGE("200-008", + "参数越界:参数 %s 的取值范围为 %s."), + + // 01-xxx for graphSpace error + // 02-xxx for graphs error + // 03-xxx for schema error + UNDEFINED_PROPERTY_KEY("203-000", "不存在的属性类型:%s"), + + UNDEFINED_VERTEX_LABEL("203-001", "不存在的顶点类型:%s"), + + UNDEFINED_EDGE_LABEL("203-002", "不存在的边类型:%s"), + // 04-xxx for vertex and edge error + // 05-xxx for oltp algorithms error + + /* + * param out of range error + * param name: degree, capacity, limit + * */ + PARAM_OUT_RANGE("205-000", "%s 取值范围 > 0 或 == %s,当前值:%s"), + + PARAM_GREATER("205-001", "%s 必须 >= %s,当前值为 '%s' 和 '%s'"), + + PARAM_SMALLER("205-002", "%s 必须 < %s"), + ; + + private String code; + private String message; + private List attach; + + ClientCode(String code, String message) { + this.code = code; + this.message = message; + } + + public static String fromCode(String code, String message, + Object... args) { + for (ClientCode cc: ClientCode.values()) { + if (cc.code.equals(code)) { + return cc.getMessage(args); + } + } + return String.format("无效的错误码: %s,错误信息:%s", code, message); + } + + public String getMessage(Object... args) { + return String.format(this.message, args); + } + } + + public enum ServerCode { + + // 00-xxx for common error + SUCCEED("100-000", "执行成功"), + + FAILED("100-001", "%s"), + + NULL_VALUE("100-002", "参数 %s 不能为 null"), + + INVALID_VALUE("100-003", "%s!"), + + MISSING_PARAM("100-004", "缺少参数 %s"), + + NOT_EXISTS("100-005", "参数 %s 不存在!"), + + EXISTS("100-006", "%s 已存在!"), + + INVALID_PARAM("100-007", "%s(%s)取值非法!"), + + INVALID_VALUE_OUT_RANGE("100-008", + "参数越界:参数 %s 的取值范围为 %s."), + // 01-xxx for graphSpace error + // 02-xxx for graphs error + // 03-xxx for schema error + UNDEFINED_PROPERTY_KEY("103-000", "不存在的属性类型:%s"), + + UNDEFINED_VERTEX_LABEL("103-001", "不存在的顶点类型 %s"), + + UNDEFINED_EDGE_LABEL("103-002", "不存在的边类型:%s"), + + INVALID_PROP_VALUE("103-003", "属性值 %s 的数据类型错误, " + + "需要的类型(字段)为 %s(%s), 实际类型 %s"), + + // 04-xxx for vertex and edge error + VERTEX_NOT_EXIST("104-001", "顶点 %s 不存在"), + + VERTEX_NAME_NOT_EXIST("104-002", "参数 %s 的值 '%s' 不存在"), + + IDS_NOT_EXIST("104-003", "不存在的 ids %s"), + + EDGE_INVALID_LINK("104-004", "不存在的 source/target 类型 %s,%s 对应边类型 %s"), + + LABEL_PROP_NOT_EXIST("104-005", "不存在顶点类型为 %s,属性为 %s 的顶点"), + + // 05-xxx for oltp algorithms error + REACH_CAPACITY("105-003", "达到临界 capacity %s"), + + REACH_CAPACITY_WITH_DEPTH("105-004", "达到临界 capacity %s," + + "剩余 depth 为 %s"), + + EXCEED_CAPACITY_WHILE_FINDING("105-005", "达到临界 capacity %s," + + "查找对象:%s"), + + INVALID_LIMIT("105-006", "无效的 limit %s, 必须 <= capacity(%s)"), + + PARAM_GREATER("105-007", "%s 必须 >= %s, 当前值为 %s 和 %s"), + + PARAM_SMALLER("105-008", "%s 必须 < %s"), + + DEPTH_OUT_RANGE("105-009", "depth 取值范围 (0, 5000], " + + "当前值: %s"), + + VERTEX_PAIR_LENGTH_ERROR("105-010", "顶点对长度错误"), + + SOURCE_TARGET_SAME("105-011", "source 和 target 不能取相同 id"), + ; + + private String code; + private String message; + + ServerCode(String code, String message) { + this.code = code; + this.message = message; + } + + public static String fromCode(String code, String message, + Object... args) { + for (ServerCode sc: ServerCode.values()) { + if (sc.code.equals(code)) { + return sc.getMessage(args); + } + } + return String.format("无效的错误码: %s,错误信息:%s", code, message); + } + + public String getMessage(Object... args) { + return String.format(this.message, args); + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java index 5ddefbb19..04f953b30 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java @@ -18,21 +18,33 @@ package org.apache.hugegraph.handler; -import org.apache.hugegraph.common.Constant; -import org.apache.hugegraph.common.Response; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.exception.ServerException; +import org.apache.commons.lang3.StringUtils; import org.apache.hugegraph.exception.ExternalException; -import org.apache.hugegraph.exception.GenericException; import org.apache.hugegraph.exception.IllegalGremlinException; import org.apache.hugegraph.exception.InternalException; import org.apache.hugegraph.exception.ParameterizedException; +import org.apache.hugegraph.exception.UnauthorizedException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.common.Response; +import org.apache.hugegraph.util.JsonUtil; import lombok.extern.log4j.Log4j2; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + @Log4j2 @RestControllerAdvice public class ExceptionAdvisor { @@ -43,8 +55,9 @@ public class ExceptionAdvisor { @ExceptionHandler(InternalException.class) @ResponseStatus(HttpStatus.OK) public Response exceptionHandler(InternalException e) { - log.error("InternalException:", e); + log.info("Log InternalException: ", e); String message = this.handleMessage(e.getMessage(), e.args()); + closeRequestClient(); return Response.builder() .status(Constant.STATUS_INTERNAL_ERROR) .message(message) @@ -55,8 +68,9 @@ public Response exceptionHandler(InternalException e) { @ExceptionHandler(ExternalException.class) @ResponseStatus(HttpStatus.OK) public Response exceptionHandler(ExternalException e) { - log.error("ExternalException:", e); + log.info("Log ExternalException: ", e); String message = this.handleMessage(e.getMessage(), e.args()); + closeRequestClient(); return Response.builder() .status(e.status()) .message(message) @@ -64,23 +78,29 @@ public Response exceptionHandler(ExternalException e) { .build(); } - @ExceptionHandler(GenericException.class) + @ExceptionHandler(ParameterizedException.class) @ResponseStatus(HttpStatus.OK) - public Response exceptionHandler(GenericException e) { - log.error("GenericException:", e); + public Response exceptionHandler(ParameterizedException e) { + String message = this.handleMessage(e.getMessage(), e.args()); + closeRequestClient(); return Response.builder() .status(Constant.STATUS_BAD_REQUEST) - .message("Faied to connect the graph server. Please refer to the " + - "Hubble log for details.") - .cause(null) + .message(message) + .cause(e.getCause()) .build(); } - @ExceptionHandler(ParameterizedException.class) + @ExceptionHandler(ServerException.class) @ResponseStatus(HttpStatus.OK) - public Response exceptionHandler(ParameterizedException e) { - log.error("ParameterizedException", e); - String message = this.handleMessage(e.getMessage(), e.args()); + public Response exceptionHandler(ServerException e) { + String logMessage = "Log ServerException: \n" + e.exception() + "\n"; + if (e.trace() != null) { + logMessage += StringUtils.join((List) e.trace(), "\n"); + } + log.info(logMessage); + + String message = this.handleMessage(e.getMessage(), null); + closeRequestClient(); return Response.builder() .status(Constant.STATUS_BAD_REQUEST) .message(message) @@ -91,8 +111,9 @@ public Response exceptionHandler(ParameterizedException e) { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.OK) public Response exceptionHandler(Exception e) { - log.error("Exception:", e); + log.info("Log Exception: ", e); String message = this.handleMessage(e.getMessage(), null); + closeRequestClient(); return Response.builder() .status(Constant.STATUS_BAD_REQUEST) .message(message) @@ -103,8 +124,9 @@ public Response exceptionHandler(Exception e) { @ExceptionHandler(IllegalGremlinException.class) @ResponseStatus(HttpStatus.OK) public Response exceptionHandler(IllegalGremlinException e) { - log.error("IllegalGremlinException:", e); + log.info("Log IllegalGremlinException: ", e); String message = this.handleMessage(e.getMessage(), e.args()); + closeRequestClient(); return Response.builder() .status(Constant.STATUS_ILLEGAL_GREMLIN) .message(message) @@ -112,6 +134,34 @@ public Response exceptionHandler(IllegalGremlinException e) { .build(); } + @ExceptionHandler(UnauthorizedException.class) + @ResponseStatus(HttpStatus.OK) + public Response exceptionHandler(UnauthorizedException e) { + log.info("Log UnauthorizedException: ", e); + String message = e.getMessage(); + closeRequestClient(); + return Response.builder() + .status(Constant.STATUS_UNAUTHORIZED) + .message(message) + .cause(null) + .build(); + } + + protected HttpServletRequest getRequest() { + return ((ServletRequestAttributes) + RequestContextHolder.getRequestAttributes()).getRequest(); + } + + public void closeRequestClient() { + HttpServletRequest httpRequest = getRequest(); + if (httpRequest.getAttribute("hugeClient") != null) { + HugeClient client = (HugeClient) httpRequest.getAttribute( + "hugeClient"); + client.close(); + httpRequest.removeAttribute("hugeClient"); + } + } + private String handleMessage(String message, Object[] args) { String[] strArgs = null; if (args != null && args.length > 0) { @@ -120,6 +170,8 @@ private String handleMessage(String message, Object[] args) { strArgs[i] = args[i] != null ? args[i].toString() : "?"; } } + message = handleErrorCode(message); + try { message = this.messageSourceHandler.getMessage(message, strArgs); } catch (Throwable e) { @@ -127,4 +179,27 @@ private String handleMessage(String message, Object[] args) { } return message; } + + private String handleErrorCode(String message) { + // message with ErrorCode is Json String + if (message != null && message.startsWith("{\"")) { + try { + Map result = JsonUtil.fromJson(message, + Map.class); + if (result.containsKey("code") && result.containsKey("message")) { + String code = result.get("code").toString(); + String origin = result.get("message").toString(); + List attach = (List) result.get("attach"); + message = ErrorCodeMessage.getErrorMessage(code, origin, + attach.toArray()); + } + } catch (Exception e) { + throw new RuntimeException( + String.format("Fail to handle error code for message " + + "%s, error: %s", message, + e.getMessage())); + } + } + return message; + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/HubbleDisposableBean.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/HubbleDisposableBean.java index 54c216963..38ebdd834 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/HubbleDisposableBean.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/HubbleDisposableBean.java @@ -18,13 +18,12 @@ package org.apache.hugegraph.handler; +import lombok.extern.log4j.Log4j2; import org.apache.hugegraph.service.load.LoadTaskService; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import lombok.extern.log4j.Log4j2; - @Log4j2 @Component public class HubbleDisposableBean implements DisposableBean { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/LoadTaskExecutor.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/LoadTaskExecutor.java index d660c273d..07e7ca164 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/LoadTaskExecutor.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/LoadTaskExecutor.java @@ -31,8 +31,13 @@ public class LoadTaskExecutor { @Async public void execute(LoadTask task, Runnable callback) { log.info("Executing task: {}", task.getId()); - task.run(); - log.info("Executed task: {}, update status to db", task.getId()); - callback.run(); + try { + task.run(); + } catch (Throwable t) { + log.warn("Executing task: {} error", task.getId(), t); + } finally { + log.info("Executed task: {}, update status to db", task.getId()); + callback.run(); + } } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/LoginInterceptor.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/LoginInterceptor.java new file mode 100644 index 000000000..e698292d2 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/LoginInterceptor.java @@ -0,0 +1,43 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.handler; + +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class LoginInterceptor extends HandlerInterceptorAdapter { + + @Override + public boolean preHandle(HttpServletRequest request, + HttpServletResponse response, + Object handler) { + String uri = request.getRequestURI(); + if ("check".equals(uri) || "/api/v1.3/bill/cron".equals(uri)) { // TODO C rmv required? + return true; + } + +// if (request.getSession().getAttribute(Constant.TOKEN_KEY) == null) { // TODO C why anno.? +// throw new UnauthorizedException(); +// } + + return true; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/MessageSourceHandler.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/MessageSourceHandler.java index 62c1119d8..4658deaf8 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/MessageSourceHandler.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/MessageSourceHandler.java @@ -18,11 +18,7 @@ package org.apache.hugegraph.handler; -import java.util.Locale; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; - +import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.LocaleUtils; import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.entity.UserInfo; @@ -36,7 +32,9 @@ import org.springframework.web.servlet.support.RequestContextUtils; import org.springframework.web.util.WebUtils; -import lombok.extern.log4j.Log4j2; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import java.util.Locale; @Log4j2 @Component diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ResponseAdvisor.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ResponseAdvisor.java index b0c16bf4b..a7befeb92 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ResponseAdvisor.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ResponseAdvisor.java @@ -18,23 +18,31 @@ package org.apache.hugegraph.handler; -import org.apache.hugegraph.common.Response; +import javax.servlet.http.HttpServletRequest; + import org.springframework.core.MethodParameter; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; +import org.apache.hugegraph.common.Response; +import org.apache.hugegraph.driver.HugeClient; + +import lombok.extern.log4j.Log4j2; + +@Log4j2 @RestControllerAdvice(basePackages = "org.apache.hugegraph.controller") public class ResponseAdvisor implements ResponseBodyAdvice { @Override public boolean supports(MethodParameter returnType, Class> - converterType) { + converterType) { return true; } @@ -42,9 +50,10 @@ public boolean supports(MethodParameter returnType, public Response beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class> - selectedConverterType, + selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { + closeRequestClient(request); if (body instanceof Response) { // The exception response return (Response) body; @@ -52,6 +61,18 @@ public Response beforeBodyWrite(Object body, MethodParameter returnType, return Response.builder() .status(HttpStatus.OK.value()) .data(body) + .message("Success") .build(); } + + public void closeRequestClient(ServerHttpRequest request) { + HttpServletRequest httpRequest = + ((ServletServerHttpRequest) request).getServletRequest(); + if (httpRequest.getAttribute("hugeClient") != null) { + HugeClient client = (HugeClient) httpRequest.getAttribute( + "hugeClient"); + client.close(); + httpRequest.removeAttribute("hugeClient"); + } + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/VertexMappingTypeHandler.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/VertexMappingTypeHandler.java index a0018e884..391d40135 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/VertexMappingTypeHandler.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/VertexMappingTypeHandler.java @@ -25,16 +25,17 @@ import java.util.Set; import org.apache.hugegraph.entity.load.VertexMapping; -import org.apache.hugegraph.loader.util.JsonUtil; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.MappedTypes; +import org.apache.hugegraph.loader.util.JsonUtil; + @MappedTypes(value = {VertexMapping.class}) @MappedJdbcTypes(value = {JdbcType.VARCHAR}) public class VertexMappingTypeHandler - extends BaseTypeHandler> { + extends BaseTypeHandler> { @Override public void setNonNullParameter(PreparedStatement preparedStatement, @@ -47,7 +48,7 @@ public void setNonNullParameter(PreparedStatement preparedStatement, @Override public Set getNullableResult(ResultSet resultSet, String columnName) - throws SQLException { + throws SQLException { String json = resultSet.getString(columnName); return JsonUtil.convertSet(json, VertexMapping.class); } @@ -55,15 +56,15 @@ public Set getNullableResult(ResultSet resultSet, @Override public Set getNullableResult(ResultSet resultSet, int columnIndex) - throws SQLException { + throws SQLException { String json = resultSet.getString(columnIndex); return JsonUtil.convertSet(json, VertexMapping.class); } @Override public Set getNullableResult( - CallableStatement callableStatement, - int columnIndex) throws SQLException { + CallableStatement callableStatement, + int columnIndex) throws SQLException { String json = callableStatement.getString(columnIndex); return JsonUtil.convertSet(json, VertexMapping.class); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/CommonLicenseManager.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/CommonLicenseManager.java new file mode 100644 index 000000000..4d373bd77 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/CommonLicenseManager.java @@ -0,0 +1,119 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.license; + +import de.schlichtherle.license.LicenseManager; +import de.schlichtherle.license.*; +import de.schlichtherle.xml.GenericCertificate; + +import java.beans.XMLDecoder; +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; + +public class CommonLicenseManager extends LicenseManager { + + private static final String CHARSET = "UTF-8"; + private static final int BUF_SIZE = 8 * 1024; + + public CommonLicenseManager(LicenseParam param) { + super(param); + } + + @Override + protected synchronized byte[] create(LicenseContent content, + LicenseNotary notary) + throws Exception { + super.initialize(content); + this.validateCreate(content); + GenericCertificate certificate = notary.sign(content); + return super.getPrivacyGuard().cert2key(certificate); + } + + @Override + protected synchronized LicenseContent install(byte[] key, + LicenseNotary notary) + throws Exception { + GenericCertificate certificate = super.getPrivacyGuard().key2cert(key); + notary.verify(certificate); + String encodedText = certificate.getEncoded(); + LicenseContent content = (LicenseContent) this.load(encodedText); + this.validate(content); + super.setLicenseKey(key); + super.setCertificate(certificate); + return content; + } + + @Override + protected synchronized LicenseContent verify(LicenseNotary notary) + throws Exception { + // Load license key from preferences + byte[] key = super.getLicenseKey(); + if (key == null) { + String subject = super.getLicenseParam().getSubject(); + throw new NoLicenseInstalledException(subject); + } + + GenericCertificate certificate = super.getPrivacyGuard().key2cert(key); + notary.verify(certificate); + String encodedText = certificate.getEncoded(); + LicenseContent content = (LicenseContent) this.load(encodedText); + this.validate(content); + super.setCertificate(certificate); + return content; + } + + @Override + protected synchronized void validate(LicenseContent content) + throws LicenseContentException { + // Call super validate, expected to be overwritten + super.validate(content); + } + + protected synchronized void validateCreate(LicenseContent content) + throws LicenseContentException { + // Just call super validate is ok + super.validate(content); + } + + private Object load(String text) throws Exception { + InputStream bis = null; + XMLDecoder decoder = null; + try { + bis = new ByteArrayInputStream(text.getBytes(CHARSET)); + decoder = new XMLDecoder(new BufferedInputStream(bis, BUF_SIZE)); + return decoder.readObject(); + } catch (UnsupportedEncodingException e) { + throw new LicenseContentException(String.format( + "Unsupported charset: %s", CHARSET)); + } finally { + if (decoder != null) { + decoder.close(); + } + try { + if (bis != null) { + bis.close(); + } + } catch (Exception e) { + + } + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/ExtraParam.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/ExtraParam.java new file mode 100644 index 000000000..4095f6513 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/ExtraParam.java @@ -0,0 +1,132 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.license; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ExtraParam { + + @JsonProperty("username") + private String username; + + @JsonProperty("license_type") + private String licenseType; + + @JsonProperty("id") + private String id; + + @JsonProperty("version") + private String version; + + @JsonProperty("graphs") + private int graphs; + + @JsonProperty("ip") + private String ip; + + @JsonProperty("mac") + private String mac; + + @JsonProperty("cpus") + private int cpus; + + // The unit is MB + @JsonProperty("ram") + private int ram; + + @JsonProperty("threads") + private int threads; + + // The unit is MB + @JsonProperty("memory") + private int memory; + + @JsonProperty("nodes") + private int nodes; + + // The unit is MB + @JsonProperty("data_size") + private long dataSize; + + @JsonProperty("vertices") + private long vertices; + + @JsonProperty("edges") + private long edges; + + public String username() { + return this.username; + } + + public String licenseType() { + return this.licenseType; + } + + public String id() { + return this.id; + } + + public String version() { + return this.version; + } + + public int graphs() { + return this.graphs; + } + + public String ip() { + return this.ip; + } + + public String mac() { + return this.mac; + } + + public int cpus() { + return this.cpus; + } + + public int ram() { + return this.ram; + } + + public int threads() { + return this.threads; + } + + public int memory() { + return this.memory; + } + + public int nodes() { + return this.nodes; + } + + public long dataSize() { + return this.dataSize; + } + + public long vertices() { + return this.vertices; + } + + public long edges() { + return this.edges; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/LicenseVerifyManager.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/LicenseVerifyManager.java new file mode 100644 index 000000000..7f43ab892 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/LicenseVerifyManager.java @@ -0,0 +1,163 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.license; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.apache.hugegraph.exception.ExternalException; +import org.apache.hugegraph.exception.InternalException; +import org.apache.hugegraph.version.HubbleVersion; +import org.slf4j.Logger; + +import org.apache.hugegraph.util.Log; +import org.apache.hugegraph.util.VersionUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import de.schlichtherle.license.LicenseContent; +import de.schlichtherle.license.LicenseContentException; +import de.schlichtherle.license.LicenseParam; + +public class LicenseVerifyManager extends CommonLicenseManager { + + private static final Logger LOG = Log.logger(LicenseVerifyManager.class); + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + private ServerInfo serverInfo; + private ExtraParam param; + + public LicenseVerifyManager(LicenseParam param) { + super(param); + this.param = null; + } + + public void serverInfo(ServerInfo serverInfo) { + this.serverInfo = serverInfo; + } + + public int allowedGraphs() { + if (this.param == null) { + throw new InternalException("license.install.failed"); + } + return this.param.graphs(); + } + + public long allowedDataSize() { + if (this.param == null) { + throw new InternalException("license.install.failed"); + } + return this.param.dataSize(); + } + + @Override + protected synchronized void validate(LicenseContent content) { + // call super validate firstly + try { + super.validate(content); + } catch (LicenseContentException e) { + throw new ExternalException("license.verify.failed", e); + } + + // Verify the customized license parameters. + List extraParams; + try { + TypeReference type = new TypeReference>() {}; + extraParams = (List) + MAPPER.readValue((String) content.getExtra(), type); + } catch (IOException e) { + throw new ExternalException("license.read.failed", e); + } + + String actualServerId = this.serverInfo.serverId(); + LOG.debug("server id is {}", actualServerId); + this.param = this.matchParam(actualServerId, extraParams); + if (this.param == null) { + throw new ExternalException("license.verify.server-id.unmatch", + actualServerId); + } + + this.checkVersion(this.param); + this.checkIpAndMac(this.param); + } + + private ExtraParam matchParam(String id, List extraParams) { + for (ExtraParam param : extraParams) { + if (param.id().equals(id)) { + return param; + } + } + return null; + } + + private void checkVersion(ExtraParam param) { + String expectVersion = param.version(); + if (StringUtils.isEmpty(expectVersion)) { + return; + } + VersionUtil.Version acutalVersion = HubbleVersion.VERSION; + if (acutalVersion.compareTo(VersionUtil.Version.of(expectVersion)) > 0) { + throw new ExternalException("license.verify.version.unmatch", + acutalVersion.get(), expectVersion); + } + } + + private void checkIpAndMac(ExtraParam param) { + String expectIp = param.ip(); + if (StringUtils.isEmpty(expectIp)) { + return; + } + + boolean matched = false; + List actualIps = this.serverInfo.machineInfo().getIpAddress(); + for (String actualIp : actualIps) { + if (actualIp.equalsIgnoreCase(expectIp)) { + matched = true; + break; + } + } + if (!matched) { + throw new ExternalException("license.verify.ip.unauthorized", + actualIps, expectIp); + } + + String expectMac = param.mac(); + if (StringUtils.isEmpty(expectMac)) { + return; + } + String actualMac; + try { + actualMac = this.serverInfo.machineInfo().getMacByInetAddress( + InetAddress.getByName(expectIp)); + } catch (UnknownHostException e) { + throw new InternalException("license.verfiy.mac-unmatch-ip", + e, expectIp); + } + String expectFormatMac = expectMac.replaceAll(":", "-"); + String actualFormatMac = actualMac.replaceAll(":", "-"); + if (!actualFormatMac.equalsIgnoreCase(expectFormatMac)) { + throw new ExternalException("license.verify.mac.unauthorized", + actualMac, expectMac); + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/LicenseVerifyParam.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/LicenseVerifyParam.java new file mode 100644 index 000000000..dd109e45c --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/LicenseVerifyParam.java @@ -0,0 +1,61 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.license; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class LicenseVerifyParam { + + @JsonProperty("subject") + private String subject; + + @JsonProperty("public_alias") + private String publicAlias; + + @JsonAlias("store_ticket") + @JsonProperty("store_password") + private String storePassword; + + @JsonProperty("publickey_path") + private String publicKeyPath; + + @JsonProperty("license_path") + private String licensePath; + + public String subject() { + return this.subject; + } + + public String publicAlias() { + return this.publicAlias; + } + + public String storePassword() { + return this.storePassword; + } + + public String licensePath() { + return this.licensePath; + } + + public String publicKeyPath() { + return this.publicKeyPath; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/MachineInfo.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/MachineInfo.java new file mode 100644 index 000000000..4b03d7951 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/license/MachineInfo.java @@ -0,0 +1,123 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.license; + +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.*; +import java.util.stream.Collectors; + +public class MachineInfo { + + private List ipAddressList; + private List macAddressList; + + public MachineInfo() { + this.ipAddressList = null; + this.macAddressList = null; + } + + public List getIpAddress() { + if (this.ipAddressList != null) { + return this.ipAddressList; + } + this.ipAddressList = new ArrayList<>(); + List inetAddresses = this.getLocalAllInetAddress(); + if (inetAddresses != null && !inetAddresses.isEmpty()) { + this.ipAddressList = inetAddresses.stream() + .map(InetAddress::getHostAddress) + .distinct() + .map(String::toLowerCase) + .collect(Collectors.toList()); + } + return this.ipAddressList; + } + + public List getMacAddress() { + if (this.macAddressList != null) { + return this.macAddressList; + } + this.macAddressList = new ArrayList<>(); + List inetAddresses = this.getLocalAllInetAddress(); + if (inetAddresses != null && !inetAddresses.isEmpty()) { + // Get the Mac address of all network interfaces + List list = new ArrayList<>(); + Set uniqueValues = new HashSet<>(); + for (InetAddress inetAddress : inetAddresses) { + String macByInetAddress = this.getMacByInetAddress(inetAddress); + if (uniqueValues.add(macByInetAddress)) { + list.add(macByInetAddress); + } + } + this.macAddressList = list; + } + return this.macAddressList; + } + + public List getLocalAllInetAddress() { + Enumeration interfaces; + try { + interfaces = NetworkInterface.getNetworkInterfaces(); + } catch (SocketException e) { + throw new RuntimeException("Failed to get network interfaces"); + } + + List result = new ArrayList<>(); + while (interfaces.hasMoreElements()) { + NetworkInterface nw = interfaces.nextElement(); + for (Enumeration inetAddresses = nw.getInetAddresses(); + inetAddresses.hasMoreElements(); ) { + InetAddress inetAddr = inetAddresses.nextElement(); + if (!inetAddr.isLoopbackAddress() && + !inetAddr.isLinkLocalAddress() && + !inetAddr.isMulticastAddress()) { + result.add(inetAddr); + } + } + } + return result; + } + + public String getMacByInetAddress(InetAddress inetAddr) { + byte[] mac; + try { + mac = NetworkInterface.getByInetAddress(inetAddr) + .getHardwareAddress(); + } catch (Exception e) { + throw new RuntimeException(String.format( + "Failed to get mac address for inet address '%s'", + inetAddr)); + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < mac.length; i++) { + if (i != 0) { + sb.append("-"); + } + String temp = Integer.toHexString(mac[i] & 0xff); + if (temp.length() == 1) { + sb.append("0").append(temp); + } else { + sb.append(temp); + } + } + return sb.toString().toUpperCase(); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/GraphConnectionMapper.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/GraphConnectionMapper.java deleted file mode 100644 index d65cc3f6d..000000000 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/GraphConnectionMapper.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -package org.apache.hugegraph.mapper; - -import org.apache.hugegraph.entity.GraphConnection; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; -import org.springframework.stereotype.Component; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; - -@Mapper -@Component -public interface GraphConnectionMapper extends BaseMapper { - - /** - * NOTE: Page must be the first param, otherwise throw exception - */ - @Select("SELECT *, " + - "(CASE WHEN `name` LIKE concat('%', #{content}, '%') AND " + - " `graph` LIKE concat('%', #{content}, '%') THEN 0 " + - " WHEN `name` LIKE concat('%', #{content}, '%') THEN 1 " + - " WHEN `graph` LIKE concat('%', #{content}, '%') THEN 2 " + - "END) as relation_sort " + - "FROM `graph_connection` " + - "WHERE `name` LIKE concat('%', #{content}, '%') OR " + - "`graph` LIKE concat('%', #{content}, '%') " + - "ORDER BY relation_sort ASC, `create_time` DESC") - IPage selectByContentInPage(IPage page, - @Param("content") - String content); -} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/UserInfoMapper.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/UserInfoMapper.java index 9c1f9134a..a663df957 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/UserInfoMapper.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/UserInfoMapper.java @@ -18,14 +18,12 @@ package org.apache.hugegraph.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.hugegraph.entity.UserInfo; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - @Mapper @Component public interface UserInfoMapper extends BaseMapper { - } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/algorithm/AsyncTaskMapper.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/algorithm/AsyncTaskMapper.java index 9f641e746..5954a243c 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/algorithm/AsyncTaskMapper.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/algorithm/AsyncTaskMapper.java @@ -18,14 +18,12 @@ package org.apache.hugegraph.mapper.algorithm; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.hugegraph.entity.task.AsyncTask; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - @Mapper @Component public interface AsyncTaskMapper extends BaseMapper { - } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/DatasourceMapper.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/DatasourceMapper.java new file mode 100644 index 000000000..606fbce5d --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/DatasourceMapper.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.mapper.load; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.hugegraph.entity.load.Datasource; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatasourceMapper extends BaseMapper { +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/FileMappingMapper.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/FileMappingMapper.java index 356122cd9..bfb4cfd87 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/FileMappingMapper.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/FileMappingMapper.java @@ -18,14 +18,13 @@ package org.apache.hugegraph.mapper.load; -import org.apache.hugegraph.entity.load.FileMapping; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; +import org.apache.hugegraph.entity.load.FileMapping; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @Mapper @Component public interface FileMappingMapper extends BaseMapper { - } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/JobManagerMapper.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/JobManagerMapper.java index 310b16b68..fd2f24834 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/JobManagerMapper.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/JobManagerMapper.java @@ -18,13 +18,13 @@ package org.apache.hugegraph.mapper.load; -import org.apache.hugegraph.entity.load.JobManager; -import org.apache.hugegraph.entity.load.JobManagerItem; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Component; +import org.apache.hugegraph.entity.load.JobManager; +import org.apache.hugegraph.entity.load.JobManagerItem; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @Mapper @@ -35,5 +35,5 @@ public interface JobManagerMapper extends BaseMapper { "ISNULL(SUM(l.duration),0) as duration " + "FROM `load_task` as l LEFT JOIN `file_mapping` as f " + "ON l.file_id=f.id WHERE l.job_id = #{job_id}") - JobManagerItem computeSizeDuration(@Param("job_id") int jobId); + JobManagerItem computeSizeDuration(@Param("job_id") int job_id); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/LoadTaskMapper.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/LoadTaskMapper.java index e007d0e16..ef5ca5704 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/LoadTaskMapper.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/load/LoadTaskMapper.java @@ -18,14 +18,12 @@ package org.apache.hugegraph.mapper.load; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.hugegraph.entity.load.LoadTask; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - @Mapper @Component public interface LoadTaskMapper extends BaseMapper { - } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/ApplicationInfoMapper.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/ApplicationInfoMapper.java new file mode 100644 index 000000000..bf2c622f9 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/ApplicationInfoMapper.java @@ -0,0 +1,68 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.mapper.query; + +import java.util.List; + +import org.apache.hugegraph.entity.query.ApplicationInfo; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface ApplicationInfoMapper extends BaseMapper { + + @Select("SELECT COUNT(*) FROM `app_info` WHERE graph_name = #{graphName} AND " + + "app_name = #{appName} AND app_type = #{appType}") + int countByAppNameAndAppType(@Param("graphName") String graphName, + @Param("appName") String appName, + @Param("appType") String appType); + + @Insert("INSERT INTO app_info (graph_name, app_name, app_type, count_query, distribution_query) " + + "VALUES (#{graphName}, #{appName}, #{appType}, #{countQuery}, #{distributionQuery})") + int insertAppInfo(ApplicationInfo appInfo); + + @Update("UPDATE `app_info` SET graph_name = #{graphName}, " + + "count_query = #{countQuery}, distribution_query = #{distributionQuery} " + + "WHERE graph_name = #{graphName} AND app_name = #{appName} AND app_type = #{appType}") + int updateAppInfo(ApplicationInfo appInfo); + + @Select("SELECT * FROM `app_info` WHERE graph_name = #{graphName}") + List queryByGraph(@Param("graphName") String graphName); + + @Select("SELECT * FROM `app_info` WHERE graph_name = #{graphName} AND " + + "app_name = #{appName} AND app_type = #{appType}") + List query(@Param("graphName") String graphName, + @Param("appName") String appName, + @Param("appType") String appType); + + // 方法用于插入或更新数据 + default int insertOrUpdateAppInfo(ApplicationInfo appInfo) { + int count = countByAppNameAndAppType(appInfo.getGraphName(), + appInfo.getAppName(), + appInfo.getAppType().string()); + if (count > 0) { + return updateAppInfo(appInfo); + } else { + return insertAppInfo(appInfo); + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/EditElementHistoryMapper.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/EditElementHistoryMapper.java new file mode 100644 index 000000000..d22831564 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/EditElementHistoryMapper.java @@ -0,0 +1,73 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.mapper.query; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.hugegraph.entity.query.ElementEditHistory; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Mapper +@Component +public interface EditElementHistoryMapper extends + BaseMapper { + @Select("SELECT * FROM `edit_history` LIMIT #{limit}") + List queryByLimit(@Param("limit") int limit); + + + @Select("SELECT * FROM `edit_history` WHERE graphspace = #{graphspace} " + + "AND graph = #{graph} AND element_id = #{elementId}") + List queryByElementId( + @Param("graphspace") String graphspace, + @Param("graph") String graph, + @Param("elementId") String elementId); + + + @Select("") + List queryByElementIds( + @Param("graphspace") String graphspace, + @Param("graph") String graph, + @Param("elementIds") List elementIds); + + // 批量插入方法 + @Insert({ + "" + }) + int insertBatch(@Param("list") List list); +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/ExecuteHistoryMapper.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/ExecuteHistoryMapper.java index 71f6520d9..aeb5e4bdf 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/ExecuteHistoryMapper.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/ExecuteHistoryMapper.java @@ -18,20 +18,30 @@ package org.apache.hugegraph.mapper.query; -import org.apache.hugegraph.entity.query.ExecuteHistory; -import org.apache.ibatis.annotations.Delete; +import java.util.List; + import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Component; +import org.apache.hugegraph.entity.query.ExecuteHistory; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @Mapper @Component public interface ExecuteHistoryMapper extends BaseMapper { - @Delete("DELETE FROM `execute_history` WHERE `id` IN (" + - "SELECT `id` FROM `execute_history` ORDER BY `create_time` DESC " + - "LIMIT #{limit} OFFSET #{limit})") - void deleteExceedLimit(@Param("limit") int limit); + + // 删除超出限制的记录 + default void deleteExceedLimit(int limit) { + List ids = findIdsToDelete(limit, limit); + if (!ids.isEmpty()) { + deleteBatchIds(ids); + } + } + + // 查询满足条件的 id 列表 + @Select("SELECT id FROM `execute_history` ORDER BY `create_time` DESC LIMIT #{limit} OFFSET #{offset}") + List findIdsToDelete(@Param("limit") int limit, @Param("offset") int offset); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/GremlinCollectionMapper.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/GremlinCollectionMapper.java index 06f38e2d9..0a92eb199 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/GremlinCollectionMapper.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/mapper/query/GremlinCollectionMapper.java @@ -18,12 +18,12 @@ package org.apache.hugegraph.mapper.query; -import org.apache.hugegraph.entity.query.GremlinCollection; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Component; +import org.apache.hugegraph.entity.query.GremlinCollection; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -38,12 +38,14 @@ public interface GremlinCollectionMapper extends BaseMapper { " WHEN `content` LIKE concat('%', #{content}, '%') THEN 2 " + "END) as relation_sort " + "FROM `gremlin_collection` " + - "WHERE `conn_id` = #{conn_id} AND " + + "WHERE `graphspace` = #{graphspace} AND " + + "`graph` = #{graph} AND `type` = #{type} AND" + "(`name` LIKE concat('%', #{content}, '%') OR " + "`content` LIKE concat('%', #{content}, '%')) " + "ORDER BY relation_sort ASC, `create_time` DESC") IPage selectByContentInPage(IPage page, - @Param("conn_id") int connId, - @Param("content") - String content); + @Param("graphspace") String graphSpace, + @Param("graph") String graph, + @Param("content") String content, + @Param("type") String type); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/options/HubbleOptions.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/options/HubbleOptions.java index b88ec2d3c..eb670b9c5 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/options/HubbleOptions.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/options/HubbleOptions.java @@ -23,12 +23,13 @@ import static org.apache.hugegraph.config.OptionChecker.positiveInt; import static org.apache.hugegraph.config.OptionChecker.rangeInt; +import org.springframework.util.CollectionUtils; + import org.apache.hugegraph.config.ConfigListOption; import org.apache.hugegraph.config.ConfigOption; import org.apache.hugegraph.config.OptionHolder; import org.apache.hugegraph.util.Bytes; import org.apache.hugegraph.util.HubbleUtil; -import org.springframework.util.CollectionUtils; public class HubbleOptions extends OptionHolder { @@ -56,7 +57,7 @@ public static synchronized HubbleOptions instance() { public static final ConfigOption SERVER_HOST = new ConfigOption<>( - "hubble.host", + "server.host", "The host of hugegraph-hubble server.", disallowEmpty(), "localhost" @@ -64,7 +65,7 @@ public static synchronized HubbleOptions instance() { public static final ConfigOption SERVER_PORT = new ConfigOption<>( - "hubble.port", + "server.port", "The port of hugegraph-hubble server.", rangeInt(1, 65535), 8088 @@ -102,7 +103,10 @@ public static synchronized HubbleOptions instance() { if (CollectionUtils.isEmpty(input)) { return false; } - return !input.contains(-1) || input.size() <= 1; + if (input.contains(-1) && input.size() > 1) { + return false; + } + return true; }, -1 ); @@ -168,7 +172,7 @@ public static synchronized HubbleOptions instance() { "upload_file.format_list", "The format white list available for uploading file.", null, - "csv" + "csv", "txt" ); public static final ConfigOption UPLOAD_SINGLE_FILE_SIZE_LIMIT = @@ -223,4 +227,183 @@ public static synchronized HubbleOptions instance() { null, "hugegraph" ); + + public static final ConfigOption PD_ENABLED = + new ConfigOption<>( + "pd.enabled", + "Whether to enable PD mode. Set to false for standalone " + + "RocksDB mode where PD is not available.", + null, + true + ); + + public static final ConfigOption SERVER_URL = + new ConfigOption<>( + "server.direct_url", + "The direct URL of HugeGraph Server, used only when " + + "pd.enabled=false. Example: http://127.0.0.1:8080", + null, + "http://127.0.0.1:8080" + ); + + public static final ConfigOption PD_CLUSTER = + new ConfigOption<>( + "cluster", + "The cluster which hubble connect to", + null, + "hg" + ); + + public static final ConfigOption PD_PEERS = + new ConfigOption<>( + "pd.peers", + "The pd addresses", + null, + "127.0.0.1:8686" + ); + + public static final ConfigOption PD_SERVER = + new ConfigOption<>( + "pd.server", + "The pd-server addresses", + null, + "127.0.0.1:8620" + ); + + public static final ConfigOption AFS_DIR = + new ConfigOption<>( + "afs.dir", + "the directory in afs stored for the olap algorithm's result", + null, + "/user/hugegraph/graph_sketch/" + ); + //// TODO REMOVED + //public static final ConfigOption AFS_URI = + // new ConfigOption<>( + // "afs.uri", + // "the uri of afs stored for the olap algorithm's result", + // null, + // "afs://cnn-bd-main.afs.baidu.com:9902" + // ); + // + //public static final ConfigOption AFS_USER = + // new ConfigOption<>( + // "afs.user", + // "the user name for accessing afs stored", + // null, + // "user" + // ); + // + //public static final ConfigOption AFS_PASSWORD = + // new ConfigOption<>( + // "afs.password", + // "the user password for accessing afs stored", + // null, + // "password" + // ); + + public static final ConfigOption DASHBOARD_ADDRESS = + new ConfigOption<>( + "dashboard.address", + "The dashboard addresses", + null, + "127.0.0.1:8092" + ); + + public static final ConfigOption ROUTE_TYPE = + new ConfigOption<>( + "route.type", + "use service url", + allowValues("BOTH", "NODE_PORT", "DDS"), + "NODE_PORT" + ); + + public static final ConfigOption PROMETHEUS_URL = + new ConfigOption<>( + "prometheus.url", + "prometheus url, for saas metrics", + null, + "http://127.0.0.1:8090" + ); + + public static final ConfigOption IDC = + new ConfigOption<>( + "idc", + "hubble deployment location (eg:bddwd or gzbh)", + disallowEmpty(), + "bddwd" + ); + + public static final ConfigOption MONITOR_URL = + new ConfigOption<>( + "monitor.url", + "monitor URL", + null, + "" + ); + + public static final ConfigOption ES_URL = + new ConfigOption<>( + "es.urls", + "The addresses of Elasticsearch Cluster", + null, + "" + ); + + public static final ConfigOption ES_USER = + new ConfigOption<>( + "es.user", + "The user of Elasticsearch Cluster", + null, + "" + ); + + public static final ConfigOption ES_PASSWORD = + new ConfigOption<>( + "es.password", + "The password of Elasticsearch Cluster", + null, + "" + ); + + // ES查询: max_result_window + public static final ConfigOption MAX_RESULT_WINDOW= + new ConfigOption<>( + "es.max_result_window", + "es config info: max_result_window", + positiveInt(), + 10000 + ); + + public static final ConfigOption LOG_AUDIT_PATTERN = + new ConfigOption<>( + "log.audit.pattern", + "the index name of audit log", + null, + "hugegraphaudit" + ); + + public static final ConfigOption LOG_EXPORT_COUNT = + new ConfigOption<>( + "log.export.count", + "max export item count of audit/log", + positiveInt(), + 10000 + ); + + public static final ConfigOption PROXY_SERVLET_URL = + new ConfigOption<>( + "proxy.servlet_url", + "the servlet url to access", + null, + "" + ); + + public static final ConfigOption PROXY_TARGET_URL = + new ConfigOption<>( + "proxy.target_url", + "the target url to access", + null, + "" + ); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/HugeClientPoolService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/HugeClientPoolService.java index 7b210efc3..62cac14aa 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/HugeClientPoolService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/HugeClientPoolService.java @@ -18,69 +18,214 @@ package org.apache.hugegraph.service; -import java.util.concurrent.ConcurrentHashMap; +import static org.apache.hugegraph.driver.factory.PDHugeClientFactory.DEFAULT_GRAPHSPACE; +import static org.apache.hugegraph.driver.factory.PDHugeClientFactory.DEFAULT_SERVICE; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; import javax.annotation.PreDestroy; -import org.apache.hugegraph.config.HugeConfig; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.driver.factory.PDHugeClientFactory; import org.apache.hugegraph.entity.GraphConnection; -import org.apache.hugegraph.exception.ExternalException; -import org.apache.hugegraph.options.HubbleOptions; -import org.apache.hugegraph.util.HugeClientUtil; +import org.apache.hugegraph.exception.ParameterizedException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import lombok.extern.log4j.Log4j2; +import org.apache.hugegraph.config.HugeConfig; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; + +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.util.HugeClientUtil; +import org.apache.hugegraph.util.UrlUtil; +import com.google.common.collect.ImmutableList; @Log4j2 @Service -public final class HugeClientPoolService - extends ConcurrentHashMap { +public final class HugeClientPoolService { @Autowired private HugeConfig config; @Autowired - private GraphConnectionService connService; - @Autowired private SettingSSLService sslService; + @Autowired + private String cluster; + @Autowired(required = false) + private PDHugeClientFactory pdHugeClientFactory; + + private final Map clients = new ConcurrentHashMap<>(); + + /** + * cache key format: {graphSpace}_{graph} + */ + private static final String CACHE_KEY_FORMAT = "%s_%s"; + private Cache> urlCache = CacheBuilder.newBuilder() + .expireAfterWrite(1, TimeUnit.HOURS) + .build(); @PreDestroy public void destroy() { log.info("Destroy HugeClient pool"); - for (HugeClient client : this.values()) { + for (HugeClient client : this.clients.values()) { client.close(); } } - public void put(GraphConnection connection, HugeClient client) { - super.put(connection.getId(), client); + public HugeClient createUnauthClient() { + // Get all graphspace under cluster + return getOrCreate(null, null, null, null); + } + + public HugeClient createTempTokenClient(String token) { + return getOrCreate(null, null, null, token); + } + + public HugeClient createAuthClient(String graphSpace, + String graph, String token) { + return getOrCreate(null, graphSpace, graph, token); + } + + public HugeClient getOrCreate(String url, String graphSpace, String graph, + String token) { + // 去掉缓存,固定每个 request 分配一个 client + return create(url, graphSpace, graph, token); } - public synchronized HugeClient getOrCreate(Integer id) { - HugeClient client = super.get(id); - if (client != null) { - return client; + public HugeClient create(String url, String graphSpace, String graph, + String token) { + if (StringUtils.isEmpty(url)) { + List urls = this.allAvailableURLs(graphSpace, graph); + + if (CollectionUtils.isEmpty(urls)) { + throw new ParameterizedException("service.no-available"); + } + + for (String tmpurl : urls) { + if (StringUtils.isEmpty(tmpurl)) { + continue; + } + HugeClient tmpclient = this.create(tmpurl, graphSpace, graph, token); + + if (checkHealth(tmpclient)) { + return tmpclient; + } else { + tmpclient.close(); + } + } } - GraphConnection connection = this.connService.get(id); - if (connection == null) { - throw new ExternalException("graph-connection.get.failed", id); + + GraphConnection connection = new GraphConnection(); + try { + UrlUtil.Host host = UrlUtil.parseHost(url); + connection.setProtocol(host.getScheme()); + connection.setHost(host.getHost()); + connection.setPort(host.getPort()); + } catch (IllegalArgumentException e) { + throw new ParameterizedException("service.url.parse.error", e, url); } + + connection.setToken(token); + connection.setGraphSpace(graphSpace); + connection.setGraph(graph); if (connection.getTimeout() == null) { int timeout = this.config.get(HubbleOptions.CLIENT_REQUEST_TIMEOUT); connection.setTimeout(timeout); } this.sslService.configSSL(this.config, connection); - client = HugeClientUtil.tryConnect(connection); - this.put(id, client); + HugeClient client = HugeClientUtil.tryConnect(connection); + return client; } - public void remove(GraphConnection connection) { - HugeClient client = super.remove(connection.getId()); - if (client == null) { - return; + /** + * 获取所有可用的URL列表 + * + * @param graphSpace 图形空间名称 + * @param service 服务名称 + * @return URL列表 + */ + private List allAvailableURLs(String graphSpace, String service) { + // Non-PD mode: directly return the configured server URL + boolean pdEnabled = config.get(HubbleOptions.PD_ENABLED); + if (!pdEnabled) { + String directUrl = config.get(HubbleOptions.SERVER_URL); + log.info("PD mode disabled, using direct server URL: {}", directUrl); + return ImmutableList.of(directUrl); + } + + List realtimeurls = new ArrayList<>(); + if (StringUtils.isNotEmpty(graphSpace)) { + if (StringUtils.isNotEmpty(service)) { + // Get realtineurls From service + List urls = pdHugeClientFactory.getURLs(cluster, graphSpace, + service); + if (!CollectionUtils.isEmpty(urls)) { + // 打乱顺序 + Collections.shuffle(urls); + realtimeurls.addAll(urls); + } + } + + List urls = pdHugeClientFactory.getURLs(cluster, graphSpace, null); + if (!CollectionUtils.isEmpty(urls)) { + // 打乱顺序 + Collections.shuffle(urls); + realtimeurls.addAll(urls); + } + } + + List urls = pdHugeClientFactory.getURLs(cluster, DEFAULT_GRAPHSPACE, + DEFAULT_SERVICE); + String defaultCacheKey = String.format(CACHE_KEY_FORMAT, DEFAULT_GRAPHSPACE, + DEFAULT_SERVICE); + ; + if (!CollectionUtils.isEmpty(urls)) { + Collections.shuffle(urls); + // 设置默认URL缓存 + urlCache.put(defaultCacheKey, urls); + realtimeurls.addAll(urls); + } + + String cacheKey = String.format(CACHE_KEY_FORMAT, graphSpace, service); + if (!CollectionUtils.isEmpty(realtimeurls)) { + urlCache.put(cacheKey, realtimeurls); + return realtimeurls; + } else { + + List cacheKeys = new ArrayList(); + cacheKeys.add(String.format(CACHE_KEY_FORMAT, graphSpace, service)); + cacheKeys.add(String.format(CACHE_KEY_FORMAT, graphSpace, null)); + cacheKeys.add(defaultCacheKey); + for (String ck : cacheKeys) { + List r = urlCache.getIfPresent(ck); + if (!CollectionUtils.isEmpty(r)) { + return r; + } + } + + log.warn("Get empty list of availabel url from cache: {}/{}", + graphSpace, service); + + return ImmutableList.of(); + } + } + + private boolean checkHealth(HugeClient client) { + try { + client.versionManager().getApiVersion(); + } catch (Exception e) { + log.debug("Check client health throw exception", e); + return false; } - client.close(); + + return true; } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/SettingSSLService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/SettingSSLService.java index 3ab2b549c..d3bb6ce46 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/SettingSSLService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/SettingSSLService.java @@ -18,25 +18,24 @@ package org.apache.hugegraph.service; +import lombok.extern.log4j.Log4j2; import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.entity.GraphConnection; import org.apache.hugegraph.options.HubbleOptions; import org.springframework.stereotype.Service; -import lombok.extern.log4j.Log4j2; - @Log4j2 @Service public class SettingSSLService { public void configSSL(HugeConfig config, GraphConnection connection) { String protocol = config.get(HubbleOptions.SERVER_PROTOCOL); - if ("https".equals(protocol)) { + if (protocol != null && protocol.equals("https")) { connection.setProtocol(protocol); String trustStoreFile = config.get( - HubbleOptions.CLIENT_TRUSTSTORE_FILE); + HubbleOptions.CLIENT_TRUSTSTORE_FILE); String trustStorePass = config.get( - HubbleOptions.CLIENT_TRUSTSTORE_PASSWORD); + HubbleOptions.CLIENT_TRUSTSTORE_PASSWORD); connection.setTrustStoreFile(trustStoreFile); connection.setTrustStorePassword(trustStorePass); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/AsyncTaskService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/AsyncTaskService.java index a509b3e2a..2255ca727 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/AsyncTaskService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/AsyncTaskService.java @@ -18,49 +18,67 @@ package org.apache.hugegraph.service.algorithm; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.extern.log4j.Log4j2; import org.apache.hugegraph.driver.HugeClient; -import org.apache.hugegraph.service.HugeClientPoolService; import org.apache.hugegraph.structure.Task; import org.apache.hugegraph.util.PageUtil; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.baomidou.mybatisplus.core.metadata.IPage; - -import lombok.extern.log4j.Log4j2; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; @Log4j2 @Service public class AsyncTaskService { - @Autowired - private HugeClientPoolService poolService; + private static final String VERMEER_TASK_TYPE = "vermeer-task"; + private static final String VERMEER_TASK_LOAD = "vermeer-task:load"; + private static final String VERMEER_TASK_COMPUTE = "vermeer-task:compute"; - private HugeClient getClient(int connId) { - return this.poolService.getOrCreate(connId); + public Task get(HugeClient client, int id) { + Task task = client.task().get(id); + if (isVermeerType(task.type())) { + task.type(switchVermeerType(task.name())); + } + return task; } - public Task get(int connId, int id) { - HugeClient client = this.getClient(connId); - return client.task().get(id); + private boolean isVermeerType(String type) { + return VERMEER_TASK_TYPE.equals(type); + } + + private String switchVermeerType(String name) { + if (VERMEER_TASK_LOAD.equals(name)) { + return name; + } + return VERMEER_TASK_COMPUTE; } - public List list(int connId, List taskIds) { - HugeClient client = this.getClient(connId); - return client.task().list(taskIds); + public List list(HugeClient client, List taskIds) { + List tasks = client.task().list(taskIds); + for (Task task: tasks) { + if (isVermeerType(task.type())) { + task.type(switchVermeerType(task.name())); + } + } + return tasks; } - public IPage list(int connId, int pageNo, int pageSize, String content, + public IPage list(HugeClient client, int pageNo, int pageSize, + String content, String type, String status) { - HugeClient client = this.getClient(connId); if (status.isEmpty()) { status = null; } List tasks = client.task().list(status); + for (Task task: tasks) { + if (isVermeerType(task.type())) { + task.type(switchVermeerType(task.name())); + } + } + List result = new ArrayList<>(); for (Task task : tasks) { if (!type.isEmpty() && !type.equals(task.type())) { @@ -78,13 +96,11 @@ public IPage list(int connId, int pageNo, int pageSize, String content, return PageUtil.page(result, pageNo, pageSize); } - public void remove(int connId, int id) { - HugeClient client = this.getClient(connId); + public void remove(HugeClient client, int id) { client.task().delete(id); } - public Task cancel(int connId, int id) { - HugeClient client = this.getClient(connId); + public Task cancel(HugeClient client, int id) { return client.task().cancel(id); } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/OlapAlgoService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/OlapAlgoService.java new file mode 100644 index 000000000..983b1b37b --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/OlapAlgoService.java @@ -0,0 +1,65 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.algorithm; + +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.algorithm.OlapEntity; +import org.apache.hugegraph.entity.query.OlapView; +import org.apache.hugegraph.service.query.ExecuteHistoryService; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Log4j2 +@Service +public class OlapAlgoService { + @Autowired + private HugeConfig config; + @Autowired + private ExecuteHistoryService historyService; + + public OlapView olapView(HugeClient client, String graphspace, OlapEntity body) { + Map params = body.getParams(); + if (!"DEFAULT".equals(graphspace)) { + params.put("k8s.master_cpu", "1"); + params.put("k8s.worker_cpu", "1"); + params.put("k8s.master_request_memory", "5Gi"); + params.put("k8s.worker_request_memory", "5Gi"); + params.put("k8s.master_memory", "5Gi"); + params.put("k8s.worker_memory", "5Gi"); + params.putAll(body.getParams()); + } + long taskid = client.computer().create(body.getAlgorithm(), body.getWorker(), params); +// String graphSpace = client.getGraphSpaceName(); +// String graph = client.getGraphName(); +// Date createTime = HubbleUtil.nowDate(); +// // Insert execute history +// ExecuteStatus status = ExecuteStatus.SUCCESS; +// ExecuteHistory history; +// history = new ExecuteHistory(null, graphSpace, graph, 0L, +// ExecuteType.ALGORITHM, +// body.toString(), status, +// AsyncTaskStatus.UNKNOWN, -1L, createTime); +// this.historyService.save(history); + return OlapView.builder().taskId(taskid).build(); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/OltpAlgoService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/OltpAlgoService.java index a98753525..67b8bd6e7 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/OltpAlgoService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/algorithm/OltpAlgoService.java @@ -17,110 +17,1328 @@ */ package org.apache.hugegraph.service.algorithm; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +// TODO import difference +import org.apache.hugegraph.api.traverser.NeighborRankAPI; +import org.apache.hugegraph.api.traverser.PersonalRankAPI; +//import org.apache.hugegraph.client.api.traverser.PersonalRankAPI; +//import org.apache.hugegraph.client.api.traverser.NeighborRankAPI; +import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.driver.TraverserManager; -import org.apache.hugegraph.entity.algorithm.ShortestPath; +import org.apache.hugegraph.entity.algorithm.AdamicadarEntity; +import org.apache.hugegraph.entity.algorithm.AllShortestPathsEntity; +import org.apache.hugegraph.entity.algorithm.CrossPointsEntity; +import org.apache.hugegraph.entity.algorithm.JaccardSimilarityEntity; +import org.apache.hugegraph.entity.algorithm.KneighborEntity; +import org.apache.hugegraph.entity.algorithm.KoutEntity; +import org.apache.hugegraph.entity.algorithm.PathsEntity; +import org.apache.hugegraph.entity.algorithm.RaysEntity; +import org.apache.hugegraph.entity.algorithm.ResourceallocationEntity; +import org.apache.hugegraph.entity.algorithm.SingleSourceShortestPathEntity; +import org.apache.hugegraph.entity.algorithm.WeightedShortestPathEntity; +import org.apache.hugegraph.entity.query.EgonetView; +import org.apache.hugegraph.entity.query.FusiformsimilarityView; +import org.apache.hugegraph.entity.query.JaccardsimilarityView; +import org.apache.hugegraph.entity.query.RanksView; +import org.apache.hugegraph.structure.traverser.CrosspointsRequest; +import org.apache.hugegraph.structure.traverser.CustomizedCrosspoints; +import org.apache.hugegraph.structure.traverser.CustomizedPathsRequest; +import org.apache.hugegraph.structure.traverser.Egonet; +import org.apache.hugegraph.structure.traverser.EgonetRequest; +import org.apache.hugegraph.structure.traverser.FusiformSimilarity; +import org.apache.hugegraph.structure.traverser.FusiformSimilarityRequest; +import org.apache.hugegraph.structure.traverser.JaccardSimilarity; +import org.apache.hugegraph.structure.traverser.Kneighbor; +import org.apache.hugegraph.structure.traverser.KneighborRequest; +import org.apache.hugegraph.structure.traverser.Kout; +import org.apache.hugegraph.entity.algorithm.RingsEntity; +import org.apache.hugegraph.entity.algorithm.SameNeighborsEntity; +import org.apache.hugegraph.entity.algorithm.ShortestPathEntity; import org.apache.hugegraph.entity.enums.AsyncTaskStatus; import org.apache.hugegraph.entity.enums.ExecuteStatus; import org.apache.hugegraph.entity.enums.ExecuteType; import org.apache.hugegraph.entity.query.ExecuteHistory; import org.apache.hugegraph.entity.query.GraphView; import org.apache.hugegraph.entity.query.GremlinResult; -import org.apache.hugegraph.entity.query.JsonView; -import org.apache.hugegraph.entity.query.TableView; -import org.apache.hugegraph.service.HugeClientPoolService; +import org.apache.hugegraph.options.HubbleOptions; import org.apache.hugegraph.service.query.ExecuteHistoryService; import org.apache.hugegraph.structure.graph.Edge; import org.apache.hugegraph.structure.graph.Path; import org.apache.hugegraph.structure.graph.Vertex; +import org.apache.hugegraph.structure.gremlin.Result; +import org.apache.hugegraph.structure.gremlin.ResultSet; +import org.apache.hugegraph.structure.traverser.KoutRequest; +import org.apache.hugegraph.structure.traverser.MultiNodeShortestPathRequest; +import org.apache.hugegraph.structure.traverser.PathOfVertices; +import org.apache.hugegraph.structure.traverser.PathWithMeasure; +import org.apache.hugegraph.structure.traverser.PathsRequest; +import org.apache.hugegraph.structure.traverser.PathsWithVertices; +import org.apache.hugegraph.structure.traverser.Prediction; +import org.apache.hugegraph.structure.traverser.RanksWithMeasure; +import org.apache.hugegraph.structure.traverser.SameNeighbors; +import org.apache.hugegraph.structure.traverser.SameNeighborsBatch; +import org.apache.hugegraph.structure.traverser.SameNeighborsBatchRequest; +import org.apache.hugegraph.structure.traverser.SingleSourceJaccardSimilarityRequest; +import org.apache.hugegraph.structure.traverser.Steps; +import org.apache.hugegraph.structure.traverser.TemplatePathsRequest; +import org.apache.hugegraph.structure.traverser.WeightedPath; +import org.apache.hugegraph.structure.traverser.WeightedPaths; +import org.apache.hugegraph.util.GremlinUtil; import org.apache.hugegraph.util.HubbleUtil; +import com.google.common.collect.Iterables; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.StopWatch; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.google.common.collect.ImmutableMap; - -import lombok.extern.log4j.Log4j2; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; @Log4j2 @Service public class OltpAlgoService { - @Autowired - private HugeClientPoolService poolService; + private HugeConfig config; @Autowired private ExecuteHistoryService historyService; - private HugeClient getClient(int connId) { - return this.poolService.getOrCreate(connId); + public GremlinResult shortestPath(HugeClient client, ShortestPathEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + PathOfVertices result = traverser.shortestPath(body.getSource(), body.getTarget(), + body.getDirection(), body.getLabel(), + body.getMaxDepth(), body.getMaxDegree(), + body.getSkipDegree(), body.getCapacity()); + GraphView graphView = this.buildPathGraphView(client, result.getPath()); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(graphView) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult allShortestPaths(HugeClient client, AllShortestPathsEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + PathWithMeasure result = traverser.allShortestPaths(body.getSource(), body.getTarget(), + body.getDirection(), body.getLabel(), + body.getMaxDepth(), body.getMaxDegree(), + body.getSkipDegree(), body.getCapacity()); + GraphView graphView = this.buildPathGraphView(client, result.getPaths()); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(graphView) + .pathnum(result.getPaths().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } } - public GremlinResult shortestPath(int connId, ShortestPath body) { - HugeClient client = this.getClient(connId); - TraverserManager traverser = client.traverser(); - Path result = traverser.shortestPath(body.getSource(), body.getTarget(), - body.getDirection(), body.getLabel(), - body.getMaxDepth(), body.getMaxDegree(), - body.getSkipDegree(), body.getCapacity()).getPath(); - JsonView jsonView = new JsonView(); - jsonView.setData(result.objects()); + public GremlinResult weightedShortestPath(HugeClient client, WeightedShortestPathEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + Map edges; + Map vertices = new HashMap<>(); + TraverserManager traverser = client.traverser(); + // TODO withEdge set as false, check correctness + WeightedPath result = traverser.weightedShortestPath(body.getSource(), body.getTarget(), + body.getDirection(), body.getLabel(), + body.getWeight(), body.getMaxDegree(), + body.getSkipDegree(), body.getCapacity(), true,false); + + for (Iterator iter = result.vertices().iterator(); iter.hasNext();) { + Vertex vertex = iter.next(); + vertices.put(vertex.id(), vertex); + } + edges = this.edgesOfVertex(vertices, client); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(vertices.values(), edges.values())) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult singleSourceShortestPath(HugeClient client, SingleSourceShortestPathEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + Map edges; + Map vertices = new HashMap<>(); + TraverserManager traverser = client.traverser(); + // TODO edges info set as false, check correctness + WeightedPaths result = traverser.singleSourceShortestPath(body.getSource(), + body.getDirection(), body.getLabel(), + body.getWeight(), body.getMaxDegree(), + body.getSkipDegree(), body.getCapacity(), body.getLimit(), true,false); + + for (Iterator iter = result.vertices().iterator(); iter.hasNext();) { + Vertex vertex = iter.next(); + vertices.put(vertex.id(), vertex); + } + edges = this.edgesOfVertex(vertices, client); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(vertices.values(), edges.values())) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult multiNodeShortestPath(HugeClient client, MultiNodeShortestPathRequest body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + Map edges; + Map vertices = new HashMap<>(); + TraverserManager traverser = client.traverser(); + body.withVertex = true; + PathsWithVertices result = traverser.multiNodeShortestPath(body); + for (Iterator iter = result.vertices().iterator(); iter.hasNext();) { + Vertex vertex = iter.next(); + vertices.put(vertex.id(), vertex); + } + edges = this.edgesOfVertex(vertices, client); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(vertices.values(), edges.values())) + .pathnum(result.paths().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult rings(HugeClient client, RingsEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); Date createTime = HubbleUtil.nowDate(); - TableView tableView = this.buildPathTableView(result); - GraphView graphView = this.buildPathGraphView(result); // Insert execute history - ExecuteStatus status = ExecuteStatus.SUCCESS; + ExecuteStatus status = ExecuteStatus.RUNNING; ExecuteHistory history; - history = new ExecuteHistory(null, connId, 0L, ExecuteType.ALGORITHM, - body.toString(), status, - AsyncTaskStatus.UNKNOWN, -1L, createTime); + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); this.historyService.save(history); - return GremlinResult.builder() - .type(GremlinResult.Type.PATH) - .jsonView(jsonView) - .tableView(tableView) - .graphView(graphView) - .build(); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + PathWithMeasure result = traverser.rings(body.getSource(), + body.getDirection(), body.getLabel(), + body.getMaxDepth(), body.isSourceInRing(), + body.getMaxDegree(), body.getCapacity(), + body.getLimit()); + GraphView graphView = this.buildPathGraphView(client, result.getRings()); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(graphView) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } } - private TableView buildPathTableView(Path result) { - List elements = result.objects(); - List paths = new ArrayList<>(elements.size()); - List ids = new ArrayList<>(); - elements.forEach(element -> { - if (element instanceof Vertex) { - ids.add(((Vertex) element).id()); - } else if (element instanceof Edge) { - ids.add(((Edge) element).id()); - } else { - ids.add(element); + public GremlinResult advancedpaths(HugeClient client, PathsRequest body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + Map edges; + Map vertices = new HashMap<>(); + TraverserManager traverser = client.traverser(); + body.withVertex = true; + PathsWithVertices result = traverser.paths(body); + for (Iterator iter = result.vertices().iterator(); iter.hasNext();) { + Vertex vertex = iter.next(); + vertices.put(vertex.id(), vertex); } - }); - paths.add(ImmutableMap.of("path", ids)); - return new TableView(TableView.PATH_HEADER, paths); + edges = this.edgesOfVertex(vertices, client); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(vertices.values(), edges.values())) + .pathnum(result.paths().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } } - private GraphView buildPathGraphView(Path result) { + public GremlinResult paths(HugeClient client, PathsEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + Map edges; + Map vertices = new HashMap<>(); + TraverserManager traverser = client.traverser(); + PathWithMeasure result = traverser.paths(body.getSource(), + body.getTarget(), body.getDirection(), body.getLabel(), + body.getMaxDepth(), body.getMaxDegree(), body.getCapacity(), + body.getLimit()); + GraphView graphView = this.buildPathGraphView(client, result.getPaths()); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(graphView) + .pathnum(result.getPaths().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult sameNeighbors(HugeClient client, SameNeighborsEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + Map edges; + Map vertices = new HashMap<>(); + TraverserManager traverser = client.traverser(); + SameNeighbors result = traverser.sameNeighbors(body.getVertex(), + body.getOther(), body.getDirection(), body.getLabel(), + body.getMaxDegree(), body.getLimit()); + List resultVertices = result.getSameNeighbors(); + resultVertices.add(body.getVertex()); + resultVertices.add(body.getOther()); + List escapedIds = resultVertices.stream().map(GremlinUtil::escapeId).collect(Collectors.toList()); + String ids = StringUtils.join(escapedIds, ","); + String gremlin = String.format("g.V(%s).limit(1000)", ids); + ResultSet resultSet = client.gremlin().gremlin(gremlin).execute(); + for (Iterator iter = resultSet.iterator(); iter.hasNext(); ) { + Vertex vertex = iter.next().getVertex(); + vertices.put(vertex.id(), vertex); + } + edges = this.edgesOfVertex(vertices, client); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(vertices.values(), edges.values())) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult kout(HugeClient client, KoutEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + KoutRequest.Builder builder = KoutRequest.builder(); + Steps.StepEntity stepEntity = new Steps.StepEntity(body.getLabel()); + builder.source(body.getSource()).maxDepth(body.getMaxDepth()). + nearest(body.isNearest()).capacity(body.getCapacity()).limit(body.getLimit()). + withPath(false).withVertex(true).withEdge(true). + steps().direction(body.getDirection()).degree(body.getMaxDegree()) + .skipDegree(body.getMaxDegree()).edgeSteps(stepEntity); + Kout result = traverser.kout(builder.build()); + Map edges = new HashMap<>(); + for (Iterator iter = result.edges().iterator(); iter.hasNext();) { + Edge edge = iter.next(); + edges.put(edge.id(), edge); + } + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(this.verticesOfEdge(edges, client).values(), result.edges())) + .pathnum(result.paths().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult koutPost(HugeClient client, KoutRequest body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + body.withVertex = true; + body.withEdge = true; + body.countOnly = false; + Kout result = traverser.kout(body); + Map edges = new HashMap<>(); + for (Iterator iter = result.edges().iterator(); iter.hasNext();) { + Edge edge = iter.next(); + edges.put(edge.id(), edge); + } + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(this.verticesOfEdge(edges, client).values(), result.edges())) + .pathnum(result.paths().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult kneighbor(HugeClient client, KneighborEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + KneighborRequest.Builder builder = KneighborRequest.builder(); + Steps.StepEntity stepEntity = new Steps.StepEntity(body.getLabel()); + builder.source(body.getSource()).maxDepth(body.getMaxDepth()). + limit(body.getLimit()). + withPath(true).withVertex(true).withEdge(true). + steps().direction(body.getDirection()).degree(body.getMaxDegree()) + .edgeSteps(stepEntity); + Kneighbor result = traverser.kneighbor(builder.build()); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(result.vertices(), result.edges())) + .pathnum(result.paths().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult kneighborPost(HugeClient client, KneighborRequest body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + body.withVertex = true; + body.withEdge = true; + body.withPath = true; + body.countOnly = false; + Kneighbor result = traverser.kneighbor(body); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(result.vertices(), result.edges())) + .pathnum(result.paths().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public JaccardsimilarityView jaccardSimilarity(HugeClient client, JaccardSimilarityEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + JaccardSimilarity result = traverser.jaccardSimilarity(body.getVertex(), body.getOther(), + body.getDirection(), body.getLabel(), body.getMaxDegree()); + status = ExecuteStatus.SUCCESS; + return JaccardsimilarityView.builder() + .jaccardsimilarity(result.getJaccardSimilarity()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public JaccardsimilarityView jaccardSimilarityPost(HugeClient client, SingleSourceJaccardSimilarityRequest body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + JaccardSimilarity result = traverser.jaccardSimilarity(body); + status = ExecuteStatus.SUCCESS; + return JaccardsimilarityView.builder() + .jaccardsimilarity(result.getJaccardSimilarity()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public RanksView personalRank(HugeClient client, PersonalRankAPI.Request body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + RanksWithMeasure result = traverser.personalRank(body); + status = ExecuteStatus.SUCCESS; + return RanksView.builder() + .ranks(result.personalRanks()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public RanksView neighborRank(HugeClient client, NeighborRankAPI.Request body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + RanksWithMeasure result = traverser.neighborRank(body); + status = ExecuteStatus.SUCCESS; + return RanksView.builder() + .ranksList(result.ranks()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult customizedPaths(HugeClient client, CustomizedPathsRequest body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + Map edges; + Map vertices = new HashMap<>(); + TraverserManager traverser = client.traverser(); + body.withVertex = true; + PathsWithVertices result = traverser.customizedPaths(body); + for (Iterator iter = result.vertices().iterator(); iter.hasNext();) { + Vertex vertex = iter.next(); + vertices.put(vertex.id(), vertex); + } + edges = this.edgesOfVertex(vertices, client); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(vertices.values(), edges.values())) + .pathnum(result.paths().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult templatePaths(HugeClient client, TemplatePathsRequest body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + Map edges; + Map vertices = new HashMap<>(); + TraverserManager traverser = client.traverser(); + body.withVertex = true; + PathsWithVertices result = traverser.count(body); + for (Iterator iter = result.vertices().iterator(); iter.hasNext();) { + Vertex vertex = iter.next(); + vertices.put(vertex.id(), vertex); + } + edges = this.edgesOfVertex(vertices, client); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(vertices.values(), edges.values())) + .pathnum(result.paths().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult crosspoints(HugeClient client, CrossPointsEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + PathWithMeasure result = traverser.crosspoint(body.getSource(), + body.getTarget(), body.getDirection(), body.getLabel(), + body.getMaxDepth(), body.getMaxDegree(), body.getCapacity(), + body.getLimit()); + Map vertices = new HashMap<>(); + Map edges = new HashMap<>(); + List elements = new ArrayList(); + for(Path crosspoints : result.getCrosspoints()) { + elements.add(crosspoints.crosspoint()); + } + List escapedIds = elements.stream() + .map(GremlinUtil::escapeId) + .collect(Collectors.toList()); + String ids = StringUtils.join(escapedIds, ","); + GraphView graphView = new GraphView(vertices.values(), edges.values()); + if (ids != ""){ + String gremlin = String.format("g.V(%s).limit(1000)", ids); + ResultSet resultSet = client.gremlin().gremlin(gremlin).execute(); + for (Iterator iter = resultSet.iterator(); iter.hasNext();) { + Vertex vertex = iter.next().getVertex(); + vertices.put(vertex.id(), vertex); + } + graphView = new GraphView(vertices.values(), edges.values()); + } + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(graphView) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult customizedcrosspoints(HugeClient client, CrosspointsRequest body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + Map edges; + Map vertices = new HashMap<>(); + TraverserManager traverser = client.traverser(); + body.withVertex = true; + body.withPath = true; + CustomizedCrosspoints result = traverser.customizedCrosspointss(body); + for (Iterator iter = result.vertices().iterator(); iter.hasNext();) { + Vertex vertex = iter.next(); + vertices.put(vertex.id(), vertex); + } + edges = this.edgesOfVertex(vertices, client); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(vertices.values(), edges.values())) + .pathnum(result.paths().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult rays(HugeClient client, RaysEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + PathWithMeasure result = traverser.rays(body.getSource(), + body.getDirection(), body.getLabel(), + body.getMaxDepth(), body.getMaxDegree(), body.getCapacity(), + body.getLimit()); + GraphView graphView = this.buildPathGraphView(client, result.getRays()); + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(graphView) + .pathnum(result.getRays().size()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + + public FusiformsimilarityView fusiformsimilarity(HugeClient client, FusiformSimilarityRequest body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + Map edges; + Map vertices = new HashMap<>(); + TraverserManager traverser = client.traverser(); + body.withVertex = true; + FusiformSimilarity result = traverser.fusiformSimilarity(body); + for (Iterator iter = result.vertices().iterator(); iter.hasNext();) { + Vertex vertex = iter.next(); + vertices.put(vertex.id(), vertex); + } + edges = this.edgesOfVertex(vertices, client); + status = ExecuteStatus.SUCCESS; + return FusiformsimilarityView.builder() + .graphView(new GraphView(vertices.values(), edges.values())) + .similarsMap(result.similarsMap()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public Map adamicadar(HugeClient client, AdamicadarEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + Prediction result = traverser.adamicadar(body.getVertex(), body.getOther(), + body.getDirection(), body.getLabel(), + body.getMaxDegree()); + status = ExecuteStatus.SUCCESS; + Map resultMap = new HashMap<>(); + resultMap.put("adamic_adar", result.getAdamicAdar()); + return resultMap; + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public Map resourceallocation(HugeClient client, ResourceallocationEntity body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + Prediction result = traverser.resourceAllocation(body.getVertex(), body.getOther(), + body.getDirection(), body.getLabel(), + body.getMaxDegree()); + status = ExecuteStatus.SUCCESS; + Map resultMap = new HashMap<>(); + resultMap.put("resource_allocation", result.getResourceAllocation()); + return resultMap; + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + public GremlinResult sameneighborsbatch(HugeClient client, SameNeighborsBatchRequest body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + TraverserManager traverser = client.traverser(); + SameNeighborsBatch result = traverser.sameNeighbors(body); + Map edges = new HashMap<>(); + Map vertices = new HashMap<>(); + List> elementlist = result.sameNeighbors; + for(Listelements : elementlist){ + List escapedIds = elements.stream() + .map(GremlinUtil::escapeId) + .collect(Collectors.toList()); + String ids = StringUtils.join(escapedIds, ","); + if (ids != "") { + String gremlin = String.format("g.V(%s).limit(1000)", ids); + ResultSet resultSet = client.gremlin().gremlin(gremlin).execute(); + for (Iterator iter = resultSet.iterator(); iter.hasNext(); ) { + Vertex vertex = iter.next().getVertex(); + vertices.put(vertex.id(), vertex); + } + edges.putAll(this.edgesOfVertex(vertices, client)); + } + } + status = ExecuteStatus.SUCCESS; + return GremlinResult.builder() + .type(GremlinResult.Type.PATH) + .graphView(new GraphView(vertices.values(), edges.values())) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + private GraphView buildPathGraphView(HugeClient client, List results) { + Map edges = new HashMap<>(); Map vertices = new HashMap<>(); + for (Path result : results) { + this.fillPathGraph(client, result, vertices, edges); + } + + return new GraphView(vertices.values(), edges.values()); + } + + public EgonetView egonet(HugeClient client, EgonetRequest body) { + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.ALGORITHM, + body.toString(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + StopWatch timer = StopWatch.createStarted(); + try { + Map edges; + Map vertices = new HashMap<>(); + TraverserManager traverser = client.traverser(); + body.withVertex = true; + body.countOnly = false; + Egonet result = traverser.egonet(body); + for (Iterator iter = result.vertices().iterator(); iter.hasNext();) { + Vertex vertex = iter.next(); + vertices.put(vertex.id(), vertex); + } + edges = this.edgesOfVertex(vertices, client); + status = ExecuteStatus.SUCCESS; + return EgonetView.builder() + .graphView(new GraphView(vertices.values(), edges.values())) + .ids(result.ids()) + .build(); + } catch (Throwable e) { + status = ExecuteStatus.FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + this.historyService.update(history); + } + } + + private GraphView buildPathGraphView(HugeClient client, Path result) { Map edges = new HashMap<>(); + Map vertices = new HashMap<>(result.size()); + this.fillPathGraph(client, result, vertices, edges); + return new GraphView(vertices.values(), edges.values()); + } - List elements = result.objects(); - for (Object element : elements) { + private void fillPathGraph(HugeClient client, Path result, + Map vertices, + Map edges) { + Set vertexIds = new LinkedHashSet<>(); + List pathEdges = new ArrayList<>(); + for (Object element : result.objects()) { if (element instanceof Vertex) { Vertex vertex = (Vertex) element; vertices.put(vertex.id(), vertex); } else if (element instanceof Edge) { Edge edge = (Edge) element; edges.put(edge.id(), edge); + pathEdges.add(edge); } else { - return GraphView.EMPTY; + this.addAbsentVertexId(element, vertices, vertexIds); } } - return new GraphView(vertices.values(), new ArrayList<>()); + for (Edge edge : pathEdges) { + this.addAbsentVertexId(edge.sourceId(), vertices, vertexIds); + this.addAbsentVertexId(edge.targetId(), vertices, vertexIds); + } + if (vertexIds.isEmpty()) { + return; + } + List escapedIds = vertexIds.stream() + .map(GremlinUtil::escapeId) + .collect(Collectors.toList()); + String ids = StringUtils.join(escapedIds, ","); + if (ids.isEmpty()) { + return; + } + String gremlin = String.format("g.V(%s).limit(1000)", ids); + ResultSet resultSet = client.gremlin().gremlin(gremlin).execute(); + for (Iterator iter = resultSet.iterator(); iter.hasNext();) { + Vertex vertex = iter.next().getVertex(); + vertices.put(vertex.id(), vertex); + } + if (pathEdges.isEmpty()) { + edges.putAll(this.edgesOfVertex(vertices, client)); + } + } + + private void addAbsentVertexId(Object vertexId, Map vertices, + Set vertexIds) { + if (vertexId == null) { + return; + } + if (!vertices.containsKey(vertexId)) { + vertexIds.add(vertexId); + } + } + + private Map edgesOfVertex(Map vertices, + HugeClient client) { + int batchSize = this.config.get(HubbleOptions.GREMLIN_BATCH_QUERY_IDS); + int edgeLimit = this.config.get(HubbleOptions.GREMLIN_EDGES_TOTAL_LIMIT); + int degreeLimit = this.config.get(HubbleOptions.GREMLIN_VERTEX_DEGREE_LIMIT); + + Set vertexIds = vertices.keySet(); + Map edges = new HashMap<>(vertexIds.size()); + Iterables.partition(vertexIds, batchSize).forEach(batch -> { + List escapedIds = batch.stream() + .map(GremlinUtil::escapeId) + .collect(Collectors.toList()); + String ids = StringUtils.join(escapedIds, ","); + // Any better way to find two vertices has linked? + String gremlin; + gremlin = String.format("g.V(%s).bothE().local(limit(%s)).dedup()", + ids, degreeLimit); + ResultSet resultSet = client.gremlin().gremlin(gremlin).execute(); + // The edges count for per vertex + Map degrees = new HashMap<>(resultSet.size()); + for (Iterator iter = resultSet.iterator(); iter.hasNext();) { + Edge edge = iter.next().getEdge(); + Object source = edge.sourceId(); + Object target = edge.targetId(); + // only add the interconnected edges of the found vertices + if (!vertexIds.contains(source) || !vertexIds.contains(target)) { + continue; + } + edges.put(edge.id(), edge); + if (edges.size() >= edgeLimit) { + break; + } + + int deg = degrees.compute(source, (k, v) -> v == null ? 1 : v + 1); + if (deg >= degreeLimit) { + break; + } + deg = degrees.compute(target, (k, v) -> v == null ? 1 : v + 1); + if (deg >= degreeLimit) { + break; + } + } + }); + return edges; + } + + private Map verticesOfEdge(Map edges, + HugeClient client) { + int batchSize = this.config.get(HubbleOptions.GREMLIN_BATCH_QUERY_IDS); + + Set vertexIds = new HashSet<>(edges.size() * 2); + edges.values().forEach(edge -> { + vertexIds.add(edge.sourceId()); + vertexIds.add(edge.targetId()); + }); + + Map vertices = new HashMap<>(vertexIds.size()); + Iterables.partition(vertexIds, batchSize).forEach(batch -> { + List escapedIds = batch.stream() + .map(GremlinUtil::escapeId) + .collect(Collectors.toList()); + String ids = StringUtils.join(escapedIds, ","); + String gremlin = String.format("g.V(%s)", ids); + ResultSet resultSet = client.gremlin().gremlin(gremlin).execute(); + for (Iterator iter = resultSet.iterator(); iter.hasNext();) { + Vertex vertex = iter.next().getVertex(); + vertices.put(vertex.id(), vertex); + } + }); + return vertices; } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/AccessService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/AccessService.java new file mode 100644 index 000000000..627f00c00 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/AccessService.java @@ -0,0 +1,173 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.service.auth; +// +//import java.util.ArrayList; +//import java.util.Collection; +//import java.util.HashSet; +//import java.util.List; +//import java.util.Set; +//import java.util.stream.Collectors; +// +//import org.apache.hugegraph.structure.auth.HugePermission; +//import com.google.common.collect.ArrayListMultimap; +//import com.google.common.collect.ImmutableList; +//import com.google.common.collect.Multimap; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Service; +//import lombok.extern.log4j.Log4j2; +// +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.entity.auth.AccessEntity; +//import org.apache.hugegraph.structure.auth.Role; +//import org.apache.hugegraph.structure.auth.Target; +//import org.apache.hugegraph.structure.auth.Access; +//import org.apache.hugegraph.exception.ExternalException; +// +//@Log4j2 +//@Service +//public class AccessService extends AuthService { +// +// @Autowired +// RoleService roleService; +// +// @Autowired +// TargetService targetService; +// +// public AccessEntity get(HugeClient client, String aid) { +// Access access = client.auth().getAccess(aid); +// if (access == null) { +// throw new ExternalException("auth.access.not-exist.id", aid); +// } +// +// Role role = this.roleService.get(client, access.role().toString()); +// Target target = this.targetService +// .get(client, access.target().toString()); +// +// return convert(access, role, target); +// } +// +// private List list0(HugeClient client, String rid, String tid) { +// List result = new ArrayList<>(); +// client.auth().listAccessesByRole(rid, -1).forEach(access -> { +// if (tid == null || access.target().toString().equals(tid)) { +// result.add(access); +// } +// }); +// return result; +// } +// +// public List list(HugeClient client, String rid, String tid) { +// List result = new ArrayList<>(); +// List accesses = list0(client, rid, tid); +// +// Multimap, Access> tmp = +// ArrayListMultimap.create(); +// +// accesses.forEach(access -> { +// tmp.put(ImmutableList.of(access.role().toString(), +// access.target().toString()), +// access); +// }); +// +// for(ImmutableList key: tmp.keySet()) { +// try { +// Role role = this.roleService.get(client, key.get(0)); +// Target target = this.targetService.get(client, key.get(1)); +// result.add(convert(tmp.get(key), role, target)); +// } catch (Exception e) { +// log.warn("list access error", e); +// } +// } +// +// return result; +// } +// +// public AccessEntity addOrUpdate(HugeClient client, AccessEntity accessEntity) { +// List accesses = list0(client, accessEntity.getRoleId(), +// accessEntity.getTargetId()); +// +// // CurrentPermission +// Set curPermissions +// = accesses.stream().map(Access::permission) +// .collect(Collectors.toSet()); +// +// // Delete +// accesses.forEach(access -> { +// if(!accessEntity.getPermissions().contains(access.permission())) { +// client.auth().deleteAccess(access.id()); +// } +// }); +// +// // Add +// accessEntity.getPermissions().forEach(permission -> { +// if (!curPermissions.contains(permission)) { +// Access access = new Access(); +// access.graphSpace(accessEntity.getGraphSpace()); +// access.role(accessEntity.getRoleId()); +// access.target(accessEntity.getTargetId()); +// access.permission(permission); +// client.auth().createAccess(access); +// } +// }); +// +// List results = list(client, accessEntity.getRoleId(), +// accessEntity.getTargetId()); +// +// if (results.isEmpty()) { +// return null; +// } +// +// return results.get(0); +// } +// +// public void delete(HugeClient client, String rid, String tid) { +// list0(client, rid, tid).forEach(access -> { +// client.auth().deleteAccess(access.id()); +// }); +// } +// +// protected AccessEntity convert(Access access, Role role, Target target) { +// +// AccessEntity ae = new AccessEntity(target.id().toString(), target.name(), +// role.id().toString(), role.name(), +// target.graphSpace(), target.graph(), +// new HashSet<>(), target.description(), +// target.resources()); +// +// ae.addPermission(access.permission()); +// +// return ae; +// } +// +// protected AccessEntity convert(Collection accesses, Role role, +// Target target) { +// +// AccessEntity ae = new AccessEntity(target.id().toString(), target.name(), +// role.id().toString(), role.name(), +// target.graphSpace(), target.graph(), +// new HashSet<>(), target.description(), +// target.resources()); +// accesses.forEach(access -> { +// ae.addPermission(access.permission()); +// }); +// +// return ae; +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/AuthService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/AuthService.java new file mode 100644 index 000000000..cc8dca1e6 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/AuthService.java @@ -0,0 +1,22 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.auth; + +public class AuthService { +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/BelongService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/BelongService.java new file mode 100644 index 000000000..d78b2f252 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/BelongService.java @@ -0,0 +1,229 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.service.auth; +// +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import com.fasterxml.jackson.annotation.JsonProperty; +//import lombok.extern.log4j.Log4j2; +//import org.apache.commons.lang3.StringUtils; +//import org.apache.hugegraph.driver.AuthManager; +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.entity.auth.BelongEntity; +//import org.apache.hugegraph.entity.auth.UserEntity; +//import org.apache.hugegraph.exception.InternalException; +//import org.apache.hugegraph.structure.auth.Belong; +//import org.apache.hugegraph.structure.auth.Role; +//import org.apache.hugegraph.util.PageUtil; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Service; +// +//import java.util.*; +// +//@Log4j2 +//@Service +//public class BelongService extends AuthService { +// @Autowired +// protected RoleService roleService; +// @Autowired +// protected UserService userService; +// +// public void add(HugeClient client, String rid, String uid) { +// Belong belong = new Belong(); +// belong.user(uid); +// belong.role(rid); +// this.add(client, belong); +// } +// +// public void add(HugeClient client, Belong belong) { +// AuthManager auth = client.auth(); +// auth.createBelong(belong); +// } +// +// public void addMany(HugeClient client, String rid, String[] uids) { +// Belong belong = new Belong(); +// for (String uid : uids) { +// belong.user(uid); +// belong.role(rid); +// this.add(client, belong); +// } +// } +// +// +// public void delete(HugeClient client, String bid) { +// AuthManager auth = client.auth(); +// auth.deleteBelong(bid); +// } +// +// public void delete(HugeClient client, String roleId, String userId) { +// list(client, roleId, userId).forEach((b) -> { +// client.auth().deleteBelong(b.getId()); +// }); +// } +// +// protected List listByUser(HugeClient client, String uid) { +// AuthManager auth = client.auth(); +// List result = new ArrayList<>(); +// +// auth.listBelongsByUser(uid, -1).forEach(b -> { +// BelongEntity entity = convert(client, b); +// if (entity != null) { +// result.add(entity); +// } +// }); +// +// return result; +// } +// +// public List listByRole(HugeClient client, String rid) { +// Role role = roleService.get(client, rid); +// +// List result = new ArrayList<>(); +// +// client.auth().listBelongsByRole(rid, -1).forEach(b -> { +// BelongEntity entity = convert(client, b); +// if (entity != null) { +// result.add(entity); +// } +// }); +// +// return result; +// } +// +// public List listAll(HugeClient client) { +// List result = new ArrayList<>(); +// +// client.auth().listBelongs().forEach(b -> { +// BelongEntity entity = convert(client, b); +// if (entity != null) { +// result.add(entity); +// } +// }); +// +// return result; +// } +// +// public List list(HugeClient client, String rid, String uid) { +// AuthManager auth = client.auth(); +// +// List result = new ArrayList<>(); +// +// if (StringUtils.isEmpty(uid) && StringUtils.isEmpty(rid)) { +// return listAll(client); +// } else if (StringUtils.isEmpty(uid) && !StringUtils.isEmpty(rid)) { +// return this.listByRole(client, rid); +// } else if (!StringUtils.isEmpty(uid) && StringUtils.isEmpty(rid)) { +// return this.listByUser(client, uid); +// } else { +// auth.listBelongsByRole(rid, -1).forEach(b -> { +// BelongEntity entity = convert(client, b); +// if (entity != null && entity.getUserId().equals(uid)) { +// result.add(entity); +// } +// }); +// } +// +// return result; +// } +// +// public IPage listPage(HugeClient client, String rid, +// String uid, int pageNo, int pageSize) { +// return PageUtil.page(list(client, rid, uid), pageNo, pageSize); +// } +// +// public BelongEntity get(HugeClient client, String bid) { +// AuthManager auth = client.auth(); +// Belong belong = auth.getBelong(bid); +// if (belong == null) { +// throw new InternalException("auth.belong.get.{} Not Exits", +// bid); +// } +// +// return convert(client, belong); +// } +// +// protected BelongEntity convert(HugeClient client, Belong belong) { +// +// try { +// Role role = roleService.get(client, belong.role().toString()); +// UserEntity user = userService.getUser(client, belong.user().toString()); +// +// return new BelongEntity(belong.id().toString(), +// user.getId(), user.getName(), +// role.id().toString(), role.name(), +// user.getDescription(), user.getCreate()); +// } catch (Exception e) { +// log.warn("convert belong error", e); +// } +// +// return null; +// } +// +// public void deleteMany(HugeClient client, String[] ids) { +// Arrays.stream(ids).forEach(id -> { +// client.auth().deleteBelong(id); +// }); +// } +// +// public boolean exists(HugeClient client, String rid, String uid) { +// if (this.list(client, rid, uid).size() > 0) { +// return true; +// } +// +// return false; +// } +// +// public static class BelongsReq { +// @JsonProperty("user_ids") +// Set userIds = new HashSet(); +// @JsonProperty("role_id") +// String roleId; +// @JsonProperty("belong_description") +// String description; +// +// public BelongsReq() { +// } +// +// public Set getUserIds() { +// return userIds; +// } +// +// public BelongsReq setUserIds(Set userIds) { +// this.userIds = userIds; +// return this; +// } +// +// public String getRoleId() { +// return roleId; +// } +// +// public BelongsReq setRoleId(String roleId) { +// this.roleId = roleId; +// return this; +// } +// +// public String getDescription() { +// return description; +// } +// +// public BelongsReq setDescription(String description) { +// this.description = description; +// return this; +// } +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/GraphSpaceUserService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/GraphSpaceUserService.java new file mode 100644 index 000000000..4c79985bc --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/GraphSpaceUserService.java @@ -0,0 +1,175 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.service.auth; +// +//import java.util.ArrayList; +//import java.util.Comparator; +//import java.util.List; +//import java.util.Set; +//import java.util.stream.Collectors; +// +//import org.apache.hugegraph.entity.auth.RoleEntity; +//import org.apache.hugegraph.structure.auth.User; +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import com.google.common.collect.ArrayListMultimap; +//import com.google.common.collect.Multimap; +// +//import lombok.extern.log4j.Log4j2; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Service; +// +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.entity.auth.BelongEntity; +//import org.apache.hugegraph.entity.auth.UserView; +//import org.apache.hugegraph.structure.auth.Belong; +//import org.apache.hugegraph.util.E; +//import org.apache.hugegraph.util.PageUtil; +// +//@Log4j2 +//@Service +//public class GraphSpaceUserService extends AuthService{ +// +// @Autowired +// private BelongService belongService; +// @Autowired +// private RoleService roleService; +// +// public List listUsers(HugeClient client) { +// +// List uvs = new ArrayList<>(); +// +// List belongs = new ArrayList<>(); +// roleService.list(client).forEach((g) -> { +// belongs.addAll(belongService.listByRole(client, g.id().toString())); +// }); +// +// Multimap tmp = ArrayListMultimap.create(); +// belongs.forEach(belong -> { +// tmp.put(belong.getUserId(), belong); +// }); +// +// tmp.keySet().forEach((k) -> { +// UserView uv = new UserView(null, null, new ArrayList()); +// tmp.get(k).forEach((b) -> { +// uv.setId(b.getUserId()); +// uv.setName(b.getUserName()); +// uv.addRole(new RoleEntity(b.getRoleId(), b.getRoleName())); +// }); +// uvs.add(uv); +// }); +// +// return uvs; +// } +// +// public UserView getUser(HugeClient client, String uid) { +// +// List uvs = new ArrayList<>(); +// +// List belongs = belongService.listByUser(client, uid); +// +// UserView uv = new UserView(null, null, +// new ArrayList(belongs.size())); +// belongs.forEach((b) -> { +// uv.setId(b.getUserId()); +// uv.setName(b.getUserName()); +// uv.addRole(new RoleEntity(b.getRoleId(), b.getRoleName())); +// }); +// +// return uv; +// } +// +// public IPage queryPage(HugeClient client, String query, +// int pageNo, int pageSize) { +// List users = listUsers(client); +// List results = +// users.stream() +// .filter((u) -> u.getName().contains(query)) +// .sorted(Comparator.comparing(UserView::getName)) +// .collect(Collectors.toList()); +// +// return PageUtil.page(results, pageNo, pageSize); +// } +// +// public UserView createOrUpdate(HugeClient client, UserView userView) { +// E.checkNotNull(userView.getId(), "User Id Not Null"); +// E.checkArgument(userView.getRoles() != null +// && userView.getRoles().size() > 0 +// , "THe role info is empty"); +// +// // Delete +// Set newRoles = userView.getRoles().stream() +// .map(RoleEntity::getId) +// .collect(Collectors.toSet()); +// belongService.listByUser(client, userView.getId()) +// .forEach(belongEntity -> { +// if (!newRoles.contains(belongEntity.getRoleId())) { +// client.auth().deleteBelong(belongEntity.getId()); +// } +// }); +// +// // Create +// userView.getRoles().forEach((g -> { +// if(!belongService.exists(client, g.getId(), userView.getId())) { +// Belong belong = new Belong(); +// belong.user(userView.getId()); +// belong.role(g.getId()); +// belongService.add(client, belong); +// } +// })); +// +// return getUser(client, userView.getId()); +// } +// +// public void unauthUser(HugeClient client, String uid) { +// List belongs = belongService.listByUser(client, uid); +// E.checkState(!belongs.isEmpty(), "The user: (%s) not exists", uid); +// belongs.forEach((b) -> { +// belongService.delete(client, b.getId().toString()); +// }); +// } +// +// +// /** +// * Page to get the list of space administrators +// */ +// public IPage querySpaceAdmins(HugeClient client, String graphSpace, +// String query, int pageNo, +// int pageSize) { +// List spaceAdminUsers = getSpaceAdmins(client, graphSpace); +// +// List spaceAdmins = +// spaceAdminUsers.stream() +// .filter((u) -> u.name().contains(query)) +// .sorted(Comparator.comparing((u) -> u.name())) +// .collect(Collectors.toList()); +// return PageUtil.page(spaceAdmins, pageNo, pageSize); +// } +// +// /** +// * Get space admins from server, server return users do not contain department and image url info +// */ +// private List getSpaceAdmins(HugeClient client, String graphSpace) { +// List spaceAdmins = client.auth().listSpaceAdmin(graphSpace); +// ArrayList spaceAdminUser = new ArrayList<>(); +// for (String spaceAdmin : spaceAdmins) { +// spaceAdminUser.add(client.auth().getUser(spaceAdmin)); +// } +// return spaceAdminUser; +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/GroupService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/GroupService.java new file mode 100644 index 000000000..9fb378a23 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/GroupService.java @@ -0,0 +1,89 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.service.auth; +// +//import org.apache.hugegraph.driver.AuthManager; +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.exception.ExternalException; +//import org.apache.hugegraph.structure.auth.Group; +//import org.apache.hugegraph.util.PageUtil; +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import lombok.extern.log4j.Log4j2; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Service; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Map; +// +//@Log4j2 +//@Service +//public class GroupService extends AuthService{ +// @Autowired +// UserService userService; +// public Group get(HugeClient client, String gid) { +// AuthManager auth = client.auth(); +// Group group = auth.getGroup(gid); +// if (group == null) { +// throw new ExternalException("auth.group.get.not-exist", +// gid); +// } +// return group; +// } +// +// public List list(HugeClient client) { +// List groups = client.auth().listGroups(); +// return groups; +// } +// +// public IPage queryPage(HugeClient client, String query, +// int pageNo, int pageSize) { +// ArrayList results = new ArrayList<>(); +// client.auth().listGroups().stream().filter((g) -> g.nickname().contains(query)) +// .forEach((g) -> { +// results.add(g); +// }); +// +// return PageUtil.page(results, pageNo, pageSize); +// } +// +// public Group update(HugeClient client, Group group) { +// AuthManager auth = client.auth(); +// if (auth.getGroup(group.id()) == null ) { +// throw new ExternalException("auth.group.not-exist", +// group.id(), group.name()); +// } +// return auth.updateGroup(group); +// } +// +// public Group insert(HugeClient client, Group group) { +// AuthManager auth = client.auth(); +// return auth.createGroup(group); +// } +// +// public void delete(HugeClient client, String gid) { +// AuthManager auth = client.auth(); +// auth.deleteGroup(gid); +// } +// +// public Map batch(HugeClient client, String gid , Map action) { +// AuthManager auth = client.auth(); +// return auth.batchGroup(gid, action); +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/ManagerService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/ManagerService.java new file mode 100644 index 000000000..1c51b9bf7 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/ManagerService.java @@ -0,0 +1,31 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.auth; + +import org.apache.hugegraph.driver.HugeClient; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ManagerService extends AuthService { + public List getManager(HugeClient client) { + return null; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/RoleService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/RoleService.java new file mode 100644 index 000000000..9762b3f4e --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/RoleService.java @@ -0,0 +1,109 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.service.auth; +// +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import lombok.extern.log4j.Log4j2; +//import org.apache.hugegraph.driver.AuthManager; +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.exception.ExternalException; +//import org.apache.hugegraph.structure.auth.Role; +//import org.apache.hugegraph.util.PageUtil; +//import org.springframework.stereotype.Service; +// +//import java.util.ArrayList; +//import java.util.List; +// +// +//@Log4j2 +//@Service +//public class RoleService extends AuthService { +// +// public Role get(HugeClient client, String rid) { +// AuthManager auth = client.auth(); +// Role role = auth.getRole(rid); +// if (role == null) { +// throw new ExternalException("auth.role.get.not-exist", +// rid); +// } +// +// return role; +// } +// +// public List list(HugeClient client) { +// List roles = client.auth().listRoles(); +// +// return roles; +// } +// +// public IPage queryPage(HugeClient client, String query, +// int pageNo, int pageSize) { +// ArrayList results = new ArrayList<>(); +// client.auth().listRoles().stream().filter((g) -> g.nickname().contains(query)) +// .forEach((g) -> { +// results.add(g); +// }); +// +// return PageUtil.page(results, pageNo, pageSize); +// } +// +// public Role update(HugeClient client, Role role) { +// AuthManager auth = client.auth(); +// if (auth.getRole(role.id()) == null ) { +// throw new ExternalException("auth.role.not-exist", +// role.id(), role.name()); +// } +// +// return auth.updateRole(role); +// } +// +// public Role insert(HugeClient client, Role role) { +// AuthManager auth = client.auth(); +// +// return auth.createRole(role); +// } +// +// public void delete(HugeClient client, String rid) { +// AuthManager auth = client.auth(); +// Role role = RoleService.getRole(auth, rid); +// +// auth.deleteRole(rid); +// +// auth.listAccessesByRole(role, -1).forEach( +// access -> { +// auth.deleteAccess(access.id()); +// } +// ); +// +// auth.listBelongsByRole(role, -1).forEach( +// belong -> { +// auth.deleteBelong(belong.id()); +// } +// ); +// } +// +// protected static Role getRole(AuthManager auth, String rid) { +// Role role = auth.getRole(rid); +// if (role == null) { +// throw new ExternalException("auth.role.not-exist", +// rid); +// } +// return role; +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/TargetService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/TargetService.java new file mode 100644 index 000000000..68427df31 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/TargetService.java @@ -0,0 +1,76 @@ +///* +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// +//package org.apache.hugegraph.service.auth; +// +//import java.util.Comparator; +//import java.util.List; +//import java.util.stream.Collectors; +// +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.util.PageUtil; +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import org.springframework.stereotype.Service; +//import lombok.extern.log4j.Log4j2; +// +//import org.apache.hugegraph.structure.auth.Target; +//import org.apache.hugegraph.exception.ExternalException; +// +//@Log4j2 +//@Service +//public class TargetService extends AuthService{ +// +// +// public List list(HugeClient client) { +// List targets = client.auth().listTargets(); +// +// return targets; +// } +// +// public IPage queryPage(HugeClient client, String query, int pageNo, +// int pageSize) { +// +// List results = +// list(client).stream() +// .filter(target -> target.name().toLowerCase().contains(query.toLowerCase())) +// .sorted(Comparator.comparing(Target::name)) +// .collect(Collectors.toList()); +// +// return PageUtil.page(results, pageNo, pageSize); +// } +// +// public Target get(HugeClient client, String tid) { +// Target target = client.auth().getTarget(tid); +// if (target == null) { +// throw new ExternalException("auth.target.not-exist.id", tid); +// } +// return target; +// } +// +// public Target add(HugeClient client, Target target) { +// return client.auth().createTarget(target); +// } +// +// public Target update(HugeClient client, Target target) { +// return client.auth().updateTarget(target); +// } +// +// public void delete(HugeClient client, String tid) { +// client.auth().deleteTarget(tid); +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/UserService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/UserService.java new file mode 100644 index 000000000..b3cc48154 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/UserService.java @@ -0,0 +1,546 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.auth; + +import java.io.File; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.common.Response; +import org.apache.hugegraph.structure.auth.Login; +import org.apache.hugegraph.options.HubbleOptions; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.driver.AuthManager; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.auth.UserEntity; +import org.apache.hugegraph.exception.InternalException; +import org.apache.hugegraph.structure.auth.User; +import org.apache.hugegraph.util.PageUtil; + +import com.csvreader.CsvReader; + +import org.springframework.web.multipart.MultipartFile; + +@Log4j2 +@Service +public class UserService extends AuthService{ + + public static final String CREATE_SUCCESS = "successfully created"; + + //@Autowired + //BelongService belongService; + + @Autowired + ManagerService managerService; + + @Autowired + private HugeConfig config; + + private boolean isPdEnabled() { + return config.get(HubbleOptions.PD_ENABLED); + } + + public List listUsers(HugeClient hugeClient) { + AuthManager auth = hugeClient.auth(); + + List users = auth.listUsers(); + List ues= new ArrayList<>(users.size()); + Map countMap = new HashMap<>(); + Map> spaceMap = new HashMap<>(); + users.forEach(u -> { + UserEntity ue = convert(hugeClient, u); + if (isPdEnabled()) { + ue.setSuperadmin(isSuperAdmin(hugeClient, ue.getId())); + } else { + ue.setSuperadmin(false); + } + ues.add(ue); + }); + if (isPdEnabled()) { + List listMap = getSpaceAndSpacenum(hugeClient); + spaceMap = listMap.get(0); + countMap = listMap.get(1); + for (UserEntity user: ues) { + user.setSpacenum(countMap.get(user.getName())); + user.setAdminSpaces(spaceMap.get(user.getName())); + } + } + + return ues; + } + + public UserEntity getUser(HugeClient client, String name) { + return convert(client, client.auth().getUserByName(name)); + } + + public Object queryPage(HugeClient hugeClient, String query, + int pageNo, int pageSize) { + AuthManager auth = hugeClient.auth(); + Map countMap = new HashMap<>(); + Map> spaceMap = new HashMap<>(); + + List results = + hugeClient.auth().listUsers().stream() + .filter((u) -> u.name().contains(query) || + u.nickname() != null && u.nickname().contains(query)) + .sorted(Comparator.comparing(User::name)) + .map((u) -> { + UserEntity ue = convert(hugeClient, u); + return ue; + }).collect(Collectors.toList()); + + if (isPdEnabled()) { + List listMap = getSpaceAndSpacenum(hugeClient); + spaceMap = listMap.get(0); + countMap = listMap.get(1); + for (UserEntity user: results) { + user.setSpacenum(countMap.get(user.getName())); + user.setAdminSpaces(spaceMap.get(user.getName())); + user.setSuperadmin(isSuperAdmin(hugeClient, user.getId())); + } + } + return PageUtil.page(results, pageNo, pageSize); + } + + public Object superQueryPage(HugeClient hugeClient, String query, + int pageNo, int pageSize) { + AuthManager auth = hugeClient.auth(); + Map countMap = new HashMap<>(); + Map> spaceMap = new HashMap<>(); + + List results; + if (isPdEnabled()) { + results = hugeClient.auth().listUsers().stream() + .filter((u) -> !"admin".equals(u.name()) + && !"system".equals(u.name()) + && isSuperAdmin(hugeClient, u.id().toString())) + .sorted(Comparator.comparing(User::name)) + .map((u) -> convert(hugeClient, u)) + .collect(Collectors.toList()); + + List listMap = getSpaceAndSpacenum(hugeClient); + spaceMap = listMap.get(0); + countMap = listMap.get(1); + for (UserEntity user: results) { + user.setSpacenum(countMap.get(user.getName())); + user.setAdminSpaces(spaceMap.get(user.getName())); + user.setSuperadmin(isSuperAdmin(hugeClient, user.getId())); + } + } else { + // Non-PD mode: no manager/space APIs available + results = new ArrayList<>(); + } + return PageUtil.page(results, pageNo, pageSize); + } + + + public UserEntity get(HugeClient hugeClient, String userId) { + AuthManager auth = hugeClient.auth(); + User user = auth.getUser(userId); + if (user == null) { + throw new InternalException("auth.user.get.%s Not Exits", + userId); + } + UserEntity userEntity = convert(hugeClient, user); + if (isPdEnabled()) { + userEntity.setSuperadmin(isSuperAdmin(hugeClient, userEntity.getId())); + List spaces = hugeClient.graphSpace().listGraphSpace(); + List listMap = getSpaceAndSpacenum(hugeClient); + List adminSpaces = (List) listMap.get(0).get(userId); + List resSpaces = new ArrayList<>(); + for (String space : spaces) { + if (hugeClient.graphSpace().checkDefaultRole(space, userId, "analyst")) { + resSpaces.add(space); + } + } + resSpaces.addAll(adminSpaces); + userEntity.setAdminSpaces(adminSpaces); + userEntity.setSpacenum(adminSpaces.size()); + userEntity.setResSpaces(resSpaces); + } else { + userEntity.setSuperadmin(false); + userEntity.setAdminSpaces(new ArrayList<>()); + userEntity.setSpacenum(0); + userEntity.setResSpaces(new ArrayList<>()); + } + return userEntity; + } + + public UserEntity getpersonal(HugeClient hugeClient, String username) { + AuthManager auth = hugeClient.auth(); + User user = auth.getUserByName(username); + if (user == null) { + throw new InternalException("auth.user.get.%s Not Exits", + username); + } + UserEntity userEntity = convert(hugeClient, user); + if (isPdEnabled()) { + userEntity.setSuperadmin(isSuperAdmin(hugeClient)); + List adminSpaces = new ArrayList<>(); + List resSpaces = new ArrayList<>(); + List spaces = hugeClient.graphSpace().listGraphSpace(); + for (String space: spaces) { + if (hugeClient.auth().isSpaceAdmin(space)) { + adminSpaces.add(space); + } + if (hugeClient.auth().isSpaceAdmin(space) || + hugeClient.auth().checkDefaultRole(space, "analyst") ) { + resSpaces.add(space); + } + } + userEntity.setAdminSpaces(adminSpaces); + userEntity.setSpacenum(adminSpaces.size()); + userEntity.setResSpaces(resSpaces); + } else { + userEntity.setSuperadmin(false); + userEntity.setAdminSpaces(new ArrayList<>()); + userEntity.setSpacenum(0); + userEntity.setResSpaces(new ArrayList<>()); + } + return userEntity; + } + + public void add(HugeClient client, UserEntity ue) { + User user = new User(); + user.name(ue.getName()); + user.password(ue.getPassword()); + user.phone(ue.getPhone()); + user.email(ue.getEmail()); + user.avatar(ue.getAvatar()); + user.description(ue.getDescription()); + user.nickname(ue.getNickname()); + + User newUser = client.auth().createUser(user); + if (ue.getAdminSpaces() != null) { + for (String graphspace : ue.getAdminSpaces()) { + client.auth().addSpaceAdmin(ue.getName(), graphspace); + } + } + + if (newUser != null && ue.isSuperadmin()) { + // add superadmin + client.auth().addSuperAdmin(newUser.id().toString()); + } + } + + public String addbatch(HugeClient client, MultipartFile csvFile) { + Map csv = readCsvByCsvReader(multipartFileToFile(csvFile)); + List> createBatchBody = (List>) csv.get("data"); + Map>> result = + client.auth().createBatch(createBatchBody); + List> resultList = result.get("result"); + List failedList = new ArrayList<>(createBatchBody.size()); + for (Map entry: resultList) { + if (!CREATE_SUCCESS.equals(entry.get("result"))) { + failedList.add(entry.get("user_name")); + } + } + if (!failedList.isEmpty()) { + throw new RuntimeException("创建失败:" + failedList); + } + return "创建成功"; + } + + public File multipartFileToFile(MultipartFile multiFile) { + long currentTime=System.currentTimeMillis(); + String fileName = multiFile.getOriginalFilename().concat(Long.toString(currentTime)); + String prefix = fileName.substring(fileName.lastIndexOf(".")); + try { + File file = File.createTempFile(fileName, prefix); + multiFile.transferTo(file); + return file; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public Map readCsvByCsvReader(File file) { + Map mapData = new HashMap<>(); + String fileName = file.getName(); + mapData.put("sheetName", fileName); + + List strList = new ArrayList<>(); + List> list = new ArrayList<>(); + try { + List arrList = new ArrayList(); + CsvReader reader = new CsvReader(file.getPath(), ',', Charset.forName("UTF-8")); + // 读取表头 + reader.readHeaders(); + String[] headArray = reader.getHeaders(); + while (reader.readRecord()) { + // 按行读取,并把每一行的数据添加到list集合 + arrList.add(reader.getValues()); + } + reader.close(); + // 如果要返回 String[] 类型的 list 集合,则直接返回 arrList + // 以下步骤是把 String[] 类型的 list 集合转化为 String 类型的 list 集合 + for (int i = 0; i < arrList.size(); i++) { + // 组装String字符串 + // 如果不知道有多少列,则可再加一个循环 + Map map = new HashMap<>(); + for (int j = 0 ; j < arrList.get(0).length ; j++) { + map.put("" + headArray[j] + "", arrList.get(i)[j]); + } + list.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + mapData.put("data", list); + return mapData; + } + + public void delete(HugeClient hugeClient, String userId) { + hugeClient.auth().deleteUser(userId); + } + + protected UserEntity convert(HugeClient client, User user) { + if (user == null) { + return null; + } + + UserEntity u = new UserEntity(); + u.setId(user.id().toString()); + u.setName(user.name()); + u.setNickname(user.nickname()); + u.setEmail(user.email()); + u.setPhone(user.phone()); + u.setAvatar(user.avatar());; + u.setDescription(user.description()); + u.setCreate(user.createTime()); + u.setUpdate(user.updateTime()); + u.setCreator(user.creator()); + + return u; + } + protected List getSpaceAndSpacenum(HugeClient hugeClient){ + AuthManager auth = hugeClient.auth(); + List listMap = new ArrayList(); + if (!isPdEnabled()) { + // Non-PD mode: no GraphSpace/Manager APIs available + listMap.add(new HashMap<>()); + listMap.add(new HashMap<>()); + return listMap; + } + List users = auth.listUsers(); + List spaces = hugeClient.graphSpace().listGraphSpace(); + Map countMap = new HashMap<>(); + Map> spaceMap = new HashMap<>(); + for (User user: users) { + countMap.put(user.name(), 0); + spaceMap.put(user.name(), new ArrayList()); + } + + for (String space: spaces) { + List spaceManagers = + hugeClient.auth().listSpaceAdmin(space); + for (String spaceManager: spaceManagers) { + countMap.put(spaceManager, countMap.get(spaceManager) + 1); + List tempspace = spaceMap.get(spaceManager); + tempspace.add(space); + } + } + listMap.add(spaceMap); + listMap.add(countMap); + return listMap; + } + + public void update(HugeClient hugeClient, UserEntity userEntity) { + User user = new User(); + user.setId(userEntity.getId()); + user.name(userEntity.getName()); + user.password(userEntity.getPassword()); + user.phone(userEntity.getPhone()); + user.email(userEntity.getEmail()); + user.description(userEntity.getDescription()); + user.nickname(userEntity.getNickname()); + updateAdminSpace(hugeClient, userEntity.getName(), userEntity.getAdminSpaces()); + + // 设置超级管理员权限 + boolean curSuperAdmin = isSuperAdmin(hugeClient, user.id().toString()); + if (curSuperAdmin && !userEntity.isSuperadmin()) { + hugeClient.auth().delSuperAdmin(user.id().toString()); + } + if (!curSuperAdmin && userEntity.isSuperadmin()) { + hugeClient.auth().addSuperAdmin(user.id().toString()); + } + + hugeClient.auth().updateUser(user); + } + + public void updatePersonal(HugeClient hugeClient, String username, String nickname, String description){ + AuthManager auth = hugeClient.auth(); + User user = auth.getUserByName(username); + user.nickname(nickname); + user.description(description); + user.password(null); + hugeClient.auth().updateUser(user); + } + + public Response updatepwd(HugeClient hugeClient, String username, String oldpwd, String newpwd) { + Login login = new Login(); + login.name(username); + login.password(oldpwd); + try { + hugeClient.auth().login(login); + } catch (Exception e) { + return Response.builder() + .status(Constant.STATUS_BAD_REQUEST) + .message(e.getMessage()) + .cause(e.getCause()) + .build(); + } + // Must fetch user first to get the ID, otherwise updateUser sends + // PUT to the collection path (no {id}) and gets HTTP 405. + User user = hugeClient.auth().getUserByName(username); + user.password(newpwd); + hugeClient.auth().updateUser(user); + return Response.builder() + .status(Constant.STATUS_OK) + .build(); + } + + public List listAdminSpace(HugeClient hugeClient, String username) { + if (!isPdEnabled()) { + return new ArrayList<>(); + } + AuthManager auth = hugeClient.auth(); + List users = auth.listUsers(); + List spaces = hugeClient.graphSpace().listGraphSpace(); + List adminspace = new ArrayList(); + for (String space: spaces) { + List spaceManagers = + hugeClient.auth().listSpaceAdmin(space); + for (String spaceManager: spaceManagers) { + if (spaceManager.equals(username)) { + adminspace.add(space); + } + } + } + return adminspace; + } + + public void updateAdminSpace(HugeClient hugeClient, String username, List adminspaces) { + if (adminspaces == null || !isPdEnabled()) { + return ; + } + List oldadminspaces = listAdminSpace(hugeClient, username); + for(String adminspace : adminspaces) { + if (!oldadminspaces.contains(adminspace)) { + hugeClient.auth().addSpaceAdmin(username, adminspace); + } + } + for(String oldadminspace : oldadminspaces) { + if (!adminspaces.contains(oldadminspace)) { + hugeClient.auth().delSpaceAdmin(username , oldadminspace); + } + } + } + + + public String userLevel(HugeClient client) { + if (!isPdEnabled()) { + // In non-PD mode, Manager/GraphSpace APIs are not available. + // Treat the logged-in user as ADMIN for full access. + return "ADMIN"; + } + + if (isSuperAdmin(client)) { + return "ADMIN"; + } + + if (isSpaceAdmin(client)) { + return "SPACEADMIN"; + } + + // Default: user + return "USER"; + } + + public boolean isSuperAdmin(HugeClient client, String uid) { + if (!isPdEnabled()) { + return false; + } + // Only used by superadmin + // Check: if user is spaceadmin for any graphspace + return client.auth().listSuperAdmin().contains(uid); + } + + public boolean isSuperAdmin(HugeClient client) { + if (!isPdEnabled()) { + return false; + } + // Check: if current user is superadmin + return client.auth().isSuperAdmin(); + } + + /* + public boolean isAssignSpaceAdmin(HugeClient client, String uid, + String graphSpace) { + // Only used by superadmin + // Check: if user is spaceadmin for one graphSpace + return client.auth().listSpaceAdmin(graphSpace).contains(uid); + } + */ + + public boolean isAssignSpaceAdmin(HugeClient client, String graphSpace) { + if (!isPdEnabled()) { + return false; + } + // Check: if current user is spaceadmin + return client.auth().isSpaceAdmin(graphSpace); + } + + public boolean isSpaceAdmin(HugeClient client) { + if (!isPdEnabled()) { + return false; + } + // Check: if current user is spaceadmin + List graphSpaces = client.graphSpace().listGraphSpace(); + for (String gs : graphSpaces) { + if (isAssignSpaceAdmin(client, gs)) { + return true; + } + } + + return false; + } + + // List graphspace admin + public List listGraphSpaceAdmin(HugeClient client, + String graphSpace) { + if (!isPdEnabled()) { + return new ArrayList<>(); + } + AuthManager auth = client.auth(); + + return auth.listSpaceAdmin(graphSpace); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/WhiteIpListService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/WhiteIpListService.java new file mode 100644 index 000000000..f7b9a0180 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/WhiteIpListService.java @@ -0,0 +1,53 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.auth; + +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.driver.WhiteIpListManager; +import org.apache.hugegraph.entity.auth.WhiteIpListEntity; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +@Log4j2 +@Service +public class WhiteIpListService extends AuthService{ + public Map get(HugeClient client) { + WhiteIpListManager whiteIpListManager = client.whiteIpListManager(); + Map whiteIpList = whiteIpListManager.list(); + return whiteIpList; + } + + public Map batch(HugeClient client, WhiteIpListEntity whiteIpListEntity) { + WhiteIpListManager whiteIpListManager = client.whiteIpListManager(); + Map actionMap = new HashMap<>(); + actionMap.put("action", whiteIpListEntity.getAction()); + actionMap.put("ips", whiteIpListEntity.getIps()); + Map whiteIpList = whiteIpListManager.batch(actionMap); + return whiteIpList; + } + + public Map updatestatus(HugeClient client, boolean status) { + WhiteIpListManager whiteIpListManager = client.whiteIpListManager(); + Map whiteIpList = whiteIpListManager.update(status); + return whiteIpList; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graph/GraphService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graph/GraphService.java index 8523e9e9e..65daa8d0e 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graph/GraphService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graph/GraphService.java @@ -18,13 +18,15 @@ package org.apache.hugegraph.service.graph; -import java.util.Map; - +import com.google.common.collect.ImmutableSet; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.hugegraph.driver.GraphManager; import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.graph.EdgeEntity; import org.apache.hugegraph.entity.graph.VertexEntity; +import org.apache.hugegraph.entity.graph.VertexQueryEntity; import org.apache.hugegraph.entity.query.GraphView; import org.apache.hugegraph.entity.schema.EdgeLabelEntity; import org.apache.hugegraph.entity.schema.PropertyKeyEntity; @@ -34,7 +36,8 @@ import org.apache.hugegraph.loader.source.file.FileSource; import org.apache.hugegraph.loader.source.file.ListFormat; import org.apache.hugegraph.loader.util.DataTypeUtil; -import org.apache.hugegraph.service.HugeClientPoolService; +import org.apache.hugegraph.loader.util.JsonUtil; +import org.apache.hugegraph.service.auth.UserService; import org.apache.hugegraph.service.schema.EdgeLabelService; import org.apache.hugegraph.service.schema.PropertyKeyService; import org.apache.hugegraph.service.schema.VertexLabelService; @@ -44,19 +47,20 @@ import org.apache.hugegraph.structure.graph.Vertex; import org.apache.hugegraph.structure.schema.PropertyKey; import org.apache.hugegraph.util.Ex; +import org.json.JSONArray; +import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; -import com.google.common.collect.ImmutableSet; - -import lombok.extern.log4j.Log4j2; +import java.io.File; +import java.io.IOException; +import java.util.*; @Log4j2 @Service public class GraphService { - @Autowired - private HugeClientPoolService poolService; @Autowired private PropertyKeyService pkService; @Autowired @@ -64,70 +68,201 @@ public class GraphService { @Autowired private EdgeLabelService elService; - public HugeClient client(int connId) { - return this.poolService.getOrCreate(connId); - } - - public GraphView addVertex(int connId, VertexEntity entity) { - HugeClient client = this.client(connId); - Vertex vertex = this.buildVertex(connId, entity); + @Autowired + private UserService userService; + public GraphView addVertex(HugeClient client, VertexEntity entity) { + this.checkParamsValid(client, entity, true); + Vertex vertex = this.buildVertex(client, entity); vertex = client.graph().addVertex(vertex); return GraphView.builder() - .vertices(ImmutableSet.of(vertex)) + .vertices(ImmutableSet.of( + VertexQueryEntity.fromVertex(vertex))) .edges(ImmutableSet.of()) .build(); } - public Vertex updateVertex(int connId, VertexEntity entity) { - HugeClient client = this.client(connId); + public Vertex updateVertex(HugeClient client, String vertexId, VertexEntity entity) { + this.checkParamsValid(client, entity, false); GraphManager graph = client.graph(); - Vertex vertex = this.buildVertex(connId, entity); - // TODO: client should add updateVertex() method - return graph.addVertex(vertex); + Vertex vertex = this.buildVertex(client, entity); + return graph.updateVertexProperty(vertexId, vertex); + } + + public void deleteVertex(HugeClient client, Object vertexId) { + client.graph().deleteVertex(vertexId); } - private Vertex buildVertex(int connId, VertexEntity entity) { + private Vertex buildVertex(HugeClient client, VertexEntity entity) { Vertex vertex = new Vertex(entity.getLabel()); - VertexLabelEntity vl = this.vlService.get(entity.getLabel(), connId); + VertexLabelEntity vl = this.vlService.get(entity.getLabel(), client); // Allowed front-end always pass id if (vl.getIdStrategy().isCustomize()) { Object vid = this.convertVertexId(vl.getIdStrategy(), entity.getId()); vertex.id(vid); } - this.fillProperties(connId, vl, vertex, entity.getProperties()); + this.fillProperties(client, vl, vertex, entity.getProperties()); return vertex; } - public GraphView addEdge(int connId, EdgeEntity entity) { - HugeClient client = this.client(connId); + public GraphView addEdge(HugeClient client, EdgeEntity entity) { + this.checkParamsValid(client, entity, true); GraphManager graph = client.graph(); - EdgeHolder edgeHolder = this.buildEdge(connId, entity); + EdgeHolder edgeHolder = this.buildEdge(client, entity); Edge edge = graph.addEdge(edgeHolder.edge); Vertex source = edgeHolder.source; Vertex target = edgeHolder.target; return GraphView.builder() - .vertices(ImmutableSet.of(source, target)) + .vertices(ImmutableSet.of( + VertexQueryEntity.fromVertex(source), + VertexQueryEntity.fromVertex(target))) .edges(ImmutableSet.of(edge)) .build(); } - public Edge updateEdge(int connId, EdgeEntity entity) { - HugeClient client = this.client(connId); + public void deleteEdge(HugeClient client, String edgeId) { + client.graph().deleteEdge(edgeId); + } + + public Edge updateEdge(HugeClient client, String edgeId, EdgeEntity entity) { + this.checkParamsValid(client, entity, false); GraphManager graph = client.graph(); - EdgeHolder edgeHolder = this.buildEdge(connId, entity); - // TODO: client should add updateEdge() - return graph.addEdge(edgeHolder.edge); + EdgeHolder edgeHolder = this.buildEdge(client, entity); + return graph.updateEdgeProperty(edgeId, edgeHolder.edge); + } + + public HashMap getVertexProperties(HugeClient client, String label) { + VertexLabelEntity vlEntity = this.vlService.get(label, + client); + HashMap vertexPropertiesMap= new HashMap<>(); + vertexPropertiesMap.put("nonNullableProps", vlEntity.getNonNullableProps()); + vertexPropertiesMap.put("NullableProps", vlEntity.getNullableProps()); + vertexPropertiesMap.put("primaryKeys", vlEntity.getPrimaryKeys()); + return vertexPropertiesMap; + } + + public HashMap getEdgeProperties(HugeClient client, String label) { + EdgeLabelEntity elEntity = this.elService.get(label, + client); + HashMap edgePropertiesMap= new HashMap<>(); + edgePropertiesMap.put("nonNullableProps", elEntity.getNonNullableProps()); + edgePropertiesMap.put("NullableProps", elEntity.getNullableProps()); + edgePropertiesMap.put("sortKeys", elEntity.getSortKeys()); + return edgePropertiesMap; + } + + public HashMap getVertexStyle(HugeClient client, List labels) { + HashMap vertexStyles = new HashMap<>(); + for(String label : labels){ + VertexLabelEntity vlEntity = this.vlService.get(label, + client); + vertexStyles.put(label, vlEntity.getStyle()); + } + return vertexStyles; + } + + public HashMap getEdgeStyle(HugeClient client, List labels) { + HashMap edgeStyles = new HashMap<>(); + for(String label : labels){ + EdgeLabelEntity elEntity = this.elService.get(label, + client); + edgeStyles.put(label, elEntity.getStyle()); + } + return edgeStyles; + } + + public GraphView importJson(HugeClient client, MultipartFile jsonFile) throws IOException { + File file = userService.multipartFileToFile(jsonFile); + String content= FileUtils.readFileToString(file, "UTF-8"); + JSONObject jsonObject=new JSONObject(content); + Map edges = new HashMap<>(); + Map vertices = new HashMap<>(); + if (jsonObject.has("vertices")) { + JSONArray verticesArray = jsonObject.getJSONArray("vertices"); + List vertexEntities = JsonUtil.convertList(verticesArray.toString(), VertexEntity.class); + for (VertexEntity entity : vertexEntities) { + this.checkParamsValid(client, entity, true); + Vertex vertex = this.buildVertex(client, entity); + vertex = client.graph().addVertex(vertex); + vertices.put(vertex.id(), vertex); + } + } + if (jsonObject.has("edges")) { + JSONArray edgesArray = jsonObject.getJSONArray("edges"); + List edgeEntities = JsonUtil.convertList(edgesArray.toString(), EdgeEntity.class); + for (EdgeEntity entity : edgeEntities) { + this.checkParamsValid(client, entity, false); + GraphManager graph = client.graph(); + EdgeHolder edgeHolder = this.buildEdge(client, entity); + Edge edge = graph.addEdge(edgeHolder.edge); + Vertex source = edgeHolder.source; + Vertex target = edgeHolder.target; + edges.put(edge.id(), edge); + } + } + return GraphView.builder() + .vertices(VertexQueryEntity.fromVertices(vertices.values())) + .edges(edges.values()) + .build(); + } + + private void checkParamsValid(HugeClient client, VertexEntity entity, + boolean create) { + Ex.check(!StringUtils.isEmpty(entity.getLabel()), + "common.param.cannot-be-null-or-empty", "label"); + // If schema doesn't exist, it will throw exception + VertexLabelEntity vlEntity = this.vlService.get(entity.getLabel(), + client); + IdStrategy idStrategy = vlEntity.getIdStrategy(); + if (create) { + Ex.check(idStrategy.isCustomize(), () -> entity.getId() != null, + "common.param.cannot-be-null", "id"); + } else { + Ex.check(entity.getId() != null, + "common.param.cannot-be-null", "id"); + } + + Set nonNullableProps = vlEntity.getNonNullableProps(); + Map properties = entity.getProperties(); + if (create) { + Ex.check(properties.keySet().containsAll(nonNullableProps), + "graph.vertex.all-nonnullable-prop.should-be-setted"); + } + } + + private void checkParamsValid(HugeClient client, EdgeEntity entity, + boolean create) { + Ex.check(!StringUtils.isEmpty(entity.getLabel()), + "common.param.cannot-be-null-or-empty", "label"); + // If schema doesn't exist, it will throw exception + EdgeLabelEntity elEntity = this.elService.get(entity.getLabel(), client); + if (create) { + Ex.check(entity.getId() == null, + "common.param.must-be-null", "id"); + } else { + Ex.check(entity.getId() != null, + "common.param.cannot-be-null", "id"); + } + Ex.check(entity.getSourceId() != null, + "common.param.must-be-null", "source_id"); + Ex.check(entity.getTargetId() != null, + "common.param.must-be-null", "target_id"); + + Set nonNullableProps = elEntity.getNonNullableProps(); + Map properties = entity.getProperties(); + if (create) { + Ex.check(properties.keySet().containsAll(nonNullableProps), + "graph.edge.all-nonnullable-prop.should-be-setted"); + } } - private EdgeHolder buildEdge(int connId, EdgeEntity entity) { - HugeClient client = this.client(connId); + private EdgeHolder buildEdge(HugeClient client, EdgeEntity entity) { GraphManager graph = client.graph(); - EdgeLabelEntity el = this.elService.get(entity.getLabel(), connId); + EdgeLabelEntity el = this.elService.get(entity.getLabel(), client); VertexLabelEntity sourceVl = this.vlService.get(el.getSourceLabel(), - connId); + client); VertexLabelEntity targetVl = this.vlService.get(el.getTargetLabel(), - connId); + client); Object realSourceId = this.convertVertexId(sourceVl.getIdStrategy(), entity.getSourceId()); Object realTargetId = this.convertVertexId(targetVl.getIdStrategy(), @@ -144,7 +279,7 @@ private EdgeHolder buildEdge(int connId, EdgeEntity entity) { Edge edge = new Edge(entity.getLabel()); edge.source(sourceVertex); edge.target(targetVertex); - this.fillProperties(connId, el, edge, entity.getProperties()); + this.fillProperties(client, el, edge, entity.getProperties()); return new EdgeHolder(edge, sourceVertex, targetVertex); } @@ -159,10 +294,9 @@ private Object convertVertexId(IdStrategy idStrategy, String rawId) { } } - private void fillProperties(int connId, SchemaLabelEntity schema, + private void fillProperties(HugeClient client, SchemaLabelEntity schema, GraphElement element, Map properties) { - HugeClient client = this.client(connId); for (Map.Entry entry : properties.entrySet()) { String key = entry.getKey(); Object rawValue = entry.getValue(); @@ -173,7 +307,7 @@ private void fillProperties(int connId, SchemaLabelEntity schema, continue; } } - PropertyKeyEntity pkEntity = this.pkService.get(key, connId); + PropertyKeyEntity pkEntity = this.pkService.get(key, client); PropertyKey propertyKey = PropertyKeyService.convert(pkEntity, client); assert propertyKey != null; @@ -181,6 +315,9 @@ private void fillProperties(int connId, SchemaLabelEntity schema, try { // DataTypeUtil.convert in loader need param InputSource FileSource source = new FileSource(); + List extraDateFormats = new ArrayList<>(); + extraDateFormats.add("yyyy-MM-dd HH:mm:ss.SSS"); + //source.extraDateFormats(extraDateFormats);//TODO C Deleted ListFormat listFormat = new ListFormat("", "", ","); source.listFormat(listFormat); value = DataTypeUtil.convert(rawValue, propertyKey, source); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graphs/GraphsService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graphs/GraphsService.java new file mode 100644 index 000000000..c07db4d73 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graphs/GraphsService.java @@ -0,0 +1,666 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.graphs; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.time.StopWatch; +import org.apache.hugegraph.client.RestClient; +import org.apache.hugegraph.api.graph.GraphMetricsAPI; +// TODO fix import +//import org.apache.hugegraph.client.api.graph.GraphMetricsAPI; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.controller.query.GremlinController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.GraphConnection; +import org.apache.hugegraph.entity.enums.AsyncTaskStatus; +import org.apache.hugegraph.entity.enums.ExecuteStatus; +import org.apache.hugegraph.entity.enums.ExecuteType; +import org.apache.hugegraph.entity.graphs.GraphStatisticsEntity; +import org.apache.hugegraph.entity.query.ExecuteHistory; +import org.apache.hugegraph.entity.query.GremlinQuery; +import org.apache.hugegraph.entity.space.BuiltInEntity; +import org.apache.hugegraph.loader.util.JsonUtil; +import org.apache.hugegraph.service.algorithm.AsyncTaskService; +import org.apache.hugegraph.service.auth.UserService; +import org.apache.hugegraph.service.load.LoadTaskService; +import org.apache.hugegraph.service.query.ExecuteHistoryService; +import org.apache.hugegraph.service.query.QueryService; +import org.apache.hugegraph.service.schema.SchemaService; +import org.apache.hugegraph.structure.Task; +import org.apache.hugegraph.structure.constant.GraphReadMode; +import org.apache.hugegraph.structure.gremlin.ResultSet; +import org.apache.hugegraph.util.Ex; +import org.apache.hugegraph.util.HubbleUtil; +import org.apache.hugegraph.util.PageUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static org.apache.hugegraph.util.GremlinUtil.GREMLIN_LOAD_HLM; + +@Log4j2 +@Service +public class GraphsService { + + @Autowired + private SchemaService schemaService; + + @Autowired + UserService userService; + @Autowired + private QueryService queryService; + @Autowired + private ExecuteHistoryService historyService; + @Autowired + private AsyncTaskService asyncTaskService; + @Autowired + private LoadTaskService loadTaskService; + @Autowired + private org.apache.hugegraph.config.HugeConfig config; + + private static final String GRAPH_STORAGE = "v1/graph/%s/%s/g"; + private static final String RUNNING_TASKS = "running_tasks"; + private static final String STATISTICS = "statistics"; + private static final String GREMLIN_STATISTICS_VERTEX = + "g.V().groupCount().by(label)"; + private static final String GREMLIN_STATISTICS_EDGE = + "g.E().groupCount().by(label)"; + private static final String GRAPH_HLM = "hlm"; + private static final String GRAPH_COVID19 = "covid19"; + + private final ConcurrentHashMap> graphStatistics = + new ConcurrentHashMap<>(); + + public Map get(HugeClient client, String graphSpace, + String graph, + Map vermeerInfo) { +// long storage = getStorage(pdClient, graphSpace, graph); + Map info = new HashMap<>(); + info.putAll(client.graphs().getGraph(graph)); +// info.put("storage", storage); + // Ensure nickname/graphspace fields exist for frontend display + info.putIfAbsent("nickname", graph); + info.putIfAbsent("graphspace", graphSpace); + if (vermeerInfo.size() != 0) { + info.put("status", vermeerInfo.get("status")); + String lastLoadTime = vermeerInfo.get("update_time"); + // todo date format + info.put("last_load_time", lastLoadTime); + } + return info; + } + + public IPage> queryPage(HugeClient client, + String graphSpace, String uid, + String query, String createTime, + int pageNo, int pageSize, + boolean isVermeerEnabled, + Map vermeerInfo) { + List> results = + sortedGraphsProfile(client, graphSpace, query, createTime, + isVermeerEnabled, vermeerInfo); + + for(Map result : results) { + String graph = result.get("name").toString(); + try { + result.put("schemaview", schemaService.getSchemaView( + client.assignGraph(graphSpace, graph))); + } catch (Exception e) { + e.printStackTrace(); + log.info("Schema exception with graph '{}'", graph); + } + } + + return PageUtil.page(results, pageNo, pageSize); + } + + public List> sortedGraphsProfile(HugeClient client, + String graphSpace, + String query, + String createTime, + boolean isVermeerEnabled, + Map vermeerInfo) { + // Get authorized graphs + List> graphs = client.graphs().listProfile(query); + log.info("Query all graphs in '{}' ", graphSpace); + for (Map info : graphs) { + String name = info.get("name").toString(); + // delete pd.peers info for security + info.put("pd.peers", ""); + if (vermeerInfo.containsKey(name)) { + Map brief = + (Map) vermeerInfo.get(name); + info.put("status", brief.get("status").toString()); + info.put("last_load_time", + brief.get("last_load_time").toString()); + } else if (isVermeerEnabled) { + // default info for non-loaded graph + info.put("status", "created"); + info.put("last_load_time", ""); + } else { + info.put("status", ""); + info.put("last_load_time", ""); + } + + info.put("storage", info.get("data_size")); + // Ensure graphspace field is present for frontend navigation + info.putIfAbsent("graphspace", graphSpace); + info.putIfAbsent("graphspace_nickname", graphSpace); + info.put("statistic", evCount(client, graphSpace, name)); + } + + List> results = + graphs.stream() + .filter((s) -> { + Object createTimeVal = s.get("create_time"); + // In standalone mode, create_time may be absent + if (createTimeVal == null) { + return true; + } + return createTimeVal.toString() + .compareTo(createTime) > 0; + }) + .sorted((graph1, graph2) -> { + Object d1 = graph1.get("default"); + Object d2 = graph2.get("default"); + boolean default1 = d1 instanceof Boolean && (boolean) d1; + boolean default2 = d2 instanceof Boolean && (boolean) d2; + + if (default1 != default2) { + return Boolean.compare(default2, default1); + } else if (default1) { + Object t1 = graph1.get("default_update_time"); + Object t2 = graph2.get("default_update_time"); + if (t1 instanceof Long && t2 instanceof Long) { + return ((Long) t1).compareTo((Long) t2); + } + return 0; + } else { + String name1 = graph1.get("name").toString(); + String name2 = graph2.get("name").toString(); + return name1.compareTo(name2); + } + }) + .collect(Collectors.toList()); + return results; + + } + + public Set listGraphNames(HugeClient client, String graphSpace, + String uid) { + + return ImmutableSet.copyOf(client.graphs().listGraph()); + } + + @Deprecated + public Map create(HugeClient client, String graph, + boolean isAuth, String schemaTemplate) { + Map conf = new HashMap<>(); + if (isAuth) { + conf.put("gremlin.graph", + "com.baidu.hugegraph.auth.HugeFactoryAuthProxy"); + + } else { + conf.put("gremlin.graph", "com.baidu.hugegraph.HugeFactory"); + } + if (!StringUtils.isEmpty(schemaTemplate)) { + conf.put("schema.init_template", schemaTemplate); + } + + conf.put("store", graph); + boolean pdEnabled = config.get(org.apache.hugegraph.options.HubbleOptions.PD_ENABLED); + if (pdEnabled) { + conf.put("backend", "hstore"); + } else { + conf.put("backend", "rocksdb"); + } + conf.put("serializer", "binary"); + + return client.graphs().createGraph(graph, JsonUtil.toJson(conf)); + } + + public Map create(HugeClient client, String nickname, + String graph, String schemaTemplate) { + Map conf = new HashMap<>(); + + conf.put("store", graph); + boolean pdEnabled = config.get(org.apache.hugegraph.options.HubbleOptions.PD_ENABLED); + if (pdEnabled) { + conf.put("backend", "hstore"); + conf.put("task.scheduler_type", "distributed"); + } else { + conf.put("backend", "rocksdb"); + conf.put("task.scheduler_type", "local"); + } + conf.put("serializer", "binary"); + conf.put("nickname", nickname); + + if (StringUtils.isNotEmpty(schemaTemplate)) { + conf.put("schema.init_template", schemaTemplate); + } + + return client.graphs().createGraph(graph, JsonUtil.toJson(conf)); + } + + public void update(HugeClient client, String nickname, + String graph) { + client.graphs().update(graph, nickname); + } + + public void truncate(HugeClient client, String graph, + boolean isClearSchema, boolean isClearData) { + // TODO client do not support clear Schema field. Check here + if (isClearSchema) { + client.graphs().clearGraph(graph,"I'm sure to delete all data"); + } + else if (isClearData) { + client.graphs().clearGraph(graph, "I'm sure to delete all data"); + } + } + + public void setDefault(HugeClient client, String graph) { + client.graphs().setDefault(graph); + } + + public void unSetDefault(HugeClient client, String graph) { + client.graphs().unSetDefault(graph); + } + + public Map getDefault(HugeClient client) { + return client.graphs().getDefault(); + } + + public void delete(HugeClient client, String graph, String confirmMessage) { + // TODO check if frontend support passing confirm message. + client.graphs().dropGraph(graph,confirmMessage); + } + + public GraphReadMode graphReadMode(HugeClient client, String graph) { + return client.graphs().readMode(graph); + } + + public void graphReadMode(HugeClient client, String graph, String mode) { + this.checkReadMode(mode); + // open(0) means mode equal all, close(1) means mode equal OLTP_ONLY + if ("0".equals(mode)) {client.graphs().readMode(graph, GraphReadMode.ALL); + } + else if ("1".equals(mode)){ + client.graphs().readMode(graph, GraphReadMode.OLTP_ONLY); + } + } + + public void checkReadMode(String mode) { + Ex.check("0".equals(mode) || "1".equals(mode), + "common.read_mode.invalid", mode); + } + + public Object clone(HugeClient client, Map params) { + return ImmutableMap.of("task_id", + client.graphs().clone(client.getGraphName(), + params)); + } + + public static long getStorage(RestClient pdClient, + String graphSpace, + String graph) { + if (pdClient == null) { + return 0L; + } + String path = String.format("v1/graph/%s/%s/g", graphSpace, graph); + Map result; + try { + result = pdClient.get(path).readObject(Map.class); + Map data = (Map) result.get("data"); + if (data.containsKey("dataSize")) { + long dataSize = Long.valueOf(data.get("dataSize").toString()); + return dataSize; + } else { + return 0L; + } + } catch (Exception e) { + log.info("Fail to request pd to get data of graph {}-{} : {}", + graphSpace, graph, e.getMessage()); + return -1L; + } + } + + public static boolean isBigGraph(RestClient pdClient, String graphSpace, + String graph) { + return isBigStorage(getStorage(pdClient, graphSpace, graph)); + } + + public static boolean isBigStorage(long storageKb) { + return (storageKb > (2 * 1024 * 1024)); + } + + public static String getStatisticsKey(String graphSpace, String graph) { + return graphSpace + "-" + graph; + } + + public GraphStatisticsEntity getStatistics( // RestClient pdClient, + HugeClient client, + String graphSpace, + String graph) { +// long storage = getStorage(pdClient, graphSpace, graph); +// boolean isBig = isBigStorage(storage); +// GraphStatisticsEntity result; +// if (isBig) { +// result = getLastStatistics(client, graphSpace, graph); +// } else { +// this.graphStatistics.clear(); +// result = postSmallStatistics(client, graphSpace, graph); +// } +// result.setStorage(storage); + + GraphStatisticsEntity result; + this.graphStatistics.clear(); + result = postSmallStatistics(client, graphSpace, graph); + + return result; + } + + public void postStatistics(RestClient pdClient, + HugeClient client, + String graphSpace, + String graph) { + if (isBigGraph(pdClient, graphSpace, graph)) { + GremlinQuery query = new GremlinQuery(GREMLIN_STATISTICS_VERTEX); + long vid = executeAsyncTask(client, graphSpace, graph, query); + query.setContent(GREMLIN_STATISTICS_EDGE); + long eid = executeAsyncTask(client, graphSpace, graph, query); + String idPair = String.valueOf(vid) + "-" + String.valueOf(eid); + String graphKey = getStatisticsKey(graphSpace, graph); + if (this.graphStatistics.containsKey(graphKey)) { + Map graphCache = + (Map) this.graphStatistics.get(graphKey); + if (graphCache.get(RUNNING_TASKS) != null) { + List idPairs = + (List) graphCache.get(RUNNING_TASKS); + idPairs.add(idPair); + return ; + } + } + List idPairs = new ArrayList<>(); + idPairs.add(idPair); + Map graphCache = new HashMap<>(2); + graphCache.put(RUNNING_TASKS, idPairs); + graphCache.put(STATISTICS, GraphStatisticsEntity.emptyEntity()); + this.graphStatistics.put(graphKey, graphCache); + } + } + + public GraphStatisticsEntity getLastStatistics(HugeClient client, + String graphSpace, + String graph) { + // used for big graph + String graphKey = getStatisticsKey(graphSpace, graph); + if (!this.graphStatistics.containsKey(graphKey)) { + // check graph statistics for the first time + return GraphStatisticsEntity.emptyEntity(); + } + + Map graphCache = + (Map) this.graphStatistics.get(graphKey); + if (graphCache.get(RUNNING_TASKS) != null) { + List idPairs = + (List) graphCache.get(RUNNING_TASKS); + List idList = new ArrayList<>(idPairs.size() * 2); + for (String idPair: idPairs) { + String[] idVE = idPair.split("-"); + idList.add(Long.valueOf(idVE[0])); + idList.add(Long.valueOf(idVE[1])); + } + List tasks = asyncTaskService.list(client, idList); + idList.clear(); + + Map taskMap = new HashMap<>(tasks.size()); + for (Task task: tasks) { + taskMap.put(String.valueOf(task.id()), task); + } + + List removeIds = new ArrayList<>(); + Task lastV = null; + Task lastE = null; + boolean init = true; + for (String idPair: idPairs) { + String[] idVE = idPair.split("-"); + Task taskV = taskMap.get(idVE[0]); + Task taskE = taskMap.get(idVE[1]); + boolean success = taskV.success() && taskE.success(); + if (removable(taskV) || removable(taskE) || success) { + removeIds.add(idPair); + } + + if (success) { + // try to find last updated task + if (init) { + lastV = taskV; + lastE = taskE; + init = false; + } + if (lastV.updateTime() <= taskV.updateTime() && + lastE.updateTime() <= taskE.updateTime()) { + lastV = taskV; + lastE = taskE; + } + } + } + + idPairs.removeAll(removeIds); + removeIds.clear(); + taskMap.clear(); + + GraphStatisticsEntity result; + if (!init) { + result = updateCacheFromTask(client, lastV, lastE); + } else { + result = GraphStatisticsEntity.emptyEntity(); + } + graphCache.put(STATISTICS, result); + return result; + } else if (graphCache.get(STATISTICS) != null) { + return (GraphStatisticsEntity) graphCache.get(STATISTICS); + } else { + GraphStatisticsEntity result = GraphStatisticsEntity.emptyEntity(); + graphCache.put(STATISTICS, result); + return result; + } + } + + public static boolean removable(Task task) { + return task.completed() && !task.success(); + } + + public GraphStatisticsEntity updateCacheFromTask(HugeClient client, + Task taskV, Task taskE) { + GraphStatisticsEntity result = new GraphStatisticsEntity(); + taskV = asyncTaskService.get(client, + Integer.valueOf( + String.valueOf(taskV.id()))); + List> results = + (List>) + JsonUtil.fromJson(taskV.result().toString(), + List.class); + result.setVertices(results.get(0)); + result.setVertexCount(getCountFromLabels(results.get(0))); + + taskE = asyncTaskService.get(client, + Integer.valueOf( + String.valueOf(taskE.id()))); + results = (List>) + JsonUtil.fromJson(taskE.result().toString(), List.class); + result.setEdges(results.get(0)); + result.setEdgeCount(getCountFromLabels(results.get(0))); + result.setUpdateTime(HubbleUtil.dateFormat()); + return result; + } + + public GraphStatisticsEntity postSmallStatistics(HugeClient client, + String graphSpace, + String graph) { + GraphStatisticsEntity result = GraphStatisticsEntity.emptyEntity(); + ResultSet vertexResult = + queryService.executeQueryCount(client, + GREMLIN_STATISTICS_VERTEX); + ResultSet edgeResult = + queryService.executeQueryCount(client, + GREMLIN_STATISTICS_EDGE); + if (vertexResult.data() != null && vertexResult.data().size() != 0) { + Map vertices = + (Map) vertexResult.data().get(0); + result.setVertices(vertices); + result.setVertexCount(getCountFromLabels(vertices)); + } + if (edgeResult.data() != null && edgeResult.data().size() != 0) { + Map edges = + (Map) edgeResult.data().get(0); + result.setEdges(edges); + result.setEdgeCount(getCountFromLabels(edges)); + } + result.setUpdateTime(HubbleUtil.dateFormat()); + return result; + } + + public String getCountFromLabels(Map labels) { + Integer count = 0; + for (Map.Entry entry: labels.entrySet()) { + count += (Integer) entry.getValue(); + } + return count.toString(); + } + + + public long executeAsyncTask(HugeClient client, String graphSpace, + String graph, GremlinQuery query) { + this.checkParamsValid(query); + + Date createTime = HubbleUtil.nowDate(); + // Insert execute history + ExecuteStatus status = ExecuteStatus.ASYNC_TASK_RUNNING; + ExecuteHistory history; + history = new ExecuteHistory(null, graphSpace, graph, 0L, + ExecuteType.GREMLIN_ASYNC, + query.getContent(), status, + AsyncTaskStatus.UNKNOWN, -1L, createTime); + this.historyService.save(history); + + StopWatch timer = StopWatch.createStarted(); + long asyncId = 0L; + try { + asyncId = this.queryService.executeGremlinAsyncTask(client, query); + status = ExecuteStatus.ASYNC_TASK_SUCCESS; + return asyncId; + } catch (Throwable e) { + status = ExecuteStatus.ASYNC_TASK_FAILED; + throw e; + } finally { + timer.stop(); + long duration = timer.getTime(TimeUnit.MILLISECONDS); + history.setStatus(status); + history.setDuration(duration); + history.setAsyncId(asyncId); + this.historyService.update(history); + } + } + + private void checkParamsValid(GremlinQuery query) { + Ex.check(!org.apache.commons.lang3.StringUtils.isEmpty(query.getContent()), + "common.param.cannot-be-null-or-empty", + "gremlin-query.content"); + GremlinController.checkContentLength(query.getContent()); + } + + public void initBuiltIn(HugeClient client, GraphConnection connection, + BuiltInEntity entity) { + List graphs = client.graphs().listGraph(); + if (entity.initHlm) { + initHlm(client, graphs.contains(GRAPH_HLM)); + } + + client.assignGraph(Constant.BUILT_IN, null); + if (entity.initCovid19) { + connection.setGraph(GRAPH_COVID19); + initCovid19(client, graphs.contains(GRAPH_COVID19), connection); + } + } + + public void initHlm(HugeClient client, boolean exist) { + if (!exist) { + this.create(client, "红楼梦", GRAPH_HLM, null); + } else { + this.update(client, "红楼梦", GRAPH_HLM); + this.truncate(client, GRAPH_HLM, true, false); + } + + GremlinQuery query = new GremlinQuery(GREMLIN_LOAD_HLM); + client.assignGraph(Constant.BUILT_IN, GRAPH_HLM); + this.queryService.executeGremlinQuery(client, query); + } + + public void initCovid19(HugeClient client, boolean exist, + GraphConnection connection) { + if (!exist) { + this.create(client, "新冠患者轨迹追溯", GRAPH_COVID19, null); + } else { + this.update(client, "新冠患者轨迹追溯", GRAPH_COVID19); + this.truncate(client, GRAPH_COVID19, true, false); + } + + // todo load data + loadTaskService.startCovid19(connection, Constant.BUILT_IN, + GRAPH_COVID19, client); + } + + /** + * 统计指定单个图中的顶点总数和边总数 + */ + public Map evCount(HugeClient client, + String graphSpace, + String graph) { + Map res = new HashMap<>(); + long edgeCount = 0L; + long vertexCount = 0L; + String statisticDate = HubbleUtil.dateFormatDay(HubbleUtil.nowDate()); + client.assignGraph(graphSpace, graph); + GraphMetricsAPI.ElementCount statistic = + client.graph().getEVCount(statisticDate); + if (statistic == null) { + statisticDate = HubbleUtil.dateFormatLastDay(); + statistic = client.graph().getEVCount(statisticDate); + } + + if (statistic != null) { + vertexCount = statistic.getVertices(); + edgeCount += statistic.getEdges(); + } + + res.put("date", statisticDate); + res.put("vertex", vertexCount); + res.put("edge", edgeCount); + return res; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/license/LicenseService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/license/LicenseService.java index 72bb57153..c3ba79a0e 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/license/LicenseService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/license/LicenseService.java @@ -16,177 +16,180 @@ * under the License. */ -package org.apache.hugegraph.service.license; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.hugegraph.driver.HugeClient; -import org.apache.hugegraph.entity.GraphConnection; -import org.apache.hugegraph.handler.MessageSourceHandler; -import org.apache.hugegraph.service.GraphConnectionService; -import org.apache.hugegraph.service.HugeClientPoolService; -import org.apache.hugegraph.util.Ex; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Async; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Service -public class LicenseService { - - private static final String METRICS_DATA_SIZE = "data_size"; - - @Autowired - private GraphConnectionService connService; - @Autowired - private HugeClientPoolService poolService; - @Autowired - private MessageSourceHandler messageHandler; - - @Data - @AllArgsConstructor - public class VerifyResult { - - private final boolean enabled; - private final String graphsMessage; - private final List dataSizeMessages; - - public VerifyResult(boolean enabled) { - this(enabled, null); - } - - public VerifyResult(boolean enabled, String graphsMessage) { - this.enabled = enabled; - this.graphsMessage = graphsMessage; - this.dataSizeMessages = new ArrayList<>(); - } - - public void add(String disableReason) { - this.dataSizeMessages.add(disableReason); - } - - public String getMessage() { - if (this.enabled) { - return null; - } - - String comma = LicenseService.this.getMessage("common.joiner.comma"); - String semicolon = LicenseService.this.getMessage( - "common.joiner.semicolon"); - - StringBuilder sb = new StringBuilder(); - sb.append(LicenseService.this.getMessage( - "license.verify.graph-connection.failed.preifx")); - sb.append(comma); - if (!StringUtils.isEmpty(this.graphsMessage)) { - sb.append(this.graphsMessage); - sb.append(semicolon); - } - if (!this.dataSizeMessages.isEmpty()) { - for (String dataSizeMsg : this.dataSizeMessages) { - if (!StringUtils.isEmpty(dataSizeMsg)) { - sb.append(dataSizeMsg); - sb.append(comma); - } - } - } - sb.deleteCharAt(sb.length() - 1); - sb.append(comma); - sb.append(LicenseService.this.getMessage( - "license.verify.graph-connection.failed.suffix")); - return sb.toString(); - } - } - - public VerifyResult verifyGraphs(int actualGraphs) { - return new VerifyResult(true); - } - - @Async - @Scheduled(fixedRate = 3 * 60 * 1000) - public void updateAllGraphStatus() { - List connections = this.connService.listAll(); - for (GraphConnection conn : connections) { - this.updateGraphStatus(conn); - } - } - - private void updateGraphStatus(GraphConnection conn) { - HugeClient client; - try { - client = this.poolService.getOrCreate(conn.getId()); - } catch (Exception e) { - String msg = this.getMessage("graph-connection.client.unavailable", - conn.getName()); - conn.setEnabled(false); - conn.setDisableReason(msg); - this.connService.update(conn); - return; - } - - conn.setEnabled(true); - conn.setDisableReason(""); - this.connService.update(conn); - } - - private String getMessage(String msgKey, Object... args) { - return this.messageHandler.getMessage(msgKey, args); - } - - /** - * Keep 2 method for future use now - */ - private static long getActualDataSize(HugeClient client, String graph) { - Map metrics = client.metrics().backend(graph); - Object dataSize = metrics.get(METRICS_DATA_SIZE); - if (dataSize == null) { - return 0L; - } - Ex.check(dataSize instanceof String, - "The backend metrics data_size must be String type, " + - "but got '%s'(%s)", dataSize, dataSize.getClass()); - // Unit is MB - return displaySizeToMB((String) dataSize); - } - - private static long displaySizeToMB(String displaySize) { - String[] parts = displaySize.split(" "); - Ex.check(parts.length == 2, - "The displaySize must be formatted as two parts"); - long numberPart = Long.parseLong(parts[0]); - long byteCount = 0L; - switch (parts[1]) { - case "bytes": - byteCount = numberPart; - break; - case "KB": - byteCount = numberPart * FileUtils.ONE_KB; - break; - case "MB": - byteCount = numberPart * FileUtils.ONE_MB; - break; - case "GB": - byteCount = numberPart * FileUtils.ONE_GB; - break; - case "TB": - byteCount = numberPart * FileUtils.ONE_TB; - break; - case "PB": - byteCount = numberPart * FileUtils.ONE_PB; - break; - case "EB": - byteCount = numberPart * FileUtils.ONE_EB; - break; - default: - break; - } - return byteCount / FileUtils.ONE_MB; - } -} +package org.apache.hugegraph.service.license;///* +// * Copyright 2017 HugeGraph Authors +// * +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with this +// * work for additional information regarding copyright ownership. The ASF +// * licenses this file to You under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// * License for the specific language governing permissions and limitations +// * under the License. +// */ +// // TODO C Remove Licence +//package org.apache.hugegraph.service.license; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Map; +// +//import org.apache.commons.io.FileUtils; +//import org.apache.commons.lang3.StringUtils; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Service; +// +//import org.apache.hugegraph.common.Constant; +//import org.apache.hugegraph.driver.HugeClient; +//import org.apache.hugegraph.handler.MessageSourceHandler; +////import org.apache.hugegraph.license.LicenseVerifier; // TODO C Remove Licence +//import org.apache.hugegraph.util.Ex; +// +//import lombok.AllArgsConstructor; +//import lombok.Data; +// +//@Service +//public class LicenseService { +// +// private static final String METRICS_DATA_SIZE = "data_size"; +// +// @Autowired +// private MessageSourceHandler messageHandler; +// +// @Data +// @AllArgsConstructor +// public class VerifyResult { +// +// private boolean enabled; +// private String graphsMessage; +// private List dataSizeMessages; +// +// public VerifyResult(boolean enabled) { +// this(enabled, null); +// } +// +// public VerifyResult(boolean enabled, String graphsMessage) { +// this.enabled = enabled; +// this.graphsMessage = graphsMessage; +// this.dataSizeMessages = new ArrayList<>(); +// } +// +// public void add(String disableReason) { +// this.dataSizeMessages.add(disableReason); +// } +// +// public String getMessage() { +// if (this.enabled) { +// return null; +// } +// +// String comma = LicenseService.this.getMessage("common.joiner.comma"); +// String semicolon = LicenseService.this.getMessage( +// "common.joiner.semicolon"); +// +// StringBuilder sb = new StringBuilder(); +// sb.append(LicenseService.this.getMessage( +// "license.verify.graph-connection.failed.preifx")); +// sb.append(comma); +// if (!StringUtils.isEmpty(this.graphsMessage)) { +// sb.append(this.graphsMessage); +// sb.append(semicolon); +// } +// if (!this.dataSizeMessages.isEmpty()) { +// for (String dataSizeMsg : this.dataSizeMessages) { +// if (!StringUtils.isEmpty(dataSizeMsg)) { +// sb.append(dataSizeMsg); +// sb.append(comma); +// } +// } +// } +// sb.deleteCharAt(sb.length() - 1); +// sb.append(comma); +// sb.append(LicenseService.this.getMessage( +// "license.verify.graph-connection.failed.suffix")); +// return sb.toString(); +// } +// } +// +// public VerifyResult verifyGraphs(int actualGraphs) { +// int allowedGraphs = LicenseVerifier.instance().allowedGraphs(); +// if (allowedGraphs != Constant.NO_LIMIT && +// actualGraphs > allowedGraphs) { +// String msg = this.getMessage("license.verify.graphs.exceed", +// actualGraphs, allowedGraphs); +// return new VerifyResult(false, msg); +// } else { +// return new VerifyResult(true); +// } +// } +// +// public VerifyResult verifyDataSize(HugeClient client, String name, +// String graph) { +// long allowedDataSize = LicenseVerifier.instance().allowedDataSize(); +// long actualDataSize = getActualDataSize(client, graph); +// if (allowedDataSize != Constant.NO_LIMIT && +// actualDataSize > allowedDataSize) { +// String msg = this.getMessage("license.verify.datasize.exceed", +// name, actualDataSize, allowedDataSize); +// return new VerifyResult(false, msg); +// } else { +// return new VerifyResult(true); +// } +// } +// +// private String getMessage(String msgKey, Object... args) { +// return this.messageHandler.getMessage(msgKey, args); +// } +// +// private static long getActualDataSize(HugeClient client, String graph) { +// Map metrics = client.metrics().backend(graph); +// Object dataSize = metrics.get(METRICS_DATA_SIZE); +// if (dataSize == null) { +// return 0L; +// } +// Ex.check(dataSize instanceof String, +// "The backend metrics data_size must be String type, " + +// "but got '%s'(%s)", dataSize, dataSize.getClass()); +// // Unit is MB +// return displaySizeToMB((String) dataSize); +// } +// +// private static long displaySizeToMB(String displaySize) { +// String[] parts = displaySize.split(" "); +// Ex.check(parts.length == 2, +// "The displaySize must be formatted as two parts"); +// long numberPart = Long.parseLong(parts[0]); +// long byteCount = 0L; +// switch (parts[1]) { +// case "bytes": +// byteCount = numberPart; +// break; +// case "KB": +// byteCount = numberPart * FileUtils.ONE_KB; +// break; +// case "MB": +// byteCount = numberPart * FileUtils.ONE_MB; +// break; +// case "GB": +// byteCount = numberPart * FileUtils.ONE_GB; +// break; +// case "TB": +// byteCount = numberPart * FileUtils.ONE_TB; +// break; +// case "PB": +// byteCount = numberPart * FileUtils.ONE_PB; +// break; +// case "EB": +// byteCount = numberPart * FileUtils.ONE_EB; +// break; +// } +// return byteCount / FileUtils.ONE_MB; +// } +//} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/GraphConnectionService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/DatasourceService.java similarity index 56% rename from hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/GraphConnectionService.java rename to hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/DatasourceService.java index 0889b666c..62dc3a4f1 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/GraphConnectionService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/DatasourceService.java @@ -1,5 +1,4 @@ /* - * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this * work for additional information regarding copyright ownership. The ASF @@ -16,67 +15,45 @@ * under the License. */ -package org.apache.hugegraph.service; - -import java.util.List; +package org.apache.hugegraph.service.load; -import org.apache.hugegraph.entity.GraphConnection; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.hugegraph.entity.load.Datasource; import org.apache.hugegraph.exception.InternalException; -import org.apache.hugegraph.mapper.GraphConnectionMapper; -import org.apache.hugegraph.util.SQLUtil; +import org.apache.hugegraph.mapper.load.DatasourceMapper; +import org.apache.hugegraph.util.HubbleUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.StringUtils; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @Service -public class GraphConnectionService { +public class DatasourceService { @Autowired - private GraphConnectionMapper mapper; + private DatasourceMapper mapper; - public List listAll() { - return this.mapper.selectList(null); - } - - public IPage list(String content, long current, - long pageSize) { - IPage page = new Page<>(current, pageSize); - if (!StringUtils.isEmpty(content)) { - String value = SQLUtil.escapeLike(content); - return this.mapper.selectByContentInPage(page, value); - } else { - QueryWrapper query = Wrappers.query(); - query.orderByDesc("create_time"); - return this.mapper.selectPage(page, query); - } - } - - public GraphConnection get(int id) { + public Datasource get(int id) { return this.mapper.selectById(id); } - public int count() { - return this.mapper.selectCount(null); - } - - @Transactional(isolation = Isolation.READ_COMMITTED) - public void save(GraphConnection connection) { - if (this.mapper.insert(connection) != 1) { - throw new InternalException("entity.insert.failed", connection); + public IPage list(int pageNo, int pageSize, String query) { + QueryWrapper wrapper = Wrappers.query(); + if (query != null && !query.isEmpty()) { + wrapper.like("datasource_name", query); } + wrapper.orderByDesc("create_time"); + return this.mapper.selectPage(new Page<>(pageNo, pageSize), wrapper); } @Transactional(isolation = Isolation.READ_COMMITTED) - public void update(GraphConnection connection) { - if (this.mapper.updateById(connection) != 1) { - throw new InternalException("entity.update.failed", connection); + public void save(Datasource entity) { + entity.setCreateTime(HubbleUtil.nowDate()); + if (this.mapper.insert(entity) != 1) { + throw new InternalException("entity.insert.failed", entity); } } @@ -86,4 +63,9 @@ public void remove(int id) { throw new InternalException("entity.delete.failed", id); } } + + @Transactional(isolation = Isolation.READ_COMMITTED) + public void removeBatch(java.util.List ids) { + this.mapper.deleteBatchIds(ids); + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/FileMappingService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/FileMappingService.java index f174c890c..8ddb36692 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/FileMappingService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/FileMappingService.java @@ -46,6 +46,14 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.entity.enums.FileMappingStatus; import org.apache.hugegraph.entity.load.FileMapping; @@ -59,14 +67,6 @@ import org.apache.hugegraph.util.Ex; import org.apache.hugegraph.util.HubbleUtil; import org.apache.hugegraph.util.StringUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Async; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Isolation; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -103,9 +103,11 @@ public FileMapping get(int id) { return this.mapper.selectById(id); } - public FileMapping get(int connId, int jobId, String fileName) { + public FileMapping get(String graphSpace, String graph, int jobId, + String fileName) { QueryWrapper query = Wrappers.query(); - query.eq("conn_id", connId) + query.eq("graphspace", graphSpace) + .eq("graph", graph) .eq("job_id", jobId) .eq("name", fileName); return this.mapper.selectOne(query); @@ -121,9 +123,11 @@ public List listByJob(int jobId) { return this.mapper.selectList(query); } - public IPage list(int connId, int jobId, int pageNo, int pageSize) { + public IPage list(String graphSpace, String graph, int jobId, + int pageNo, int pageSize) { QueryWrapper query = Wrappers.query(); - query.eq("conn_id", connId); + query.eq("graphspace", graphSpace); + query.eq("graph", graph); query.eq("job_id", jobId); query.eq("file_status", FileMappingStatus.COMPLETED.getValue()); query.orderByDesc("create_time"); @@ -230,7 +234,7 @@ public boolean tryMergePartFiles(String dirPath, int total) { log.error("Failed to copy file stream from {} to {}", partFile, newFile, e); throw new InternalException( - "load.upload.merge-file.failed", e); + "load.upload.merge-file.failed", e); } } } catch (IOException e) { @@ -315,7 +319,7 @@ public String moveToNextLevelDir(FileMapping mapping) { } catch (IOException e) { this.remove(mapping.getId()); throw new InternalException( - "Failed to move file to next level directory"); + "Failed to move file to next level directory"); } return Paths.get(destPath, currFile.getName()).toString(); } @@ -354,7 +358,7 @@ public void deleteUnfinishedFile() { query.in("file_status", FileMappingStatus.UPLOADING.getValue()); List mappings = this.mapper.selectList(query); long threshold = this.config.get( - HubbleOptions.UPLOAD_FILE_MAX_TIME_CONSUMING) * 1000; + HubbleOptions.UPLOAD_FILE_MAX_TIME_CONSUMING) * 1000; Date now = HubbleUtil.nowDate(); for (FileMapping mapping : mappings) { Date updateTime = mapping.getUpdateTime(); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/JobManagerService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/JobManagerService.java index eb085c390..0c864a54b 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/JobManagerService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/JobManagerService.java @@ -22,6 +22,13 @@ import java.util.Date; import java.util.List; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.ImmutableMap; +import lombok.extern.log4j.Log4j2; + import org.apache.hugegraph.entity.enums.JobStatus; import org.apache.hugegraph.entity.enums.LoadStatus; import org.apache.hugegraph.entity.load.FileMapping; @@ -38,13 +45,6 @@ import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; - -import lombok.extern.log4j.Log4j2; - @Log4j2 @Service public class JobManagerService { @@ -64,20 +64,24 @@ public JobManager get(int id) { return this.mapper.selectById(id); } - public JobManager getTask(String jobName, int connId) { + public JobManager getTask(String jobName, String graphSpace, String graph) { QueryWrapper query = Wrappers.query(); query.eq("job_name", jobName); - query.eq("conn_id", connId); + query.eq("graphspace", graphSpace); + query.eq("graph", graph); return this.mapper.selectOne(query); } - public List list(int connId, List jobIds) { + public List list(String graphSpace, String graph, + List jobIds) { return this.mapper.selectBatchIds(jobIds); } - public IPage list(int connId, int pageNo, int pageSize, String content) { + public IPage list(String graphSpace, String graph, + int pageNo, int pageSize, String content) { QueryWrapper query = Wrappers.query(); - query.eq("conn_id", connId); + query.eq("graphspace", graphSpace); + query.eq("graph", graph); if (!content.isEmpty()) { query.like("job_name", content); } @@ -119,6 +123,15 @@ public List listAll() { return this.mapper.selectList(null); } + public IPage listAll(int pageNo, int pageSize, String content) { + QueryWrapper query = Wrappers.query(); + if (content != null && !content.isEmpty()) { + query.like("job_name", content); + } + query.orderByDesc("create_time"); + return this.mapper.selectPage(new Page<>(pageNo, pageSize), query); + } + @Transactional(isolation = Isolation.READ_COMMITTED) public void save(JobManager entity) { if (this.mapper.insert(entity) != 1) { @@ -140,6 +153,12 @@ public void remove(int id) { } } + @Transactional(isolation = Isolation.READ_COMMITTED) + public void removeByGraph(String graphSpace, String graph) { + this.mapper.deleteByMap(ImmutableMap.of("graphspace", graphSpace, + "graph", graph)); + } + @Transactional(isolation = Isolation.READ_COMMITTED) public void deleteJob(int id) { JobManager job = this.get(id); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/LoadTaskService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/LoadTaskService.java index a5d9dc515..e2840f669 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/LoadTaskService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/LoadTaskService.java @@ -18,33 +18,25 @@ package org.apache.hugegraph.service.load; -import java.io.File; -import java.io.IOException; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.ImmutableList; +import lombok.extern.log4j.Log4j2; import org.apache.commons.io.FileUtils; import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.GraphConnection; import org.apache.hugegraph.entity.enums.LoadStatus; -import org.apache.hugegraph.entity.load.EdgeMapping; -import org.apache.hugegraph.entity.load.FileMapping; -import org.apache.hugegraph.entity.load.FileSetting; -import org.apache.hugegraph.entity.load.ListFormat; -import org.apache.hugegraph.entity.load.LoadParameter; -import org.apache.hugegraph.entity.load.LoadTask; -import org.apache.hugegraph.entity.load.VertexMapping; +import org.apache.hugegraph.entity.load.*; import org.apache.hugegraph.entity.schema.EdgeLabelEntity; import org.apache.hugegraph.entity.schema.VertexLabelEntity; import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.exception.InternalException; import org.apache.hugegraph.handler.LoadTaskExecutor; +import org.apache.hugegraph.loader.HugeGraphLoader; import org.apache.hugegraph.loader.executor.LoadContext; import org.apache.hugegraph.loader.executor.LoadOptions; import org.apache.hugegraph.loader.mapping.InputStruct; @@ -52,8 +44,8 @@ import org.apache.hugegraph.loader.source.file.FileFormat; import org.apache.hugegraph.loader.source.file.FileSource; import org.apache.hugegraph.loader.util.MappingUtil; +import org.apache.hugegraph.loader.util.Printer; import org.apache.hugegraph.mapper.load.LoadTaskMapper; -import org.apache.hugegraph.service.SettingSSLService; import org.apache.hugegraph.service.schema.EdgeLabelService; import org.apache.hugegraph.service.schema.VertexLabelService; import org.apache.hugegraph.util.Ex; @@ -64,13 +56,11 @@ import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.google.common.collect.ImmutableList; - -import lombok.extern.log4j.Log4j2; +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; @Log4j2 @Service @@ -85,10 +75,9 @@ public class LoadTaskService { @Autowired private LoadTaskExecutor taskExecutor; @Autowired - private SettingSSLService sslService; - @Autowired private HugeConfig config; + private Map runningTaskContainer; public LoadTaskService() { @@ -103,16 +92,19 @@ public List listAll() { return this.mapper.selectList(null); } - public IPage list(int connId, int jobId, int pageNo, int pageSize) { + public IPage list(String graphSpace, String graph, int jobId, + int pageNo, int pageSize) { QueryWrapper query = Wrappers.query(); - query.eq("conn_id", connId); + query.eq("graphspace", graphSpace); + query.eq("graph", graph); query.eq("job_id", jobId); query.orderByDesc("create_time"); Page page = new Page<>(pageNo, pageSize); return this.mapper.selectPage(page, query); } - public List list(int connId, List taskIds) { + public List list(String grpahSpace, String graph, + List taskIds) { return this.mapper.selectBatchIds(taskIds); } @@ -160,9 +152,9 @@ public List batchTasks(int jobId) { return this.mapper.selectList(query); } - public LoadTask start(GraphConnection connection, FileMapping fileMapping) { - this.sslService.configSSL(this.config, connection); - LoadTask task = this.buildLoadTask(connection, fileMapping); + public LoadTask start(GraphConnection connection, FileMapping fileMapping, + HugeClient client) { + LoadTask task = this.buildLoadTask(connection, fileMapping, client); this.save(task); // Executed in other threads this.taskExecutor.execute(task, () -> this.update(task)); @@ -305,13 +297,6 @@ public void updateLoadTaskProgress() { LoadContext context = task.context(); long readLines = context.newProgress().totalInputRead(); if (readLines == 0L) { - /* - * When the Context is just constructed, newProgress - * is empty. Only after parsing is started will use - * oldProgress and incrementally update newProgress, - * if get totalInputRead value during this process, - * it will return 0, so need read it from oldProgress - */ readLines = context.oldProgress().totalInputRead(); } task.setFileReadLines(readLines); @@ -325,11 +310,12 @@ public void updateLoadTaskProgress() { } private LoadTask buildLoadTask(GraphConnection connection, - FileMapping fileMapping) { + FileMapping fileMapping, HugeClient client) { try { LoadOptions options = this.buildLoadOptions(connection, fileMapping); // NOTE: For simplicity, one file corresponds to one import task - LoadMapping mapping = this.buildLoadMapping(connection, fileMapping); + LoadMapping mapping = this.buildLoadMapping(connection, fileMapping, + client); this.bindMappingToOptions(options, mapping, fileMapping.getPath()); return new LoadTask(options, connection, fileMapping); } catch (Exception e) { @@ -353,18 +339,15 @@ private void bindMappingToOptions(LoadOptions options, LoadMapping mapping, private LoadOptions buildLoadOptions(GraphConnection connection, FileMapping fileMapping) { LoadOptions options = new LoadOptions(); - // Fill with input and server params + // Connection params options.file = fileMapping.getPath(); - // No need to specify a schema file + options.graph = connection.getGraph(); options.host = connection.getHost(); options.port = connection.getPort(); - options.graph = connection.getGraph(); - options.username = connection.getUsername(); - options.token = connection.getPassword(); - options.protocol = connection.getProtocol(); - options.trustStoreFile = connection.getTrustStoreFile(); - options.trustStoreToken = connection.getTrustStorePassword(); - // Fill with load parameters + options.token = connection.getToken(); + options.protocol = connection.getProtocol() != null ? + connection.getProtocol() : "http"; + // Load parameters LoadParameter parameter = fileMapping.getLoadParameter(); options.checkVertex = parameter.isCheckVertex(); options.timeout = parameter.getInsertTimeout(); @@ -373,7 +356,7 @@ private LoadOptions buildLoadOptions(GraphConnection connection, options.maxInsertErrors = parameter.getMaxInsertErrors(); options.retryTimes = parameter.getRetryTimes(); options.retryInterval = parameter.getRetryInterval(); - // Optimized for hubble + // Optimized for hubble (conservative defaults) options.batchInsertThreads = 4; options.singleInsertThreads = 4; options.batchSize = 100; @@ -381,17 +364,24 @@ private LoadOptions buildLoadOptions(GraphConnection connection, } private LoadMapping buildLoadMapping(GraphConnection connection, - FileMapping fileMapping) { + FileMapping fileMapping, + HugeClient client) { FileSource source = this.buildFileSource(fileMapping); + log.info("Building load mapping for file: {}, vertices: {}, edges: {}", + fileMapping.getName(), + fileMapping.getVertexMappings().size(), + fileMapping.getEdgeMappings().size()); List vMappings; - vMappings = this.buildVertexMappings(connection, fileMapping); + vMappings = this.buildVertexMappings(connection, fileMapping, client); List eMappings; - eMappings = this.buildEdgeMappings(connection, fileMapping); + eMappings = this.buildEdgeMappings(connection, fileMapping, client); InputStruct inputStruct = new InputStruct(vMappings, eMappings); inputStruct.id("1"); inputStruct.input(source); + log.info("Built InputStruct id={}, vertices={}, edges={}", + inputStruct.id(), inputStruct.vertices().size(), inputStruct.edges().size()); return new LoadMapping(ImmutableList.of(inputStruct)); } @@ -421,22 +411,23 @@ private FileSource buildFileSource(FileMapping fileMapping) { } private List - buildVertexMappings(GraphConnection connection, - FileMapping fileMapping) { - int connId = connection.getId(); + buildVertexMappings(GraphConnection connection, + FileMapping fileMapping, HugeClient client) { List vMappings = new ArrayList<>(); for (VertexMapping mapping : fileMapping.getVertexMappings()) { - VertexLabelEntity vl = this.vlService.get(mapping.getLabel(), connId); + VertexLabelEntity vl = this.vlService.get(mapping.getLabel(), + client); List idFields = mapping.getIdFields(); Map fieldMappings = mapping.fieldMappingToMap(); + org.apache.hugegraph.loader.mapping.VertexMapping vMapping; if (vl.getIdStrategy().isCustomize()) { Ex.check(idFields.size() == 1, "When the ID strategy is CUSTOMIZED, you must " + "select a column in the file as the id"); - vMapping = new org.apache.hugegraph.loader.mapping.VertexMapping(idFields.get(0), - true); + vMapping = new org.apache.hugegraph.loader.mapping.VertexMapping( + idFields.get(0), true); } else { assert vl.getIdStrategy().isPrimaryKey(); List primaryKeys = vl.getPrimaryKeys(); @@ -445,12 +436,9 @@ private FileSource buildFileSource(FileMapping fileMapping) { "When the ID strategy is PRIMARY_KEY, you must " + "select at least one column in the file as the " + "primary keys"); - /* - * The id column can be unfold into multi sub-ids only - * when primarykeys contains just one field - */ boolean unfold = idFields.size() == 1; - vMapping = new org.apache.hugegraph.loader.mapping.VertexMapping(null, unfold); + vMapping = new org.apache.hugegraph.loader.mapping.VertexMapping( + null, unfold); for (int i = 0; i < primaryKeys.size(); i++) { fieldMappings.put(idFields.get(i), primaryKeys.get(i)); } @@ -461,7 +449,7 @@ private FileSource buildFileSource(FileMapping fileMapping) { vMapping.mappingFields(fieldMappings); // set value_mapping vMapping.mappingValues(mapping.valueMappingToMap()); - // set selected + // set selected fields vMapping.selectedFields().addAll(idFields); vMapping.selectedFields().addAll(fieldMappings.keySet()); // set null_values @@ -469,37 +457,31 @@ private FileSource buildFileSource(FileMapping fileMapping) { nullValues.addAll(mapping.getNullValues().getChecked()); nullValues.addAll(mapping.getNullValues().getCustomized()); vMapping.nullValues(nullValues); - // TODO: Update strategies + vMappings.add(vMapping); } return vMappings; } private List - buildEdgeMappings(GraphConnection connection, - FileMapping fileMapping) { - int connId = connection.getId(); + buildEdgeMappings(GraphConnection connection, + FileMapping fileMapping, HugeClient client) { List eMappings = new ArrayList<>(); for (EdgeMapping mapping : fileMapping.getEdgeMappings()) { List sourceFields = mapping.getSourceFields(); List targetFields = mapping.getTargetFields(); - EdgeLabelEntity el = this.elService.get(mapping.getLabel(), connId); - VertexLabelEntity svl = this.vlService.get(el.getSourceLabel(), - connId); - VertexLabelEntity tvl = this.vlService.get(el.getTargetLabel(), - connId); + EdgeLabelEntity el = this.elService.get(mapping.getLabel(), client); + VertexLabelEntity svl = this.vlService.get(el.getSourceLabel(), client); + VertexLabelEntity tvl = this.vlService.get(el.getTargetLabel(), client); Map fieldMappings = mapping.fieldMappingToMap(); - /* - * When id strategy is customize or primaryKeys contains - * just one field, the param 'unfold' can be true - */ + boolean unfoldSource = true; if (svl.getIdStrategy().isPrimaryKey()) { List primaryKeys = svl.getPrimaryKeys(); Ex.check(sourceFields.size() >= 1 && sourceFields.size() == primaryKeys.size(), - "When the source vertex ID strategy is CUSTOMIZED, " + + "When the source vertex ID strategy is PRIMARY_KEY, " + "you must select at least one column in the file " + "as the id"); for (int i = 0; i < primaryKeys.size(); i++) { @@ -514,7 +496,7 @@ private FileSource buildFileSource(FileMapping fileMapping) { List primaryKeys = tvl.getPrimaryKeys(); Ex.check(targetFields.size() >= 1 && targetFields.size() == primaryKeys.size(), - "When the target vertex ID strategy is CUSTOMIZED, " + + "When the target vertex ID strategy is PRIMARY_KEY, " + "you must select at least one column in the file " + "as the id"); for (int i = 0; i < primaryKeys.size(); i++) { @@ -525,16 +507,16 @@ private FileSource buildFileSource(FileMapping fileMapping) { } } - org.apache.hugegraph.loader.mapping.EdgeMapping eMapping; - eMapping = new org.apache.hugegraph.loader.mapping.EdgeMapping( - sourceFields, unfoldSource, targetFields, unfoldTarget); + org.apache.hugegraph.loader.mapping.EdgeMapping eMapping = + new org.apache.hugegraph.loader.mapping.EdgeMapping( + sourceFields, unfoldSource, targetFields, unfoldTarget); // set label eMapping.label(mapping.getLabel()); // set field_mapping eMapping.mappingFields(fieldMappings); // set value_mapping eMapping.mappingValues(mapping.valueMappingToMap()); - // set selected + // set selected fields eMapping.selectedFields().addAll(sourceFields); eMapping.selectedFields().addAll(targetFields); eMapping.selectedFields().addAll(fieldMappings.keySet()); @@ -548,4 +530,34 @@ private FileSource buildFileSource(FileMapping fileMapping) { } return eMappings; } + + public void startCovid19(GraphConnection connection, + String graphSpace, String graph, + HugeClient client) { + FileMapping fileMapping = + new FileMapping(graphSpace, graph, "covid19", + "example/covid19/struct.json"); + LoadParameter loadParameter = new LoadParameter(); + fileMapping.setLoadParameter(loadParameter); + + LoadOptions options = this.buildLoadOptions(connection, fileMapping); + // options.direct = true; + // options.pdPeers = connection.getPdPeers(); + options.schema = "example/covid19/schema.groovy"; + options.host = connection.getHost(); + options.port = connection.getPort(); + options.protocol = connection.getProtocol(); + loader(options); + } + + public void loader(LoadOptions options) { + HugeGraphLoader loader; + try { + loader = new HugeGraphLoader(options); + loader.load(); + } catch (Throwable e) { + Printer.printError("Failed to start loading", e); + return; + } + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/AuditService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/AuditService.java new file mode 100644 index 000000000..24bd6cb70 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/AuditService.java @@ -0,0 +1,273 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.op; + +import co.elastic.clients.elasticsearch._types.*; +import co.elastic.clients.elasticsearch._types.query_dsl.*; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.Hit; +import co.elastic.clients.elasticsearch.indices.GetAliasRequest; +import co.elastic.clients.json.JsonData; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.hugegraph.entity.op.AuditEntity; +import org.apache.hugegraph.util.PageUtil; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +@Log4j2 +@Service +public class AuditService extends ESService { + + private final String auditSortKey = "@timestamp"; + private final String sortOrder = "Asc"; + + public IPage queryPage(AuditReq auditReq) throws IOException { + List indexes = new ArrayList<>(); + + List logs = new ArrayList<>(); + int count = 0; + + List services = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(auditReq.services)) { + services.addAll(auditReq.services); + } else { + services.addAll(listServices()); + } + services.forEach(s -> indexes.add(auditIndexName(s))); + + if (CollectionUtils.isNotEmpty(indexes)) { + FieldSort sort = + SortOptionsBuilders.field().field(auditSortKey) + .order(SortOrder.valueOf(sortOrder)).build(); + SortOptions sortKeyOption = + new SortOptions.Builder().field(sort).build(); + + int begine = Math.max(auditReq.pageNo - 1, 0); + List querys = buildESQuery(auditReq); + SearchResponse search = esClient().search((s) -> + s.index(indexes).from(begine * auditReq.pageSize) + .size(auditReq.pageSize) + .query(q -> q.bool( boolQuery -> boolQuery.must(querys)) + ).sort(sortKeyOption), Map.class); + + for (Hit hit: search.hits().hits()) { + String service = hit.index().split("_")[0]; + AuditEntity auditEntity = + AuditEntity.fromMap((Map) hit.source()); + auditEntity.setService(service); + logs.add(auditEntity); + } + + count = (int) (search.hits().total().value()); + } + + return PageUtil.newPage(logs, auditReq.pageNo, auditReq.pageSize, count); + } + + public List export(AuditReq auditReq) throws IOException { + List indexes = new ArrayList<>(); + + List audits = new ArrayList<>(); + + List services = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(auditReq.services)) { + services.addAll(auditReq.services); + } else { + services.addAll(listServices()); + } + services.forEach(s -> indexes.add(auditIndexName(s))); + + FieldSort sort = + SortOptionsBuilders.field().field(auditSortKey) + .order(SortOrder.valueOf(sortOrder)).build(); + SortOptions sortKeyOption = + new SortOptions.Builder().field(sort).build(); + + List querys = buildESQuery(auditReq); + + int batchSize = maxResultWindow(); + int countLimit = exportCountLimit(); + + int times = (int) Math.ceil((double) countLimit / batchSize); + + for (int i = 0; i < times; i++) { + int start = i * batchSize; + SearchResponse search = esClient().search((s) -> + s.index(indexes).from(start).size(batchSize) + .query(q -> q.bool( boolQuery -> boolQuery.must(querys)) + ).sort(sortKeyOption), Map.class); + + for (Hit hit: search.hits().hits()) { + String service = hit.index().split("_")[0]; + AuditEntity auditEntity = + AuditEntity.fromMap((Map) hit.source()); + auditEntity.setService(service); + audits.add(auditEntity); + } + + int resultCount = (int) (search.hits().total().value()); + if (resultCount < batchSize) { + break; + } + } + + return audits; + } + + + protected List buildESQuery(AuditReq auditReq) { + List querys = new ArrayList<>(); + // start_datetime, end_datetime + if (auditReq.startDatetime != null || auditReq.endDatetime != null) { + Query.Builder builder = new Query.Builder(); + RangeQuery.Builder rBuilder = new RangeQuery.Builder(); + rBuilder = rBuilder.field("@timestamp"); + if (auditReq.startDatetime != null) { + rBuilder = rBuilder.gte(JsonData.of(auditReq.startDatetime)); + } + if (auditReq.endDatetime != null) { + rBuilder = rBuilder.lte(JsonData.of(auditReq.endDatetime)); + } + querys.add(builder.range(rBuilder.build()).build()); + } + + // graphspace + if (!StringUtils.isEmpty(auditReq.graphSpace)) { + Query.Builder builder = new Query.Builder(); + + MatchQuery.Builder mBuilder = new MatchQuery.Builder(); + mBuilder.field("json.audit_graphspace").query(FieldValue.of(auditReq.graphSpace)); + + querys.add(builder.match(mBuilder.build()).build()); + } + + // graph + if (!StringUtils.isEmpty(auditReq.graph)) { + Query.Builder builder = new Query.Builder(); + + MatchQuery.Builder mBuilder = new MatchQuery.Builder(); + mBuilder.field("json.audit_graph").query(FieldValue.of(auditReq.graph)); + + querys.add(builder.match(mBuilder.build()).build()); + } + + // user + if (!StringUtils.isEmpty(auditReq.user)) { + Query.Builder builder = new Query.Builder(); + + MatchQuery.Builder mBuilder = new MatchQuery.Builder(); + mBuilder.field("json.audit_user").query(FieldValue.of(auditReq.user)); + + querys.add(builder.match(mBuilder.build()).build()); + } + + // ip + if (!StringUtils.isEmpty(auditReq.ip)) { + Query.Builder builder = new Query.Builder(); + + MatchQuery.Builder mBuilder = new MatchQuery.Builder(); + mBuilder.field("json.audit_ip").query(FieldValue.of(auditReq.ip)); + + querys.add(builder.match(mBuilder.build()).build()); + } + + // operations + if (CollectionUtils.isNotEmpty(auditReq.operations)) { + Query.Builder builder = new Query.Builder(); + + TermsQuery.Builder tBuilder = new TermsQuery.Builder(); + TermsQueryField.Builder fieldBuilder = new TermsQueryField.Builder(); + fieldBuilder.value(auditReq.operations.stream().map(FieldValue::of) + .collect(Collectors.toList())); + tBuilder.field("json.audit_operation.keyword").terms(fieldBuilder.build()); + + querys.add(builder.terms(tBuilder.build()).build()); + } + + return querys; + } + + @Cacheable(value = "ES_QUERY", key="#root.targetClass.name+':'+#root" + + ".methodName") + public synchronized List listServices() throws IOException { + Set services = new HashSet<>(); + + GetAliasRequest req = new GetAliasRequest.Builder().index( + auditIndexPattern()).build(); + esClient().indices().getAlias(req).result().keySet() + .stream().filter(x -> !x.startsWith(".")) + .forEach(indexName -> { + String arr1 = indexName.split("_")[0]; + services.add(arr1); + }); + + return services.stream().sorted().collect(Collectors.toList()); + } + + protected String auditIndexPattern() { + return "*_" + logAuditPattern() + "-*"; + } + protected String auditIndexName(String logType) { + return logType + "_" + logAuditPattern() + "-*"; + } + + @NoArgsConstructor + @AllArgsConstructor + @JsonIgnoreProperties(ignoreUnknown = true) + public static class AuditReq { + @JsonProperty("start_datetime") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd " + + "HH:mm:ss", timezone = "GMT+8") + public Date startDatetime; + + @JsonProperty("end_datetime") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd " + + "HH:mm:ss", timezone = "GMT+8") + public Date endDatetime; + + @JsonProperty("user") + public String user; + @JsonProperty("ip") + public String ip; + @JsonProperty("operations") + public List operations; + @JsonProperty("services") + public List services = new ArrayList<>(); + @JsonProperty("graphspace") + public String graphSpace; + @JsonProperty("graph") + public String graph; + @JsonProperty("page_no") + public int pageNo = 1; + @JsonProperty("page_size") + public int pageSize = 20; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/ESService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/ESService.java new file mode 100644 index 000000000..d37ba4ac7 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/ESService.java @@ -0,0 +1,124 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.op; + +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.json.jackson.JacksonJsonpMapper; +import co.elastic.clients.transport.ElasticsearchTransport; +import co.elastic.clients.transport.rest_client.RestClientTransport; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.util.E; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestClientBuilder; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Arrays; +import java.util.Objects; + +@Log4j2 +public abstract class ESService { + @Autowired + private HugeConfig config; + + public static final String[] LEVELS = new String[]{"TRACE", "OFF", + "FATAL", "ERROR", "WARN", "INFO", "DEBUG"}; + + public static volatile ElasticsearchClient elasticsearchClient; + + public synchronized ElasticsearchClient esClient() { + + if (elasticsearchClient != null) { + return elasticsearchClient; + } + + RestClient restClient = esRestClient(); + + // Create the transport with a Jackson mapper + ElasticsearchTransport transport = new RestClientTransport( + restClient, new JacksonJsonpMapper()); + // And create the API client + elasticsearchClient = new ElasticsearchClient(transport); + + return elasticsearchClient; + } + + protected RestClient esRestClient() { + String esURLS = null; + + // Get monitor.url from system.env + esURLS = System.getenv(HubbleOptions.ES_URL.name()); + if (StringUtils.isEmpty(esURLS)) { + // get monitor.url from file: hugegraph-hubble.properties + esURLS = config.get(HubbleOptions.ES_URL); + } + + E.checkArgument(StringUtils.isNotEmpty(esURLS), + "Please set \"es.urls\" in system environments " + + "or config file(hugegraph-hubble.properties)."); + + String[] esAddresses = esURLS.split(","); + HttpHost[] hosts = Arrays.stream(esAddresses) + .map(HttpHost::create) + .filter(Objects::nonNull) + .toArray(HttpHost[]::new); + log.debug("es.hosts:{}", Arrays.toString(hosts)); + + RestClientBuilder restClientBuidler = RestClient.builder(hosts); + + String esUser = config.get(HubbleOptions.ES_USER); + String esPassword = config.get(HubbleOptions.ES_PASSWORD); + if (StringUtils.isNotEmpty(esUser)) { + final CredentialsProvider credentialsProvider = + new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, + new UsernamePasswordCredentials( + esUser, + esPassword)); + + restClientBuidler.setHttpClientConfigCallback( + httpClientBuilder -> httpClientBuilder + .setDefaultCredentialsProvider(credentialsProvider) + ); + } + + RestClient restClient = restClientBuidler.build(); + + return restClient; + } + + protected String logAuditPattern() { + return config.get(HubbleOptions.LOG_AUDIT_PATTERN); + } + + protected int exportCountLimit() { + return config.get(HubbleOptions.LOG_EXPORT_COUNT); + } + + protected int maxResultWindow() { + return config.get(HubbleOptions.MAX_RESULT_WINDOW); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/LogService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/LogService.java new file mode 100644 index 000000000..111e72239 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/op/LogService.java @@ -0,0 +1,284 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.op; + +import co.elastic.clients.elasticsearch._types.*; +import co.elastic.clients.elasticsearch._types.aggregations.Aggregation; +import co.elastic.clients.elasticsearch._types.aggregations.Buckets; +import co.elastic.clients.elasticsearch._types.aggregations.StringTermsBucket; +import co.elastic.clients.elasticsearch._types.query_dsl.*; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.Hit; +import co.elastic.clients.elasticsearch.indices.GetAliasResponse; +import co.elastic.clients.json.JsonData; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.collect.ImmutableList; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.hugegraph.entity.op.LogEntity; +import org.apache.hugegraph.util.PageUtil; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class LogService extends ESService { + + protected final String allIndexName = "*"; + + private final String logSortKey = "@timestamp"; + private final String sortOrder = "Asc"; + + public IPage queryPage(LogReq logReq) throws IOException { + + List logs = new ArrayList<>(); + + List indexes = new ArrayList<>(); + // services + List services = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(logReq.services)) { + services.addAll(logReq.services); + } else { + services.addAll(listServices()); + } + services.forEach(s -> indexes.add(s + "-*")); + + List querys = buildQuery(logReq); + + FieldSort sort = + SortOptionsBuilders.field().field(logSortKey) + .order(SortOrder.valueOf(sortOrder)).build(); + SortOptions sortKeyOption = + new SortOptions.Builder().field(sort).build(); + + SearchResponse search = esClient().search((s) -> + s.index(indexes).from(Math.max(logReq.pageNo - 1, 0) * logReq.pageSize) + .size(logReq.pageSize) + .query(q -> q.bool( boolQuery -> + boolQuery.must(querys) + ) + ).sort(sortKeyOption), Map.class); + + for (Hit hit: search.hits().hits()) { + logs.add(LogEntity.fromMap((Map) hit.source())); + } + + return PageUtil.newPage(logs, logReq.pageNo, logReq.pageSize, + (int)(search.hits().total().value())); + } + + public List export(LogReq logReq) throws IOException { + List logs = new ArrayList<>(); + + List indexes = new ArrayList<>(); + // services + List services = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(logReq.services)) { + services.addAll(logReq.services); + } else { + services.addAll(listServices()); + } + services.forEach(s -> indexes.add(s + "-*")); + + List querys = buildQuery(logReq); + + FieldSort sort = + SortOptionsBuilders.field().field(logSortKey) + .order(SortOrder.valueOf(sortOrder)).build(); + SortOptions sortKeyOption = + new SortOptions.Builder().field(sort).build(); + + int batchSize = maxResultWindow(); + int countLimit = exportCountLimit(); + + int times = (int) Math.ceil((double) countLimit / batchSize); + + for (int i = 0; i < times; i++) { + int start = i * batchSize; + + SearchResponse search = esClient().search((s) -> + s.index(indexes).from(start).size(batchSize) + .query(q -> q.bool( boolQuery -> boolQuery.must(querys)) + ).sort(sortKeyOption), Map.class); + + for (Hit hit: search.hits().hits()) { + logs.add(LogEntity.fromMap((Map) hit.source())); + } + + int resultCount = (int) (search.hits().total().value()); + if (resultCount < batchSize) { + break; + } + } + + return logs; + } + + protected List buildQuery(LogReq logReq) { + // 根据Query信息,生成ES的query + + List querys = new ArrayList<>(); + // start_datetime, end_datetime + if(logReq.startDatetime != null || logReq.endDatetime != null) { + Query.Builder builder = new Query.Builder(); + // builder.range(e->e.field()) + RangeQuery.Builder rBuilder = new RangeQuery.Builder(); + rBuilder = rBuilder.field("@timestamp"); + if(logReq.startDatetime != null) { + rBuilder = rBuilder.gte(JsonData.of(logReq.startDatetime)); + } + if(logReq.endDatetime != null) { + rBuilder = rBuilder.lte(JsonData.of(logReq.endDatetime)); + } + querys.add(builder.range(rBuilder.build()).build()); + } + + // query + if(!StringUtils.isEmpty(logReq.query)) { + Query.Builder builder = new Query.Builder(); + + MatchQuery.Builder mBuilder = new MatchQuery.Builder(); + mBuilder.field("message").query(FieldValue.of(logReq.query)); + + querys.add(builder.match(mBuilder.build()).build()); + } + + // hosts + if (CollectionUtils.isNotEmpty(logReq.hosts)) { + Query.Builder builder = new Query.Builder(); + + TermsQuery.Builder tBuilder = new TermsQuery.Builder(); + TermsQueryField.Builder fieldBuilder = new TermsQueryField.Builder(); + fieldBuilder.value(logReq.hosts.stream().map(FieldValue::of) + .collect(Collectors.toList())); + tBuilder.field("host.hostname.keyword").terms(fieldBuilder.build()); + + querys.add(builder.terms(tBuilder.build()).build()); + } + + // Level + if (StringUtils.isNotEmpty(logReq.level)) { + int levelIndex = ArrayUtils.indexOf(LEVELS, + logReq.level.toUpperCase()); + + String[] retianLevels = Arrays.copyOfRange(LEVELS, 0, + levelIndex + 1); + + Query.Builder builder = new Query.Builder(); + + TermsQuery.Builder tBuilder = new TermsQuery.Builder(); + TermsQueryField.Builder fieldBuilder = new TermsQueryField.Builder(); + fieldBuilder.value(Arrays.stream(retianLevels).map(FieldValue::of) + .collect(Collectors.toList())); + tBuilder.field("level.keyword").terms(fieldBuilder.build()); + + querys.add(builder.terms(tBuilder.build()).build()); + } + + return querys; + } + + @Cacheable(value = "ES_QUERY", key="#root.targetClass.name+':'+#root" + + ".methodName") + public synchronized List listServices() throws IOException { + Set services = new HashSet<>(); + + GetAliasResponse res = esClient().indices().getAlias(); + res.result().keySet().stream() + // filter hidden index and audit index + .filter(x -> !(x.startsWith(".") || x.contains(logAuditPattern()))) + .forEach(indexName -> services.add(indexName.split("-")[0])); + + return services.stream().sorted().collect(Collectors.toList()); + } + + @Cacheable(value = "ES_QUERY", key="#root.targetClass.name+':'+#root" + + ".methodName") + public List listHosts() throws IOException { + + List hosts = new ArrayList<>(); + + final String hostField = "host.hostname.keyword"; + + return esAggTerms(ImmutableList.of(allIndexName), hostField, 20); + } + + protected List esAggTerms(List indexNames, String field, + int top) throws IOException { + String key = "field_key"; + Aggregation agg = Aggregation.of( + a -> a.terms(v -> v.field(field).size(top))); + + // DO Request + SearchResponse response + = esClient().search((s) -> s.index(indexNames) + .aggregations(key, agg), + Object.class); + + // Get agg terms from response + Buckets buckets = response.aggregations() + .get(key) + .sterms() + .buckets(); + + return buckets.array().stream().map(b -> b.key()) + .collect(Collectors.toList()); + + } + + @NoArgsConstructor + @AllArgsConstructor + public static class LogReq { + @JsonProperty("start_datetime") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd " + + "HH:mm:ss", timezone = "GMT+8") + public Date startDatetime; + + @JsonProperty("end_datetime") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd " + + "HH:mm:ss", timezone = "GMT+8") + public Date endDatetime; + + @JsonProperty("query") + public String query; + + @JsonProperty("level") + public String level; + + @JsonProperty("services") + public List services = new ArrayList<>(); + + @JsonProperty("hosts") + public List hosts = new ArrayList<>(); + + @JsonProperty("page_no") + public int pageNo = 1; + + @JsonProperty("page_size") + public int pageSize = 20; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/ApplicationInfoService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/ApplicationInfoService.java new file mode 100644 index 000000000..589c9c482 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/ApplicationInfoService.java @@ -0,0 +1,56 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.query; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.hugegraph.entity.query.ApplicationInfo; +import org.apache.hugegraph.mapper.query.ApplicationInfoMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + + +@Service +public class ApplicationInfoService { + + @Autowired + public ApplicationInfoMapper mapper; + + public void insertOrUpdateAppInfo(ApplicationInfo appInfo) { + mapper.insertOrUpdateAppInfo(appInfo); + } + + public List query(String graphName) { + return mapper.queryByGraph(graphName); + } + + public List query(String graphName, String appName, String appType) { + return mapper.query(graphName, appName, appType); + } + + public void delete(String graphName, String appName, String appType) { + QueryWrapper query = + new QueryWrapper<>(); + query.eq("graph_name", graphName) + .eq("app_name", appName) + .eq("app_type", appType); + mapper.delete(query); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/EditElementHistoryService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/EditElementHistoryService.java new file mode 100644 index 000000000..dda0b65fa --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/EditElementHistoryService.java @@ -0,0 +1,172 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.query; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import org.apache.hugegraph.entity.query.ElementEditHistory; +import org.apache.hugegraph.mapper.query.EditElementHistoryMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.commons.lang3.StringUtils; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +public class EditElementHistoryService { + + @Autowired + private EditElementHistoryMapper mapper; + + public List queryByLimit(int limit) { + return mapper.queryByLimit(limit); + } + + public int add(ElementEditHistory history) { + return mapper.insert(history); + } + + public int add(List histories) { + try { + return mapper.insertBatch(histories); + } catch (Exception e) { + log.error("add element edit history [{}] error: ", + StringUtils.join(histories, ","), e); + } + return 0; + } + + + public int add(String graphspace, String graph, + String elementId, String label, int propertyNum, + String optionType, Date optionTime, + String optionPerson, String content) { + ElementEditHistory eleEditHis = ElementEditHistory.builder() + .graphspace(graphspace) + .graph(graph) + .elementId(elementId) + .label(label) + .propertyNum(propertyNum) + .optionType(optionType) + .optionTime(optionTime) + .optionPerson(optionPerson) + .content(content) + .build(); + try { + return mapper.insert(eleEditHis); + } catch (Exception e) { + log.error("add element edit history [{}] error: ", + eleEditHis.toString(), e); + } + return 0; + } + + + public IPage list(String graphSpace, + String graph, + int current, + int pageSize) { + QueryWrapper query = Wrappers.query(); + query.eq("graphspace", graphSpace) + .eq("graph", graph) + .orderByDesc("option_time"); + Page page = new Page<>(current, pageSize); + return this.mapper.selectPage(page, query); + } + + public IPage queryByConditions(String graphSpace, + String graph, + List optionPersons, + List optionTypes, + String elementId, + String optionTimeFrom, + String optionTimeTo, + int current, + int pageSize) { + QueryWrapper query = Wrappers.query(); + query.eq("graphspace", graphSpace) + .eq("graph", graph) + .orderByDesc("option_time"); + + if (!elementId.isEmpty()) { + query.eq("element_id", elementId); + } + + if (!optionPersons.isEmpty()) { + query.in("option_person", optionPersons); + } + + if (!optionTypes.isEmpty()) { + query.in("option_type", optionTypes); + } + + if (!(StringUtils.isEmpty(optionTimeFrom) && + StringUtils.isEmpty(optionTimeTo))) { + query.between("option_time", optionTimeFrom, optionTimeTo); + } + + Page page = new Page<>(current, pageSize); + return this.mapper.selectPage(page, query); + } + + + public List queryByElementId(String graphSpace, + String graph, + String elementId) { + return mapper.queryByElementId(graphSpace, graph, elementId); + } + + public Map queryByElementIds(String graphSpace, + String graph, + List elementIds) { + List list = + mapper.queryByElementIds(graphSpace, graph, elementIds); + Map map = new HashMap<>(); + list.forEach(ele -> { + map.merge(ele.getElementId(), ele, (oldValue, newValue) -> { + // 如果 newValue 的 optionTime 比较晚,则替换原来的元素 + return newValue.getOptionTime().compareTo(oldValue.getOptionTime()) > 0 ? newValue : oldValue; + }); + }); + return map; + } + + public IPage queryByElementId(String graphSpace, + String graph, + String elementId, + int current, + int pageSize) { + QueryWrapper query = Wrappers.query(); + query.eq("graphspace", graphSpace) + .eq("graph", graph) + .eq("element_id", elementId) + .orderByDesc("option_time"); + Page page = new Page<>(current, pageSize); + return this.mapper.selectPage(page, query); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/ExecuteHistoryService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/ExecuteHistoryService.java index c6fffac7e..4c3861774 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/ExecuteHistoryService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/ExecuteHistoryService.java @@ -21,6 +21,15 @@ import java.time.Instant; import java.time.temporal.ChronoField; +import org.apache.hugegraph.util.Ex; +import com.google.common.collect.ImmutableMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Transactional; + import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.enums.AsyncTaskStatus; @@ -29,16 +38,8 @@ import org.apache.hugegraph.exception.InternalException; import org.apache.hugegraph.mapper.query.ExecuteHistoryMapper; import org.apache.hugegraph.options.HubbleOptions; -import org.apache.hugegraph.service.HugeClientPoolService; import org.apache.hugegraph.structure.Task; import org.apache.hugegraph.util.HubbleUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Async; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Isolation; -import org.springframework.transaction.annotation.Transactional; - import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -54,17 +55,28 @@ public class ExecuteHistoryService { private HugeConfig config; @Autowired private ExecuteHistoryMapper mapper; - @Autowired - private HugeClientPoolService poolService; - - private HugeClient getClient(int connId) { - return this.poolService.getOrCreate(connId); - } - public IPage list(int connId, long current, long pageSize) { - HugeClient client = this.getClient(connId); + /** + * 查询执行历史记录 + * + * @param client HugeClient客户端 + * @param type 查询类型 + * @param current 当前页码 + * @param pageSize 每页记录数 + * @param text2Gremlin 是否需要展示text2Gremlin的执行历史记录 + * @return IPage 执行历史记录分页结果 + */ + public IPage list(HugeClient client, int type, long current, + long pageSize, boolean text2Gremlin) { + this.checkTypeValid(type); QueryWrapper query = Wrappers.query(); - query.eq("conn_id", connId).orderByDesc("create_time"); + query.eq("graphspace", client.getGraphSpaceName()) + .eq("graph", client.getGraphName()) + .in("execute_type", ExecuteType.getMatchedTypes(type)) + .orderByDesc("create_time"); + if (text2Gremlin) { + query.apply("LENGTH(text) > 0"); + } Page page = new Page<>(current, pageSize); IPage results = this.mapper.selectPage(page, query); @@ -88,12 +100,34 @@ public IPage list(int connId, long current, long pageSize) { p.setAsyncStatus(AsyncTaskStatus.UNKNOWN); } } + if (p.getType().equals(ExecuteType.CYPHER_ASYNC)) { + try { + Task task = client.task().get(p.getAsyncId()); + long endDate = task.updateTime() > 0 ? task.updateTime() : + now.getLong(ChronoField.INSTANT_SECONDS); + p.setDuration(endDate - task.createTime()); + p.setAsyncStatus(task.status().toUpperCase()); + } catch (Exception e) { + p.setDuration(0L); + p.setAsyncStatus(AsyncTaskStatus.UNKNOWN); + } + } }); return results; } - public ExecuteHistory get(int connId, int id) { - HugeClient client = this.getClient(connId); + private void checkTypeValid(int type) { + Ex.check(type == ExecuteType.CYPHER.getValue() || + type == ExecuteType.GREMLIN.getValue() || + type == ExecuteType.ALGORITHM.getValue()|| + type == ExecuteType.GREMLIN_ASYNC.getValue() || + type == ExecuteType.CYPHER_ASYNC.getValue() || + type == ExecuteType.GREMLIN_ALL.getValue() || + type == ExecuteType.CYPHER_ALL.getValue(), + "executehistory type invalid"); + } + + public ExecuteHistory get(HugeClient client, int id) { ExecuteHistory history = this.mapper.selectById(id); if (history.getType().equals(ExecuteType.GREMLIN_ASYNC)) { try { @@ -110,9 +144,9 @@ public ExecuteHistory get(int connId, int id) { @Transactional(isolation = Isolation.READ_COMMITTED) public void save(ExecuteHistory history) { - if (this.mapper.insert(history) != 1) { - throw new InternalException("entity.insert.failed", history); - } + if (this.mapper.insert(history) != 1) { + throw new InternalException("entity.insert.failed", history); + } } @Transactional(isolation = Isolation.READ_COMMITTED) @@ -123,9 +157,8 @@ public void update(ExecuteHistory history) { } @Transactional(isolation = Isolation.READ_COMMITTED) - public void remove(int connId, int id) { + public void remove(HugeClient client, int id) { ExecuteHistory history = this.mapper.selectById(id); - HugeClient client = this.getClient(connId); if (history.getType().equals(ExecuteType.GREMLIN_ASYNC)) { client.task().delete(history.getAsyncId()); } @@ -141,4 +174,10 @@ public void removeExceedLimit() { int limit = this.config.get(HubbleOptions.EXECUTE_HISTORY_SHOW_LIMIT); this.mapper.deleteExceedLimit(limit); } + + @Transactional(isolation = Isolation.READ_COMMITTED) + public void deleteByGraph(String graphSpace, String graph) { + this.mapper.deleteByMap(ImmutableMap.of("graphspace", graphSpace, + "graph", graph)); + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/GremlinCollectionService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/GremlinCollectionService.java index 3ece3623a..b53d0f01b 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/GremlinCollectionService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/GremlinCollectionService.java @@ -18,16 +18,18 @@ package org.apache.hugegraph.service.query; -import org.apache.hugegraph.entity.query.GremlinCollection; -import org.apache.hugegraph.exception.InternalException; -import org.apache.hugegraph.mapper.query.GremlinCollectionMapper; -import org.apache.hugegraph.util.SQLUtil; +import com.google.common.collect.ImmutableMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.query.GremlinCollection; +import org.apache.hugegraph.exception.InternalException; +import org.apache.hugegraph.mapper.query.GremlinCollectionMapper; +import org.apache.hugegraph.util.SQLUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -39,11 +41,14 @@ public class GremlinCollectionService { @Autowired private GremlinCollectionMapper mapper; - public IPage list(int connId, String content, + public IPage list(HugeClient client, String content, + String type, Boolean nameOrderAsc, Boolean timeOrderAsc, long current, long pageSize) { QueryWrapper query = Wrappers.query(); + String graphSpace = client.getGraphSpaceName(); + String graph = client.getGraphName(); IPage page = new Page<>(current, pageSize); if (!StringUtils.isEmpty(content)) { // Select by content @@ -51,35 +56,48 @@ public IPage list(int connId, String content, if (nameOrderAsc != null) { // order by name assert timeOrderAsc == null; - query.eq("conn_id", connId).and(wrapper -> { - wrapper.like("name", value).or().like("content", value); - }); + query.eq("graphspace", graphSpace) + .eq("graph", graph). + eq("type", type).and(wrapper -> { + wrapper.like("name", value).or() + .like("content", value); + }); query.orderBy(true, nameOrderAsc, "name"); return this.mapper.selectPage(page, query); } else if (timeOrderAsc != null) { // order by time assert nameOrderAsc == null; - query.eq("conn_id", connId).and(wrapper -> { - wrapper.like("name", value).or().like("content", value); + query.eq("graphspace", graphSpace) + .eq("graph", graph). + eq("type", type).and(wrapper -> { + wrapper.like("name", value).or() + .like("content", value); }); query.orderBy(true, timeOrderAsc, "create_time"); return this.mapper.selectPage(page, query); } else { // order by relativity assert nameOrderAsc == null && timeOrderAsc == null; - return this.mapper.selectByContentInPage(page, connId, content); + return this.mapper.selectByContentInPage(page, graphSpace, graph , + content, type); } } else { // Select all if (nameOrderAsc != null) { // order by name assert timeOrderAsc == null; - query.eq("conn_id", connId).orderBy(true, nameOrderAsc, "name"); + query.eq("graphspace", graphSpace) + .eq("graph", graph) + .eq("type", type) + .orderBy(true, nameOrderAsc, "name"); return this.mapper.selectPage(page, query); } else { // order by time boolean isAsc = timeOrderAsc != null && timeOrderAsc; - query.eq("conn_id", connId).orderBy(true, isAsc, "create_time"); + query.eq("graphspace", graphSpace) + .eq("graph", graph) + .eq("type", type) + .orderBy(true, isAsc, "create_time"); return this.mapper.selectPage(page, query); } } @@ -89,10 +107,13 @@ public GremlinCollection get(int id) { return this.mapper.selectById(id); } - public GremlinCollection getByName(int connId, String name) { + public GremlinCollection getByName(String graphSpace, String graph, + String name, String type) { QueryWrapper query = Wrappers.query(); - query.eq("conn_id", connId); + query.eq("graphspace", graphSpace); + query.eq("graph", graph); query.eq("name", name); + query.eq("type", type); return this.mapper.selectOne(query); } @@ -120,4 +141,10 @@ public void remove(int id) { throw new InternalException("entity.delete.failed", id); } } + + @Transactional(isolation = Isolation.READ_COMMITTED) + public void deleteByGraph(String graphSpace, String graph) { + this.mapper.deleteByMap(ImmutableMap.of("graphspace", graphSpace, + "graph", graph)); + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/GremlinQueryService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/QueryService.java similarity index 82% rename from hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/GremlinQueryService.java rename to hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/QueryService.java index 359a0bd66..8e30ecbfb 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/GremlinQueryService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/query/QueryService.java @@ -18,30 +18,18 @@ package org.apache.hugegraph.service.query; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; - +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; import org.apache.hugegraph.api.gremlin.GremlinRequest; +// TODO fix import +//import org.apache.hugegraph.client.api.gremlin.GremlinRequest; import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.driver.HugeClient; -import org.apache.hugegraph.entity.query.AdjacentQuery; -import org.apache.hugegraph.entity.query.GraphView; -import org.apache.hugegraph.entity.query.GremlinQuery; -import org.apache.hugegraph.entity.query.GremlinResult; +import org.apache.hugegraph.entity.query.*; import org.apache.hugegraph.entity.query.GremlinResult.Type; -import org.apache.hugegraph.entity.query.JsonView; -import org.apache.hugegraph.entity.query.TableView; -import org.apache.hugegraph.entity.query.TypedResult; import org.apache.hugegraph.entity.schema.VertexLabelEntity; import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.exception.IllegalGremlinException; @@ -49,7 +37,6 @@ import org.apache.hugegraph.exception.ServerException; import org.apache.hugegraph.options.HubbleOptions; import org.apache.hugegraph.rest.ClientException; -import org.apache.hugegraph.service.HugeClientPoolService; import org.apache.hugegraph.service.schema.VertexLabelService; import org.apache.hugegraph.structure.constant.Direction; import org.apache.hugegraph.structure.constant.IdStrategy; @@ -64,15 +51,12 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; - -import lombok.extern.log4j.Log4j2; +import java.util.*; +import java.util.stream.Collectors; @Log4j2 @Service -public class GremlinQueryService { +public class QueryService { private static final Set ILLEGAL_GREMLIN_EXCEPTIONS = ImmutableSet.of( "groovy.lang.MissingPropertyException", @@ -93,16 +77,17 @@ public class GremlinQueryService { @Autowired private HugeConfig config; @Autowired - private HugeClientPoolService poolService; - @Autowired private VertexLabelService vlService; - private HugeClient getClient(int connId) { - return this.poolService.getOrCreate(connId); + public ResultSet executeQueryCount(HugeClient client, String query) { + + log.debug("The original gremlin ==> {}", query); + // Execute gremlin query + ResultSet resultSet = this.executeGremlin(query, client); + return resultSet; } - public GremlinResult executeQuery(int connId, GremlinQuery query) { - HugeClient client = this.getClient(connId); + public GremlinResult executeGremlinQuery(HugeClient client, GremlinQuery query) { log.debug("The original gremlin ==> {}", query.getContent()); String gremlin = this.optimize(query.getContent()); @@ -125,8 +110,72 @@ public GremlinResult executeQuery(int connId, GremlinQuery query) { .build(); } - public Long executeAsyncTask(int connId, GremlinQuery query) { - HugeClient client = this.getClient(connId); + public JsonView executeSingleGremlinQuery(HugeClient client, GremlinQuery query) { + + log.debug("The original gremlin ==> {}", query.getContent()); + String gremlin = this.optimize(query.getContent()); + log.debug("The optimized gremlin ==> {}", gremlin); + // Execute gremlin query + ResultSet resultSet = this.executeGremlin(gremlin, client); + // Scan data, vote the result type + TypedResult typedResult = this.parseResults(resultSet); + // Build json view + JsonView jsonView = new JsonView(typedResult.getData()); + return jsonView; + } + + public GremlinResult executeCypherQuery(HugeClient client, String query) { + // Execute cypher query + ResultSet resultSet = this.executeCypher(query, client); + // Scan data, vote the result type + TypedResult typedResult = this.parseResults(resultSet); + // Build json view + JsonView jsonView = new JsonView(typedResult.getData()); + // Build table view + TableView tableView = this.buildTableView(typedResult); + // Build graph view + GraphView graphView = this.buildGraphView(typedResult, client); + return GremlinResult.builder() + .type(typedResult.getType()) + .jsonView(jsonView) + .tableView(tableView) + .graphView(graphView) + .build(); + } + + private ResultSet executeCypher(String cypher, HugeClient client) { + try { + return client.cypher().cypher(cypher); + } catch (ServerException e) { + String exception = e.exception(); + log.error("Gremlin execute failed: {}", exception); + if (ILLEGAL_GREMLIN_EXCEPTIONS.contains(exception)) { + throw new IllegalGremlinException("gremlin.illegal-statemnt", e, + e.message()); + } + throw new ExternalException("gremlin.execute.failed", e, e.message()); + } catch (ClientException e) { + Throwable cause = e.getCause(); + if (cause != null) { + String message = cause.getMessage(); + if (message != null && message.startsWith(TIMEOUT_EXCEPTION)) { + throw new InternalException("gremlin.execute.timeout", e, + message); + } + if (message != null && message.contains(CONN_REFUSED_MSG)) { + throw new InternalException("gremlin.connection.refused", e, + message); + } + } + throw e; + } catch (Exception e) { + log.error("Gremlin execute failed", e); + throw new ExternalException("gremlin.execute.failed", e, + e.getMessage()); + } + } + + public Long executeGremlinAsyncTask(HugeClient client, GremlinQuery query) { log.debug("The async gremlin ==> {}", query.getContent()); // Execute optimized gremlin query @@ -134,18 +183,24 @@ public Long executeAsyncTask(int connId, GremlinQuery query) { return client.gremlin().executeAsTask(request); } - public GremlinResult expandVertex(int connId, AdjacentQuery query) { - HugeClient client = this.getClient(connId); + public Long executeCypherAsyncTask(HugeClient client, String query) { + + log.debug("The async gremlin ==> {}", query); + // Execute optimized gremlin query + return client.cypher().executeAsTask(query); + } + + public GremlinResult expandVertex(HugeClient client, AdjacentQuery query) { // Build gremlin query - String gremlin = this.buildGremlinQuery(connId, query); + String gremlin = this.buildGremlinQuery(client, query); log.debug("expand vertex gremlin ==> {}", gremlin); // Execute gremlin query ResultSet resultSet = this.executeGremlin(gremlin, client); List vertices = new ArrayList<>(resultSet.size()); List edges = new ArrayList<>(resultSet.size()); - for (Iterator iter = resultSet.iterator(); iter.hasNext(); ) { + for (Iterator iter = resultSet.iterator(); iter.hasNext();) { Path path = iter.next().getPath(); List objects = path.objects(); assert objects.size() == 3; @@ -311,7 +366,7 @@ private TableView buildTableView(TypedResult typedResult) { return new TableView(TableView.PATH_HEADER, paths); default: throw new AssertionError(String.format( - "Unknown result type '%s'", typedResult.getType())); + "Unknown result type '%s'", typedResult.getType())); } } @@ -366,11 +421,11 @@ private GraphView buildGraphView(TypedResult result, HugeClient client) { return new GraphView(vertices.values(), edges.values()); } - private String buildGremlinQuery(int connId, AdjacentQuery query) { + private String buildGremlinQuery(HugeClient client, AdjacentQuery query) { int degreeLimit = this.config.get( - HubbleOptions.GREMLIN_VERTEX_DEGREE_LIMIT); + HubbleOptions.GREMLIN_VERTEX_DEGREE_LIMIT); - Object id = this.getRealVertexId(connId, query); + Object id = this.getRealVertexId(client, query); StringBuilder sb = new StringBuilder("g.V("); // vertex id sb.append(GremlinUtil.escapeId(id)).append(")"); @@ -403,9 +458,9 @@ private String buildGremlinQuery(int connId, AdjacentQuery query) { return sb.toString(); } - private Object getRealVertexId(int connId, AdjacentQuery query) { + private Object getRealVertexId(HugeClient client, AdjacentQuery query) { VertexLabelEntity entity = this.vlService.get(query.getVertexLabel(), - connId); + client); IdStrategy idStrategy = entity.getIdStrategy(); String rawVertexId = query.getVertexId(); try { @@ -453,7 +508,7 @@ private Map edgesOfVertex(TypedResult result, ResultSet resultSet = client.gremlin().gremlin(gremlin).execute(); // The edges count for per vertex Map degrees = new HashMap<>(resultSet.size()); - for (Iterator iter = resultSet.iterator(); iter.hasNext(); ) { + for (Iterator iter = resultSet.iterator(); iter.hasNext();) { Edge edge = iter.next().getEdge(); Object source = edge.sourceId(); Object target = edge.targetId(); @@ -498,7 +553,7 @@ private Map verticesOfEdge(TypedResult result, String ids = StringUtils.join(escapedIds, ","); String gremlin = String.format("g.V(%s)", ids); ResultSet resultSet = client.gremlin().gremlin(gremlin).execute(); - for (Iterator iter = resultSet.iterator(); iter.hasNext(); ) { + for (Iterator iter = resultSet.iterator(); iter.hasNext();) { Vertex vertex = iter.next().getVertex(); vertices.put(vertex.id(), vertex); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/saas/PrometheusService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/saas/PrometheusService.java new file mode 100644 index 000000000..e95a762f6 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/saas/PrometheusService.java @@ -0,0 +1,201 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.saas; + +import lombok.extern.slf4j.Slf4j; +import okhttp3.Response; + +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.rest.AbstractRestClient; +import org.apache.hugegraph.rest.RestResult; +import org.apache.hugegraph.util.HubbleUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author chengxin05 + * @date 2024/3/20 + * @desc PrometheusService.class 作用为请求prometheus上存储的指标数据 + */ + +@Slf4j +@Service +public class PrometheusService { + + private static final String Q_PATH = "/api/v1/query"; + private static final String Q_RANGE_PATH = "api/v1/query_range"; + + @Autowired + private HugeConfig config; + + private MetricsClient client; + + public PrometheusService() { + } + + public PrometheusService(String prometheusUrl) { + client = new MetricsClient(prometheusUrl, 30000); + } + + private MetricsClient getClient() { + if (client == null) { + client = new MetricsClient(config.get(HubbleOptions.PROMETHEUS_URL), + 30000); + } + return client; + } + + public long queryByDelta(String query, long start, long end) { + log.info("queryByDelta: query=[{}] start=[{}], end=[{}]", query, start, end); + return queryByTimestamp(query, end) - queryByTimestamp(query, start); + } + + /** + * 根据时间戳查询当前的统计数据 + * + * @param query promSQL查询语句 + * @param timestamp 时间戳 + * @return 返回查询结果的Map对象 + */ + private long queryByTimestamp(String query, long timestamp) { + Map map = new HashMap<>(); + map.put("query", encodeUrl(query)); + map.put("time", timestamp); + RestResult result = getClient().get(Q_PATH, map); + return extractCount(result.readObject(Map.class)); + } + + /** + * 根据指定范围查询数据 + * + * @param query 查询条件 + * @param from 起始时间戳 + * @param to 结束时间戳 + * @param step 时间步长/s (比如(to-from)=10s, step=2s, 则返回5组数据) + * @return 返回查询结果 + */ + public List> queryByRange(String query, long from, long to, long step) { + log.info("queryByDelta: query=[{}] start=[{}], end=[{}], step=[{}]", query, from, to, step); + Map map = new HashMap<>(); + map.put("query", encodeUrl(query)); + map.put("start", from); + map.put("end", to); + map.put("step", step); + RestResult result = getClient().get(Q_RANGE_PATH, map); + return extractDistribution(result.readObject(Map.class)); + + } + + private List> extractDistribution(Map map) { + List> values = null; + try { + Map map1 = (Map) map.get("data"); + List list = (List) map1.get("result"); + Map map2 = (Map) list.get(0); + values = (List>) map2.get("values"); + } catch (Exception e) { + log.error("extract distribution from prometheus response error"); + } + return values; + } + + /** + * 统计当前日期往前一天的请求量 + * + * @param lastDay eg: 2023-12-06 23:59:59 + * @return + */ + public Long queryCountOffSet1Day(String lastDay) { + long[] timestamps = HubbleUtil.getTimestampsBefore24Hours(lastDay); + String query = "sum(nginx_vts_filter_requests_total{})"; + return queryByDelta(query, timestamps[0], timestamps[1]); + } + + private long extractCount(Map dataMap) { + long count = 0L; + try { + Map map1 = (Map) dataMap.get("data"); + Map map2 = (Map) ((List) map1.get("result")).get(0); + List list = (List) map2.get("value"); + + for (int i = 0; i < list.size(); i++) { + Object obj = list.get(i); + if (obj instanceof String) { + String countS = (String) obj; + count = Long.valueOf(countS.split("\\.")[0]); + break; + } + } + } catch (Exception e) { + log.error("extract count from prometheus response error"); + } + + return count; + } + + private static String encodeUrl(String url) { + // promQL 语法中括号不需要转义 + String encodeUrl = URLEncoder.encode(url, StandardCharsets.UTF_8); + return encodeUrl.replaceAll("%28", "(") + .replaceAll("%29", ")") + .replaceAll("\\+", "%20"); + } +// TODO re-evaluate this change +// private static class MetricsClient extends AbstractRestClient { +// public MetricsClient(String url, int timeout) { +// super(url, timeout); +// } +// +// @Override +// protected void checkStatus(Response response, Response.Status... statuses) { +// +// } +// +// } + + //private static class MetricsClient extends AbstractRestClient { + // public MetricsClient(String url, int timeout) { + // super(url, timeout); + // } + // + // @Override + // protected void checkStatus(jakarta.ws.rs.core.Response response, + // jakarta.ws.rs.core.Response.Status... statuses) { + // + // } + //} + private static class MetricsClient extends AbstractRestClient { + + public MetricsClient(String url, int timeout) { + super(url, timeout); + } + + @Override + protected void checkStatus(Response response, int... ints) { + + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/EdgeLabelService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/EdgeLabelService.java index a43d9dc2d..3edd32a7d 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/EdgeLabelService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/EdgeLabelService.java @@ -30,6 +30,11 @@ import java.util.function.BiFunction; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.schema.ConflictCheckEntity; @@ -46,6 +51,7 @@ import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.exception.ServerException; import org.apache.hugegraph.structure.SchemaElement; +import org.apache.hugegraph.structure.constant.EdgeLabelType; import org.apache.hugegraph.structure.constant.Frequency; import org.apache.hugegraph.structure.schema.EdgeLabel; import org.apache.hugegraph.structure.schema.IndexLabel; @@ -53,9 +59,6 @@ import org.apache.hugegraph.structure.schema.VertexLabel; import org.apache.hugegraph.util.Ex; import org.apache.hugegraph.util.JsonUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import lombok.extern.log4j.Log4j2; @@ -70,17 +73,17 @@ public class EdgeLabelService extends SchemaService { @Autowired private PropertyIndexService piService; - public List list(int connId) { - return this.list(Collections.emptyList(), connId); + public List list(HugeClient client) { + return this.list(Collections.emptyList(), client); } - public List list(Collection names, int connId) { - return this.list(names, connId, true); + public List list(Collection names, + HugeClient client) { + return this.list(names, client, true, null); } - public List list(Collection names, int connId, - boolean emptyAsAll) { - HugeClient client = this.client(connId); + public List list(Collection names, HugeClient client, + boolean emptyAsAll, String type) { List edgeLabels; if (CollectionUtils.isEmpty(names)) { if (emptyAsAll) { @@ -91,21 +94,51 @@ public List list(Collection names, int connId, } else { edgeLabels = client.schema().getEdgeLabels(new ArrayList<>(names)); } + List edgeLabelsQuery = client.schema().getEdgeLabels(); List indexLabels = client.schema().getIndexLabels(); List results = new ArrayList<>(edgeLabels.size()); edgeLabels.forEach(edgeLabel -> { - results.add(convert(edgeLabel, indexLabels)); + if (StringUtils.isEmpty(type) || + (StringUtils.isNotEmpty(type) && + edgeLabel.edgeLabelType() == EdgeLabelType.valueOf(type))) { + EdgeLabelEntity entity = + convert(edgeLabel, indexLabels, client); + + if (edgeLabel.parent()) { + List children = new ArrayList<>(); + for (EdgeLabel edgeLabel1: edgeLabelsQuery) { + if (edgeLabel.name().equals(edgeLabel1.parentLabel())) { + children.add(edgeLabel1.name()); + } + } + entity.setChildren(children); + } + + results.add(entity); + } }); return results; } - public EdgeLabelEntity get(String name, int connId) { - HugeClient client = this.client(connId); + public EdgeLabelEntity get(String name, HugeClient client) { try { EdgeLabel edgeLabel = client.schema().getEdgeLabel(name); List indexLabels = client.schema().getIndexLabels(); - return convert(edgeLabel, indexLabels); + + List edgeLabelsQuery = client.schema().getEdgeLabels(); + EdgeLabelEntity entity = convert(edgeLabel, indexLabels, client); + + if (edgeLabel.parent()) { + List children = new ArrayList<>(); + for (EdgeLabel edgeLabel1: edgeLabelsQuery) { + if (edgeLabel.name().equals(edgeLabel1.parentLabel())) { + children.add(edgeLabel1.name()); + } + } + entity.setChildren(children); + } + return entity; } catch (ServerException e) { if (e.status() == Constant.STATUS_NOT_FOUND) { throw new ExternalException("schema.edgelabel.not-exist", @@ -115,14 +148,14 @@ public EdgeLabelEntity get(String name, int connId) { } } - public void checkExist(String name, int connId) { + public void checkExist(String name, HugeClient client) { // Throw exception if it doesn't exist - this.get(name, connId); + this.get(name, client); } - public void checkNotExist(String name, int connId) { + public void checkNotExist(String name, HugeClient client) { try { - this.get(name, connId); + this.get(name, client); } catch (ExternalException e) { Throwable cause = e.getCause(); if (cause instanceof ServerException && @@ -134,8 +167,7 @@ public void checkNotExist(String name, int connId) { throw new ExternalException("schema.edgelabel.exist", name); } - public void add(EdgeLabelEntity entity, int connId) { - HugeClient client = this.client(connId); + public void add(EdgeLabelEntity entity, HugeClient client) { EdgeLabel edgeLabel = convert(entity, client); try { client.schema().addEdgeLabel(edgeLabel); @@ -147,8 +179,7 @@ public void add(EdgeLabelEntity entity, int connId) { this.piService.addBatch(indexLabels, client); } - public void update(EdgeLabelUpdateEntity entity, int connId) { - HugeClient client = this.client(connId); + public void update(EdgeLabelUpdateEntity entity, HugeClient client) { EdgeLabel edgeLabel = convert(entity, client); // All existed indexlabels @@ -157,8 +188,8 @@ public void update(EdgeLabelUpdateEntity entity, int connId) { List addedIndexLabelNames = entity.getAppendPropertyIndexNames(); List addedIndexLabels = convertIndexLabels( - entity.getAppendPropertyIndexes(), - client, false, entity.getName()); + entity.getAppendPropertyIndexes(), + client, false, entity.getName()); List removedIndexLabelNames = entity.getRemovePropertyIndexes(); @@ -166,8 +197,8 @@ public void update(EdgeLabelUpdateEntity entity, int connId) { for (String name : addedIndexLabelNames) { if (existedIndexLabelNames.contains(name)) { throw new ExternalException( - "schema.edgelabel.update.append-index-existed", - entity.getName(), name); + "schema.edgelabel.update.append-index-existed", + entity.getName(), name); } } } @@ -175,8 +206,8 @@ public void update(EdgeLabelUpdateEntity entity, int connId) { for (String name : removedIndexLabelNames) { if (!existedIndexLabelNames.contains(name)) { throw new ExternalException( - "schema.edgelabel.update.remove-index-unexisted", - entity.getName(), name); + "schema.edgelabel.update.remove-index-unexisted", + entity.getName(), name); } } } @@ -192,29 +223,29 @@ public void update(EdgeLabelUpdateEntity entity, int connId) { this.piService.removeBatch(removedIndexLabelNames, client); } - public void remove(String name, int connId) { - HugeClient client = this.client(connId); + public void remove(String name, HugeClient client) { client.schema().removeEdgeLabelAsync(name); } public ConflictDetail checkConflict(ConflictCheckEntity entity, - int connId, boolean compareEachOther) { + HugeClient client, + boolean compareEachOther) { ConflictDetail detail = new ConflictDetail(SchemaType.EDGE_LABEL); if (CollectionUtils.isEmpty(entity.getElEntities())) { return detail; } Map originElEntities = new HashMap<>(); - for (EdgeLabelEntity e : this.list(connId)) { + for (EdgeLabelEntity e : this.list(client)) { originElEntities.put(e.getName(), e); } this.pkService.checkConflict(entity.getPkEntities(), detail, - connId, compareEachOther); + client, compareEachOther); this.piService.checkConflict(entity.getPiEntities(), detail, - connId, compareEachOther); + client, compareEachOther); this.vlService.checkConflict(entity.getVlEntities(), detail, - connId, compareEachOther); + client, compareEachOther); for (EdgeLabelEntity elEntity : entity.getElEntities()) { // Firstly check if any properties are conflicted if (detail.anyPropertyKeyConflict(elEntity.getPropNames())) { @@ -233,7 +264,7 @@ public ConflictDetail checkConflict(ConflictCheckEntity entity, } // Then check conflict of edge label itself EdgeLabelEntity originElEntity = originElEntities.get( - elEntity.getName()); + elEntity.getName()); ConflictStatus status = SchemaEntity.compare(elEntity, originElEntity); detail.add(elEntity, status); @@ -244,9 +275,8 @@ public ConflictDetail checkConflict(ConflictCheckEntity entity, return detail; } - public void reuse(ConflictDetail detail, int connId) { + public void reuse(ConflictDetail detail, HugeClient client) { Ex.check(!detail.hasConflict(), "schema.cannot-reuse-conflict"); - HugeClient client = this.client(connId); List propertyKeys = this.pkService.filter(detail, client); if (!propertyKeys.isEmpty()) { @@ -315,17 +345,20 @@ public void removeBatch(List edgeLabels, HugeClient client) { removeBatch(names, client, func, SchemaType.EDGE_LABEL); } - private static EdgeLabelEntity convert(EdgeLabel edgeLabel, - List indexLabels) { + private EdgeLabelEntity convert(EdgeLabel edgeLabel, + List indexLabels, + HugeClient client) { if (edgeLabel == null) { return null; } - Set properties = collectProperties(edgeLabel); + Set properties = collectProperties(edgeLabel, client); List propertyIndexes = collectPropertyIndexes(edgeLabel, indexLabels); boolean linkMultiTimes = edgeLabel.frequency() == Frequency.MULTIPLE; return EdgeLabelEntity.builder() .name(edgeLabel.name()) + .parentLabel(edgeLabel.parentLabel()) + .edgeLabelType(edgeLabel.edgeLabelType().string()) .sourceLabel(edgeLabel.sourceLabel()) .targetLabel(edgeLabel.targetLabel()) .linkMultiTimes(linkMultiTimes) @@ -338,34 +371,35 @@ private static EdgeLabelEntity convert(EdgeLabel edgeLabel, .build(); } - private static EdgeLabelStyle getStyle(SchemaElement element) { - String styleValue = (String) element.userdata().get(USER_KEY_STYLE); - if (styleValue != null) { - return JsonUtil.fromJson(styleValue, EdgeLabelStyle.class); - } else { - return new EdgeLabelStyle(); - } - } - private static EdgeLabel convert(EdgeLabelEntity entity, HugeClient client) { if (entity == null) { return null; } Frequency frequency = entity.isLinkMultiTimes() ? Frequency.MULTIPLE : - Frequency.SINGLE; + Frequency.SINGLE; EdgeLabelStyle style = entity.getStyle(); - return client.schema().edgeLabel(entity.getName()) - .sourceLabel(entity.getSourceLabel()) - .targetLabel(entity.getTargetLabel()) - .frequency(frequency) - .properties(toStringArray(entity.getPropNames())) - .sortKeys(toStringArray(entity.getSortKeys())) - .nullableKeys(toStringArray(entity.getNullableProps())) - .enableLabelIndex(entity.isOpenLabelIndex()) - .userdata(USER_KEY_CREATE_TIME, entity.getCreateTime()) - .userdata(USER_KEY_STYLE, JsonUtil.toJson(style)) - .build(); + EdgeLabel.Builder builder = + client.schema().edgeLabel(entity.getName()); + if (EdgeLabelType.valueOf(entity.getEdgeLabelType()).parent()) { + builder.asBase(); + } else { + builder.sourceLabel(entity.getSourceLabel()) + .targetLabel(entity.getTargetLabel()) + .frequency(frequency) + .properties(toStringArray(entity.getPropNames())) + .sortKeys(toStringArray(entity.getSortKeys())) + .nullableKeys(toStringArray(entity.getNullableProps())) + .enableLabelIndex(entity.getOpenLabelIndex()) + .userdata(USER_KEY_CREATE_TIME, entity.getCreateTime()) + .userdata(USER_KEY_STYLE, JsonUtil.toJson(style)); + } + + if (EdgeLabelType.valueOf(entity.getEdgeLabelType()).sub()) { + builder.withBase(entity.getParentLabel()); + } + + return builder.build(); } private static EdgeLabel convert(EdgeLabelUpdateEntity entity, @@ -393,4 +427,13 @@ private static EdgeLabel convert(EdgeLabelUpdateEntity entity, } return edgeLabel; } + + private static EdgeLabelStyle getStyle(SchemaElement element) { + String styleValue = (String) element.userdata().get(USER_KEY_STYLE); + if (styleValue != null) { + return JsonUtil.fromJson(styleValue, EdgeLabelStyle.class); + } else { + return new EdgeLabelStyle(); + } + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/PropertyIndexService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/PropertyIndexService.java index 774d42df5..61b0e0a99 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/PropertyIndexService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/PropertyIndexService.java @@ -28,6 +28,10 @@ import java.util.function.BiFunction; import java.util.stream.Collectors; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.schema.ConflictDetail; @@ -40,10 +44,6 @@ import org.apache.hugegraph.structure.constant.HugeType; import org.apache.hugegraph.structure.schema.IndexLabel; import org.apache.hugegraph.util.PageUtil; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; - import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.extern.log4j.Log4j2; @@ -52,17 +52,17 @@ @Service public class PropertyIndexService extends SchemaService { - public List list(int connId) { - return this.list(Collections.emptyList(), connId); + public List list(HugeClient client) { + return this.list(Collections.emptyList(), client); } - public List list(Collection names, int connId) { - return this.list(names, connId, true); + public List list(Collection names, + HugeClient client) { + return this.list(names, client, true); } - public List list(Collection names, int connId, + public List list(Collection names, HugeClient client, boolean emptyAsAll) { - HugeClient client = this.client(connId); List indexLabels; if (CollectionUtils.isEmpty(names)) { if (emptyAsAll) { @@ -80,9 +80,8 @@ public List list(Collection names, int connId, return results; } - public IPage list(int connId, HugeType type, + public IPage list(HugeClient client, HugeType type, int pageNo, int pageSize) { - HugeClient client = this.client(connId); List indexLabels = client.schema().getIndexLabels(); List results = new ArrayList<>(); @@ -112,18 +111,17 @@ public IPage list(int connId, HugeType type, * --------------+------------------------+--------------------------------- * xxxname | xxxByName | name * --------------+------------------------+--------------------------------- - * | personByName | name + * | personByName | name * person +------------------------+--------------------------------- - * | personByAgeAndName | age name + * | personByAgeAndName | age name * --------------+------------------------+--------------------------------- - * | softwareByName | name + * | softwareByName | name * software +------------------------+--------------------------------- - * | softwareByPriveAndName | price name + * | softwareByPriveAndName | price name * --------------+------------------------+--------------------------------- */ - public IPage list(int connId, HugeType type, String content, - int pageNo, int pageSize) { - HugeClient client = this.client(connId); + public IPage list(HugeClient client, HugeType type, + String content, int pageNo, int pageSize) { List indexLabels = client.schema().getIndexLabels(); Map> matchedResults = new HashMap<>(); @@ -138,10 +136,10 @@ public IPage list(int connId, HugeType type, String content, boolean match = baseValue.contains(content); if (match) { groupedIndexes = matchedResults.computeIfAbsent(baseValue, - k -> new ArrayList<>()); + k -> new ArrayList<>()); } else { groupedIndexes = unMatchResults.computeIfAbsent(baseValue, - k -> new ArrayList<>()); + k -> new ArrayList<>()); } match = match || indexLabel.name().contains(content) || indexLabel.indexFields().stream() @@ -154,12 +152,11 @@ public IPage list(int connId, HugeType type, String content, // Sort matched results by relevance if (!StringUtils.isEmpty(content)) { for (Map.Entry> entry : - matchedResults.entrySet()) { + matchedResults.entrySet()) { List groupedIndexes = entry.getValue(); groupedIndexes.sort(new Comparator() { final int highScore = 2; final int lowScore = 1; - @Override public int compare(PropertyIndex o1, PropertyIndex o2) { int o1Score = 0; @@ -190,8 +187,7 @@ public int compare(PropertyIndex o1, PropertyIndex o2) { return PageUtil.page(all, pageNo, pageSize); } - private PropertyIndex get(String name, int connId) { - HugeClient client = this.client(connId); + private PropertyIndex get(String name, HugeClient client) { try { IndexLabel indexLabel = client.schema().getIndexLabel(name); return convert(indexLabel); @@ -219,14 +215,14 @@ public List removeBatch(List indexLabels, HugeClient client) { } public void checkConflict(List entities, - ConflictDetail detail, int connId, + ConflictDetail detail, HugeClient client, boolean compareEachOther) { if (CollectionUtils.isEmpty(entities)) { return; } Map originEntities = new HashMap<>(); - for (PropertyIndex entity : this.list(connId)) { + for (PropertyIndex entity : this.list(client)) { originEntities.put(entity.getName(), entity); } for (PropertyIndex entity : entities) { @@ -244,11 +240,10 @@ public void checkConflict(List entities, } } - public ConflictStatus checkConflict(PropertyIndex entity, int connId) { - HugeClient client = this.client(connId); + public ConflictStatus checkConflict(PropertyIndex entity, HugeClient client) { String name = entity.getName(); IndexLabel newIndexLabel = convert(entity, client); - IndexLabel oldIndexLabel = convert(this.get(name, connId), client); + IndexLabel oldIndexLabel = convert(this.get(name, client), client); if (oldIndexLabel == null) { return ConflictStatus.PASSED; } else if (isEqual(newIndexLabel, oldIndexLabel)) { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/PropertyKeyService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/PropertyKeyService.java index db5757d6c..999de5fec 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/PropertyKeyService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/PropertyKeyService.java @@ -27,6 +27,9 @@ import java.util.function.BiConsumer; import java.util.stream.Collectors; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.schema.ConflictCheckEntity; @@ -42,8 +45,6 @@ import org.apache.hugegraph.structure.schema.PropertyKey; import org.apache.hugegraph.structure.schema.VertexLabel; import org.apache.hugegraph.util.Ex; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import lombok.extern.log4j.Log4j2; @@ -51,17 +52,18 @@ @Service public class PropertyKeyService extends SchemaService { - public List list(int connId) { - return this.list(Collections.emptyList(), connId); + public List list(HugeClient client) { + return this.list(Collections.emptyList(), client); } - public List list(Collection names, int connId) { - return this.list(names, connId, true); + public List list(Collection names, + HugeClient client) { + return this.list(names, client, true); } - public List list(Collection names, int connId, + public List list(Collection names, + HugeClient client, boolean emptyAsAll) { - HugeClient client = this.client(connId); List propertyKeys; if (CollectionUtils.isEmpty(names)) { if (emptyAsAll) { @@ -79,8 +81,7 @@ public List list(Collection names, int connId, return results; } - public PropertyKeyEntity get(String name, int connId) { - HugeClient client = this.client(connId); + public PropertyKeyEntity get(String name, HugeClient client) { try { PropertyKey propertyKey = client.schema().getPropertyKey(name); return convert(propertyKey); @@ -94,14 +95,27 @@ public PropertyKeyEntity get(String name, int connId) { } } - public void checkExist(String name, int connId) { + public List get(List pks, HugeClient client) { + try { + return client.schema().getPropertyKeys(pks); + } catch (ServerException e) { + if (e.status() == Constant.STATUS_NOT_FOUND) { + throw new ExternalException("schema.propertykey.not-exist", + e, pks); + } + throw new ExternalException("schema.propertykey.get.failed", + e, pks); + } + } + + public void checkExist(String name, HugeClient client) { // Throw exception if it doesn't exist - this.get(name, connId); + this.get(name, client); } - public void checkNotExist(String name, int connId) { + public void checkNotExist(String name, HugeClient client) { try { - this.get(name, connId); + this.get(name, client); } catch (ExternalException e) { Throwable cause = e.getCause(); if (cause instanceof ServerException && @@ -113,14 +127,12 @@ public void checkNotExist(String name, int connId) { throw new ExternalException("schema.propertykey.exist", name); } - public void add(PropertyKeyEntity entity, int connId) { - HugeClient client = this.client(connId); + public void add(PropertyKeyEntity entity, HugeClient client) { PropertyKey propertyKey = convert(entity, client); client.schema().addPropertyKey(propertyKey); } - public void remove(String name, int connId) { - HugeClient client = this.client(connId); + public void remove(String name, HugeClient client) { client.schema().removePropertyKey(name); } @@ -128,8 +140,7 @@ public void remove(String name, int connId) { * Check the property key is being used, used means that there is * any vertex label or edge label contains the property(name) */ - public boolean checkUsing(String name, int connId) { - HugeClient client = this.client(connId); + public boolean checkUsing(String name, HugeClient client) { List vertexLabels = client.schema().getVertexLabels(); for (VertexLabel vertexLabel : vertexLabels) { if (vertexLabel.properties().contains(name)) { @@ -146,26 +157,27 @@ public boolean checkUsing(String name, int connId) { } public ConflictDetail checkConflict(ConflictCheckEntity entity, - int connId, boolean compareEachOther) { + HugeClient client, + boolean compareEachOther) { ConflictDetail detail = new ConflictDetail(SchemaType.PROPERTY_KEY); if (CollectionUtils.isEmpty(entity.getPkEntities())) { return detail; } this.checkConflict(entity.getPkEntities(), detail, - connId, compareEachOther); + client, compareEachOther); return detail; } public void checkConflict(List entities, - ConflictDetail detail, int connId, + ConflictDetail detail, HugeClient client, boolean compareEachOther) { if (CollectionUtils.isEmpty(entities)) { return; } Map originEntities = new HashMap<>(); - for (PropertyKeyEntity entity : this.list(connId)) { + for (PropertyKeyEntity entity : this.list(client)) { originEntities.put(entity.getName(), entity); } // Compare reused entity with origin in target graph @@ -180,10 +192,9 @@ public void checkConflict(List entities, } } - public void reuse(ConflictDetail detail, int connId) { + public void reuse(ConflictDetail detail, HugeClient client) { // Assume that the conflict detail is valid Ex.check(!detail.hasConflict(), "schema.cannot-reuse-conflict"); - HugeClient client = this.client(connId); List propertyKeys = this.filter(detail, client); if (propertyKeys.isEmpty()) { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/SchemaService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/SchemaService.java index 5494625eb..3ef36afd0 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/SchemaService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/SchemaService.java @@ -18,38 +18,29 @@ package org.apache.hugegraph.service.schema; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.stream.Collectors; - +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.log4j.Log4j2; import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.driver.SchemaManager; -import org.apache.hugegraph.entity.schema.ConflictDetail; -import org.apache.hugegraph.entity.schema.ConflictStatus; -import org.apache.hugegraph.entity.schema.Property; -import org.apache.hugegraph.entity.schema.PropertyIndex; -import org.apache.hugegraph.entity.schema.SchemaConflict; -import org.apache.hugegraph.entity.schema.SchemaEntity; -import org.apache.hugegraph.entity.schema.SchemaLabelEntity; -import org.apache.hugegraph.entity.schema.SchemaType; -import org.apache.hugegraph.service.HugeClientPoolService; +import org.apache.hugegraph.entity.schema.*; +import org.apache.hugegraph.exception.InternalException; import org.apache.hugegraph.structure.SchemaElement; +import org.apache.hugegraph.structure.constant.IdStrategy; import org.apache.hugegraph.structure.schema.IndexLabel; +import org.apache.hugegraph.structure.schema.PropertyKey; import org.apache.hugegraph.structure.schema.SchemaLabel; import org.apache.hugegraph.util.HubbleUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import lombok.extern.log4j.Log4j2; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.stream.Collectors; @Log4j2 @Service @@ -61,35 +52,120 @@ public class SchemaService { @Autowired private HugeConfig config; @Autowired - private HugeClientPoolService poolService; + private PropertyKeyService pkService; + @Autowired + private VertexLabelService vlService; + @Autowired + private EdgeLabelService elService; public HugeConfig config() { return this.config; } - public HugeClient client(int connId) { - return this.poolService.getOrCreate(connId); - } - public static List collectNames( - List schemas) { + List schemas) { return schemas.stream().map(SchemaElement::name) .collect(Collectors.toList()); } - public static Set collectProperties(SchemaLabel schemaLabel) { + public SchemaView getSchemaView(HugeClient client){ + List propertyKeys = this.pkService.list(client); + List vertexLabels = this.vlService.list(client); + List edgeLabels = this.elService.list(client); + + List> vertices = new ArrayList<>(vertexLabels.size()); + for (VertexLabelEntity entity : vertexLabels) { + Map vertex = new LinkedHashMap<>(); + vertex.put("id", entity.getName()); + vertex.put("label", entity.getName()); + if (entity.getIdStrategy() == IdStrategy.PRIMARY_KEY) { + vertex.put("primary_keys", entity.getPrimaryKeys()); + } else { + vertex.put("primary_keys", new ArrayList<>()); + } + Map properties = new LinkedHashMap<>(); + this.fillProperties(properties, entity, propertyKeys); + vertex.put("properties", properties); + vertex.put("~style", entity.getStyle()); + vertices.add(vertex); + } + + List> edges = new ArrayList<>(edgeLabels.size()); + for (EdgeLabelEntity entity : edgeLabels) { + Map edge = new LinkedHashMap<>(); + String edgeId = String.format( + "%s-%s->%s", entity.getSourceLabel(), + entity.getName(), entity.getTargetLabel()); + edge.put("id", edgeId); + edge.put("label", entity.getName()); + edge.put("source", entity.getSourceLabel()); + edge.put("target", entity.getTargetLabel()); + if (entity.isLinkMultiTimes()) { + edge.put("sort_keys", entity.getSortKeys()); + } else { + edge.put("sort_keys", new ArrayList<>()); + } + Map properties = new LinkedHashMap<>(); + this.fillProperties(properties, entity, propertyKeys); + edge.put("properties", properties); + edge.put("~style", entity.getStyle()); + edges.add(edge); + } + return new SchemaView(vertices, edges); + } + + @Data + @AllArgsConstructor + public static class SchemaView { + + @JsonProperty("vertices") + private List> vertices; + + @JsonProperty("edges") + private List> edges; + } + + private void fillProperties(Map properties, + SchemaLabelEntity entity, + List propertyKeys) { + for (Property property : entity.getProperties()) { + String name = property.getName(); + PropertyKeyEntity pkEntity = findPropertyKey(propertyKeys, name); + properties.put(name, pkEntity.getDataType().string()); + } + } + private PropertyKeyEntity findPropertyKey(List entities, + String name) { + for (PropertyKeyEntity entity : entities) { + if (entity.getName().equals(name)) { + return entity; + } + } + throw new InternalException("schema.propertykey.not-exist", name); + } + + + public Set collectProperties(SchemaLabel schemaLabel, + HugeClient client) { Set properties = new HashSet<>(); Set nullableKeys = schemaLabel.nullableKeys(); - for (String property : schemaLabel.properties()) { - boolean nullable = nullableKeys.contains(property); - properties.add(new Property(property, nullable)); + List pkNames = + schemaLabel.properties().stream().collect(Collectors.toList()); + if (pkNames.size() == 0) { + return properties; + } + List propertyKeys = this.pkService.get(pkNames, client); + for (PropertyKey pk : propertyKeys) { + boolean nullable = nullableKeys.contains(pk.name()); + properties.add(new Property(pk.name(), nullable, pk.dataType(), + pk.cardinality())); } return properties; } public static List collectPropertyIndexes( - SchemaLabel schemaLabel, - List indexLabels) { + SchemaLabel schemaLabel, + List indexLabels) { List propertyIndexes = new ArrayList<>(); if (indexLabels == null) { return propertyIndexes; @@ -164,7 +240,7 @@ public static List convertIndexLabels(List entities, } public static - void compareWithEachOther(ConflictDetail detail, SchemaType type) { + void compareWithEachOther(ConflictDetail detail, SchemaType type) { List> conflicts = detail.getConflicts(type); for (int i = 0; i < conflicts.size(); i++) { SchemaConflict conflict = conflicts.get(i); @@ -177,8 +253,8 @@ void compareWithEachOther(ConflictDetail detail, SchemaType type) { } public static - ConflictStatus compareWithOthers(int currentIdx, - List> conflicts) { + ConflictStatus compareWithOthers(int currentIdx, + List> conflicts) { SchemaConflict current = conflicts.get(currentIdx); T currentEntity = current.getEntity(); // May changed @@ -204,8 +280,8 @@ ConflictStatus compareWithOthers(int currentIdx, } public static void addBatch( - List schemas, HugeClient client, - BiConsumer func, SchemaType type) { + List schemas, HugeClient client, + BiConsumer func, SchemaType type) { if (CollectionUtils.isEmpty(schemas)) { return; } @@ -220,8 +296,8 @@ public static void addBatch( } public static List addBatch( - List schemas, HugeClient client, - BiFunction func, SchemaType type) { + List schemas, HugeClient client, + BiFunction func, SchemaType type) { List tasks = new ArrayList<>(); if (CollectionUtils.isEmpty(schemas)) { return tasks; @@ -238,8 +314,8 @@ public static List addBatch( } public static List removeBatch( - List names, HugeClient client, - BiFunction func, SchemaType type) { + List names, HugeClient client, + BiFunction func, SchemaType type) { List tasks = new ArrayList<>(); if (CollectionUtils.isEmpty(names)) { return tasks; @@ -264,7 +340,8 @@ public static void removeBatch(List names, HugeClient client, public static Date getCreateTime(SchemaElement element) { Object createTimeValue = element.userdata().get(USER_KEY_CREATE_TIME); if (!(createTimeValue instanceof Long)) { - return new Date(0); + // return new Date(0L); + return HubbleUtil.nowDate(); } return new Date((long) createTimeValue); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/VertexLabelService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/VertexLabelService.java index 0ab420bb5..af79d91db 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/VertexLabelService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/VertexLabelService.java @@ -30,6 +30,10 @@ import java.util.function.BiFunction; import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.schema.ConflictCheckEntity; @@ -52,9 +56,6 @@ import org.apache.hugegraph.structure.schema.VertexLabel; import org.apache.hugegraph.util.Ex; import org.apache.hugegraph.util.JsonUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import lombok.extern.log4j.Log4j2; @@ -67,17 +68,18 @@ public class VertexLabelService extends SchemaService { @Autowired private PropertyIndexService piService; - public List list(int connId) { - return this.list(Collections.emptyList(), connId); + public List list(HugeClient client) { + return this.list(Collections.emptyList(), client); } - public List list(Collection names, int connId) { - return this.list(names, connId, true); + public List list(Collection names, + HugeClient client) { + return this.list(names, client, true); } - public List list(Collection names, int connId, + public List list(Collection names, + HugeClient client, boolean emptyAsAll) { - HugeClient client = this.client(connId); List vertexLabels; if (CollectionUtils.isEmpty(names)) { if (emptyAsAll) { @@ -92,17 +94,16 @@ public List list(Collection names, int connId, List results = new ArrayList<>(vertexLabels.size()); vertexLabels.forEach(vertexLabel -> { - results.add(join(vertexLabel, indexLabels)); + results.add(join(vertexLabel, indexLabels, client)); }); return results; } - public VertexLabelEntity get(String name, int connId) { - HugeClient client = this.client(connId); + public VertexLabelEntity get(String name, HugeClient client) { try { VertexLabel vertexLabel = client.schema().getVertexLabel(name); List indexLabels = client.schema().getIndexLabels(); - return join(vertexLabel, indexLabels); + return join(vertexLabel, indexLabels, client); } catch (ServerException e) { if (e.status() == Constant.STATUS_NOT_FOUND) { throw new ExternalException("schema.vertexlabel.not-exist", @@ -113,14 +114,14 @@ public VertexLabelEntity get(String name, int connId) { } } - public void checkExist(String name, int connId) { + public void checkExist(String name, HugeClient client) { // Throw exception if it doesn't exist - this.get(name, connId); + this.get(name, client); } - public void checkNotExist(String name, int connId) { + public void checkNotExist(String name, HugeClient client) { try { - this.get(name, connId); + this.get(name, client); } catch (ExternalException e) { Throwable cause = e.getCause(); if (cause instanceof ServerException && @@ -132,8 +133,7 @@ public void checkNotExist(String name, int connId) { throw new ExternalException("schema.vertexlabel.exist", name); } - public List getLinkEdgeLabels(String name, int connId) { - HugeClient client = this.client(connId); + public List getLinkEdgeLabels(String name, HugeClient client) { List edgeLabels = client.schema().getEdgeLabels(); List results = new ArrayList<>(); for (EdgeLabel edgeLabel : edgeLabels) { @@ -144,8 +144,7 @@ public List getLinkEdgeLabels(String name, int connId) { return results; } - public void add(VertexLabelEntity entity, int connId) { - HugeClient client = this.client(connId); + public void add(VertexLabelEntity entity, HugeClient client) { VertexLabel vertexLabel = convert(entity, client); try { client.schema().addVertexLabel(vertexLabel); @@ -153,22 +152,26 @@ public void add(VertexLabelEntity entity, int connId) { throw new ExternalException("schema.vertexlabel.create.failed", e, entity.getName()); } - List indexLabels = collectIndexLabels(entity, client); - this.piService.addBatch(indexLabels, client); + try { + List indexLabels = collectIndexLabels(entity, client); + this.piService.addBatch(indexLabels, client); + } catch (Exception e) { + client.schema().removeVertexLabel(vertexLabel.name()); + throw new ExternalException("schema.vertexlabel.create.failed", + e, entity.getName()); + } } - public void update(VertexLabelUpdateEntity entity, int connId) { - HugeClient client = this.client(connId); + public void update(VertexLabelUpdateEntity entity, HugeClient client) { VertexLabel vertexLabel = convert(entity, client); - // All existed indexlabels List existedIndexLabels = client.schema().getIndexLabels(); List existedIndexLabelNames = collectNames(existedIndexLabels); List addedIndexLabelNames = entity.getAppendPropertyIndexNames(); List addedIndexLabels = convertIndexLabels( - entity.getAppendPropertyIndexes(), - client, true, entity.getName()); + entity.getAppendPropertyIndexes(), + client, true, entity.getName()); List removedIndexLabelNames = entity.getRemovePropertyIndexes(); @@ -176,8 +179,8 @@ public void update(VertexLabelUpdateEntity entity, int connId) { for (String name : addedIndexLabelNames) { if (existedIndexLabelNames.contains(name)) { throw new ExternalException( - "schema.vertexlabel.update.append-index-existed", - entity.getName(), name); + "schema.vertexlabel.update.append-index-existed", + entity.getName(), name); } } } @@ -185,8 +188,8 @@ public void update(VertexLabelUpdateEntity entity, int connId) { for (String name : removedIndexLabelNames) { if (!existedIndexLabelNames.contains(name)) { throw new ExternalException( - "schema.vertexlabel.update.remove-index-unexisted", - entity.getName(), name); + "schema.vertexlabel.update.remove-index-unexisted", + entity.getName(), name); } } } @@ -202,13 +205,11 @@ public void update(VertexLabelUpdateEntity entity, int connId) { this.piService.removeBatch(removedIndexLabelNames, client); } - public void remove(String name, int connId) { - HugeClient client = this.client(connId); + public void remove(String name, HugeClient client) { client.schema().removeVertexLabelAsync(name); } - public boolean checkUsing(String name, int connId) { - HugeClient client = this.client(connId); + public boolean checkUsing(String name, HugeClient client) { List edgeLabels = client.schema().getEdgeLabels(); for (EdgeLabel edgeLabel : edgeLabels) { if (edgeLabel.linkedVertexLabel(name)) { @@ -219,30 +220,31 @@ public boolean checkUsing(String name, int connId) { } public ConflictDetail checkConflict(ConflictCheckEntity entity, - int connId, boolean compareEachOther) { + HugeClient client, + boolean compareEachOther) { ConflictDetail detail = new ConflictDetail(SchemaType.VERTEX_LABEL); if (CollectionUtils.isEmpty(entity.getVlEntities())) { return detail; } this.pkService.checkConflict(entity.getPkEntities(), detail, - connId, compareEachOther); + client, compareEachOther); this.piService.checkConflict(entity.getPiEntities(), detail, - connId, compareEachOther); + client, compareEachOther); this.checkConflict(entity.getVlEntities(), detail, - connId, compareEachOther); + client, compareEachOther); return detail; } public void checkConflict(List entities, - ConflictDetail detail, int connId, + ConflictDetail detail, HugeClient client, boolean compareEachOther) { if (CollectionUtils.isEmpty(entities)) { return; } Map originEntities = new HashMap<>(); - for (VertexLabelEntity entity : this.list(connId)) { + for (VertexLabelEntity entity : this.list(client)) { originEntities.put(entity.getName(), entity); } for (VertexLabelEntity entity : entities) { @@ -264,10 +266,9 @@ public void checkConflict(List entities, } } - public void reuse(ConflictDetail detail, int connId) { + public void reuse(ConflictDetail detail, HugeClient client) { // Assume that the conflict detail is valid Ex.check(!detail.hasConflict(), "schema.cannot-reuse-conflict"); - HugeClient client = this.client(connId); List propertyKeys = this.pkService.filter(detail, client); if (!propertyKeys.isEmpty()) { @@ -324,14 +325,16 @@ public void removeBatch(List vertexLabels, HugeClient client) { removeBatch(names, client, func, SchemaType.VERTEX_LABEL); } - private static VertexLabelEntity join(VertexLabel vertexLabel, - List indexLabels) { + private VertexLabelEntity join(VertexLabel vertexLabel, + List indexLabels, + HugeClient client) { if (vertexLabel == null) { return null; } - Set properties = collectProperties(vertexLabel); - List propertyIndexes = collectPropertyIndexes(vertexLabel, - indexLabels); + Set properties = collectProperties(vertexLabel, client); + List propertyIndexes = + collectPropertyIndexes(vertexLabel, + indexLabels); return VertexLabelEntity.builder() .name(vertexLabel.name()) .properties(properties) @@ -365,7 +368,7 @@ private static VertexLabel convert(VertexLabelEntity entity, .properties(toStringArray(entity.getPropNames())) .primaryKeys(toStringArray(entity.getPrimaryKeys())) .nullableKeys(toStringArray(entity.getNullableProps())) - .enableLabelIndex(entity.isOpenLabelIndex()) + .enableLabelIndex(entity.getOpenLabelIndex()) .userdata(USER_KEY_CREATE_TIME, entity.getCreateTime()) .userdata(USER_KEY_STYLE, JsonUtil.toJson(style)) .build(); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/ComputerService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/ComputerService.java new file mode 100644 index 000000000..e7c951e98 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/ComputerService.java @@ -0,0 +1,92 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.space; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.hugegraph.rest.SerializeException; +import org.apache.hugegraph.util.JsonUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.space.ComputerServiceEntity; +import org.apache.hugegraph.structure.Task; +import org.apache.hugegraph.util.PageUtil; + +@Log4j2 +@Service +public class ComputerService { + public IPage queryPage(HugeClient client, + String query, + int pageNo, + int pageSize) { + ArrayList results = new ArrayList(); + List tasks = client.computer().list(500); + tasks.stream().skip(Math.max(pageNo - 1, 0) * pageSize).limit(pageSize) + .forEach((t) -> { + ComputerServiceEntity entity = get(client, t.id()); + results.add(entity); + }); + + int count = tasks.size(); + + return PageUtil.newPage(results, pageNo, pageSize, count); + } + + public ComputerServiceEntity get(HugeClient client, long id) { + return convert(client.computer().get(id)); + } + + public void cancel(HugeClient client, long id) { + client.computer().cancel(id); + } + + protected ComputerServiceEntity convert(Task task) { + ComputerServiceEntity entity = new ComputerServiceEntity(); + entity.setId(task.id()); + entity.setName(task.name()); + entity.setType(task.type()); + entity.setStatus(task.status()); + entity.setProgress(task.progress()); + entity.setDescription(task.description()); + entity.setCreate(task.createTime()); + + if (StringUtils.isNotEmpty(task.input())) { + try { + Map input = JsonUtil.fromJson(task.input(), + Map.class); + + entity.setAlgorithm(input.get("algorithm").toString()); + entity.setInput(input.get("params").toString()); + } catch (SerializeException e) { + log.info("load task.input error", e); + } + } + return entity; + } + + public void delete(HugeClient client, long id) { + client.computer().delete(id); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/GraphSpaceService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/GraphSpaceService.java new file mode 100644 index 000000000..c3847f9d2 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/GraphSpaceService.java @@ -0,0 +1,335 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.space; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.hugegraph.api.task.TasksWithPage; +// TODO fix import +//import org.apache.hugegraph.client.api.task.TasksWithPage; +import org.apache.hugegraph.common.Constant; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.space.GraphSpaceEntity; +import org.apache.hugegraph.exception.InternalException; +import org.apache.hugegraph.service.auth.UserService; +import org.apache.hugegraph.service.graphs.GraphsService; +import org.apache.hugegraph.structure.Task; +import org.apache.hugegraph.structure.space.GraphSpace; +import org.apache.hugegraph.structure.space.SchemaTemplate; +import org.apache.hugegraph.util.GremlinUtil; +import org.apache.hugegraph.util.HubbleUtil; +import org.apache.hugegraph.util.Log; +import org.apache.hugegraph.util.PageUtil; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class GraphSpaceService { + + private static final Logger LOG = Log.logger(GraphSpaceService.class); + + @Autowired + private UserService userService; + + @Autowired + private GraphsService graphsService; + + /** + * 统计所有图空间总数、图总数 统计顶点总数和边总数、顶点类型及边类型总数、前一天执行任务个数 + * + * @param client hugegraph-client + * @return 统计结果集 + */ + public Map metrics(HugeClient client) { + long gsCount = 0L; + long gCount = 0L; + long vCount = 0L; + long eCount = 0L; + long vlCount = 0L; + long elCount = 0L; + long preDayTaskCount = 0L; + try { + List graphSpaces = this.listAll(client); + gsCount = graphSpaces.size(); + + for (String gs : graphSpaces) { + Map ev = evCount(client, gs); + Map elVl = elAndVlCount(client, gs); + Map task = preDayTaskCount(client, gs); + + vCount += (Long) ev.get("vertex"); + eCount += (Long) ev.get("edge"); + vlCount += (Long) elVl.get("vertexlabel"); + elCount += (Long) elVl.get("edgelabel"); + preDayTaskCount += (Long) task.get("task"); + + gCount += Long.valueOf( + graphsService.listGraphNames(client, gs, "").size()); + } + } catch (Exception e) { + LOG.error("Failed to get saas metrics, caused by"); + e.printStackTrace(); + throw e; + } + + HashMap res = new HashMap<>(); + res.put("gsCount", gsCount); + res.put("gCount", gCount); + res.put("vCount", vCount); + res.put("eCount", eCount); + res.put("vlCount", vlCount); + res.put("elCount", elCount); + res.put("preDayTaskCount", preDayTaskCount); + return res; + } + + + public IPage> queryPage(HugeClient client, String query, + String createTime, int pageNo, int pageSize) { + List> results = + queryAllGs(client, query, createTime); + return PageUtil.page(results, pageNo, pageSize); + } + + public List> queryAllGs(HugeClient client, String query, + String createTime) { + List> results = + client.graphSpace().listProfile(query).stream() + .filter((s) -> s.get("create_time").toString() + .compareTo(createTime) > 0) + .collect(Collectors.toList()); + // 将DEFAULT和neizhianli的图空间排在前面, 其他图空间按字母序排序 + Collections.sort(results, + (a, b) -> new BuiltInFirst().compare(a.get("name").toString(), + b.get("name").toString())); + for (Map info : results) { + String name = info.get("name").toString(); + info.put("graphspace_admin", + userService.listGraphSpaceAdmin(client, name)); + Map statisticTotal = evCount(client, name); + info.put("statistic", statisticTotal); + } + return results; + } + + /** + * 统计指定图空间下的顶点总数和边总数 + * @param client + * @param graphSpace + * @return + */ + private Map evCount(HugeClient client, String graphSpace) { + long vertexTotal = 0L; + long edgeTotal = 0L; + Map statisticTotal = new HashMap<>(); + client.assignGraph(graphSpace, ""); + Set graphs = graphsService.listGraphNames(client, graphSpace, ""); + String statisticDate = HubbleUtil.dateFormatDay(HubbleUtil.nowDate()); + for (String graph : graphs) { + Map graphEvCount = + graphsService.evCount(client, graphSpace, graph); + + vertexTotal += (long) graphEvCount.get("vertex"); + edgeTotal += (long) graphEvCount.get("edge"); + } + statisticTotal.put("date", HubbleUtil.dateFormatDay(statisticDate)); + statisticTotal.put("vertex", vertexTotal); + statisticTotal.put("edge", edgeTotal); + return statisticTotal; + } + + + /** + * 统计指定图空间下的edgeLabel总数和vertexLabel边总数 + * @param client + * @param graphSpace + * @return + */ + private Map elAndVlCount(HugeClient client, + String graphSpace) { + Map result = new HashMap<>(); + Set graphs = + graphsService.listGraphNames(client, graphSpace, ""); + long vlCount = 0L; + long elCount = 0L; + for (String graph : graphs) { + client.assignGraph(graphSpace, graph); + vlCount += client.schema().getVertexLabels().size(); + elCount += client.schema().getEdgeLabels().size(); + } + + result.put("vertexlabel", vlCount); + result.put("edgelabel", elCount); + return result; + } + + /** + * 前一天的执行任务数 + * + * @param client + * @param graphSpace + * @return + */ + private Map preDayTaskCount(HugeClient client, + String graphSpace) { + LOG.info("Task count in [{}]", graphSpace); + String lastDay = HubbleUtil.dateFormatLastDay(); + Date start = null; + Date end = null; + try { + SimpleDateFormat simpleDateFormat = + new SimpleDateFormat("yyyyMMdd HH:mm:ss"); + start = simpleDateFormat.parse(lastDay + " 00:00:00"); + end = simpleDateFormat.parse(lastDay + " 23:59:59"); + } catch (ParseException e) { + throw new InternalException("parse date error" + e.getMessage()); + } + + Map result = new HashMap<>(); + Set graphs = + graphsService.listGraphNames(client, graphSpace, ""); + long preDayTaskCount = 0L; + for (String graph : graphs) { + client.assignGraph(graphSpace, graph); + String page = ""; + while (page != null) { + TasksWithPage pageTask = + client.task().list(null, page, 1000); + for (Task task : pageTask.tasks()) { + if (task.createTime() >= start.getTime() && + task.createTime() <= end.getTime()) { + preDayTaskCount += 1; + } + } + page = pageTask.page(); + } + } + result.put("task", preDayTaskCount); + return result; + } + + public boolean isAuth(HugeClient client, String graphSpace) { + GraphSpace space = getWithoutAdmins(client, graphSpace); + + return space.isAuth(); + } + + public List listAll(HugeClient client) { + List result = client.graphSpace().listGraphSpace().stream() + .collect(Collectors.toList()); + Collections.sort(result, (a, b) -> new BuiltInFirst().compare(a, b)); + return result; + } + + public GraphSpace getWithoutAdmins(HugeClient authClient, + String graphspace) { + GraphSpace space = authClient.graphSpace().getGraphSpace(graphspace); + if (space == null) { + throw new InternalException("graphspace.get.{} Not Exits", + graphspace); + } + + return space; + } + + public GraphSpaceEntity getWithAdmins(HugeClient authClient, String graphspace) { + GraphSpace space = authClient.graphSpace().getGraphSpace(graphspace); + if (space == null) { + throw new InternalException("graphspace.get.{} Not Exits", + graphspace); + } + + GraphSpaceEntity graphSpaceEntity + = GraphSpaceEntity.fromGraphSpace(space); + + if (authClient.auth().isSuperAdmin()) { + graphSpaceEntity.graphspaceAdmin = + userService.listGraphSpaceAdmin(authClient, graphspace); + } + graphSpaceEntity.setStatistic(evCount(authClient, graphspace)); + + return graphSpaceEntity; + } + + public void delete(HugeClient authClient, String graphspace) { + authClient.graphSpace() + .deleteGraphSpace(graphspace); + } + + public Object create(HugeClient authClient, GraphSpace graphSpace) { + return authClient.graphSpace().createGraphSpace(graphSpace); + } + + public GraphSpace update(HugeClient authClient, GraphSpace graphSpace) { + return authClient.graphSpace().updateGraphSpace(graphSpace); + } + + public Map setdefault(HugeClient authClient, String graphSpace) { + return authClient.graphSpace().setDefault(graphSpace); + } + + public Map getdefault(HugeClient authClient) { + return authClient.graphSpace().getDefault(); + } + + public void initBuiltIn(HugeClient client) { + String builtInStr = Constant.BUILT_IN; + GraphSpace builtIn = new GraphSpace(builtInStr); + builtIn.setNickname("内置案例"); + builtIn.setDescription("内置案例"); + builtIn.setMaxGraphNumber(100); + builtIn.setCpuLimit(1000); + builtIn.setStorageLimit(1000); + builtIn.setMemoryLimit(1024); + builtIn.setOlapNamespace("built_in"); + builtIn.setOltpNamespace("built_in"); + + List spaces = client.graphSpace().listGraphSpace(); + if (spaces.contains(builtInStr)) { + client.graphSpace().deleteGraphSpace(builtInStr); + } + client.graphSpace().createGraphSpace(builtIn); + + client.assignGraph(builtInStr, null); + SchemaTemplate schemaTemplate = new SchemaTemplate("hlm", + GremlinUtil.GREMLIN_HLM_SCHEMA); + client.schemaTemplateManager().createSchemaTemplate(schemaTemplate); + + schemaTemplate = new SchemaTemplate("covid19", + GremlinUtil.GREMLIN_COVID19_SCHEMA); + client.schemaTemplateManager().createSchemaTemplate(schemaTemplate); + } + + private class BuiltInFirst implements Comparator { + @Override + public int compare(String o1, String o2) { + if (Constant.BUILT_IN.equals(o2)) { + return 1; + } else if (Constant.BUILT_IN.equals(o1)) { + return -1; + } + return o1.compareTo(o2); + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/HStoreService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/HStoreService.java new file mode 100644 index 000000000..5bee38319 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/HStoreService.java @@ -0,0 +1,45 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.space; + +import java.util.ArrayList; +import java.util.List; + +import com.baomidou.mybatisplus.core.metadata.IPage; + +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.structure.space.HStoreNodeInfo; +import org.apache.hugegraph.util.PageUtil; +import org.springframework.stereotype.Service; + +@Service +public class HStoreService { + public IPage listPage(HugeClient client, int pageNo, + int pageSize) { + List nodeNames = client.hStoreManager().list(); + List result = new ArrayList<>(nodeNames.size()); + nodeNames.stream().sorted().forEach(node -> { + HStoreNodeInfo nodeInfo = client.hStoreManager() + .get(node); + result.add(nodeInfo); + }); + + return PageUtil.page(result, pageNo, pageSize); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/OLTPServerService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/OLTPServerService.java new file mode 100644 index 000000000..d725ee9c6 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/OLTPServerService.java @@ -0,0 +1,113 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.space; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.driver.factory.PDHugeClientFactory; +import org.apache.hugegraph.options.HubbleOptions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.metadata.IPage; + +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.util.PageUtil; +import org.apache.hugegraph.structure.space.OLTPService; +import org.springframework.util.CollectionUtils; + +@Service +public class OLTPServerService { + + @Autowired + protected String cluster; + @Autowired(required = false) + PDHugeClientFactory pdHugeClientFactory; + @Autowired + private HugeConfig config; + + public IPage queryPage(HugeClient client, String query, + int pageNo, int pageSize) { + List serviceNames = client.serviceManager().listService(); + List result = serviceNames.stream().filter(s -> s.contains(query)).sorted() + .map((s) -> get(client, s)) + .collect(Collectors.toList()); + + return PageUtil.page(result, pageNo, pageSize); + } + + public Object get(HugeClient client, String serviceName) { + // 获取当前所属图空间 + String graphSpace = client.getGraphSpaceName(); + OLTPService service = client.serviceManager().getService(serviceName); + + // 通过PD, 获取当前service可用URL, 判断当前服务是否存活 + List urls; + boolean pdEnabled = config.get(HubbleOptions.PD_ENABLED); + if (pdEnabled && pdHugeClientFactory != null) { + urls = pdHugeClientFactory.getURLs(cluster, graphSpace, serviceName); + urls = urls.stream().distinct().collect(Collectors.toList()); + } else { + urls = Collections.emptyList(); + } + + // service使用pd中的urls + service.setUrls(urls); + + if (!service.checkIsK8s()) { + // manual service: 通过PD判断当前服务状态 + // 设置当前运行节点数 + service.setRunning((int) urls.size()); + + if (!CollectionUtils.isEmpty(urls)) { + service.setStatus(OLTPService.ServiceStatus.RUNNING); + } else { + service.setStatus(OLTPService.ServiceStatus.STOPPED); + } + } + + return service; + } + + public Object create(HugeClient client, OLTPService service) { + return client.serviceManager().addService(service); + } + + public void delete(HugeClient client, String service) { + client.serviceManager().delService(service, "I'm sure to delete the service"); + } + + public Object update(HugeClient client, OLTPService service) { + return client.serviceManager().updateService(service); + } + + public void start(HugeClient client, String service) { + client.serviceManager().startService(service); + } + + public void stop(HugeClient client, String service) { + client.serviceManager().stopService(service); + } + + public List configOptionList(HugeClient client) { + return client.serviceManager().configOptinList(); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/SchemaTemplateService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/SchemaTemplateService.java new file mode 100644 index 000000000..5d18d09f3 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/SchemaTemplateService.java @@ -0,0 +1,68 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.space; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.stereotype.Service; + +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.structure.space.SchemaTemplate; +import org.apache.hugegraph.util.PageUtil; + +@Service +public class SchemaTemplateService { + + public List listName(HugeClient client) { + return client.schemaTemplateManager().listSchemTemplate(); + } + + public IPage queryPage(HugeClient client, String query, int pageNo, + int pageSize) { + List names = client.schemaTemplateManager().listSchemTemplate(); + + List results = + names.stream().filter((s) -> s.contains(query)).sorted() + .map((s) -> client.schemaTemplateManager() + .getSchemaTemplate(s) + ).collect(Collectors.toList()); + + return PageUtil.page(results, pageNo, pageSize); + } + + public Map get(HugeClient client, String name) { + return client.schemaTemplateManager().getSchemaTemplate(name); + } + + public Map create(HugeClient client, SchemaTemplate schemaTemplate) { + return client.schemaTemplateManager().createSchemaTemplate(schemaTemplate); + } + + public void delete(HugeClient client, String name) { + client.schemaTemplateManager().deleteSchemaTemplate(name); + } + + public Map update(HugeClient client, + SchemaTemplate schemaTemplate) { + return client.schemaTemplateManager().updateSchemaTemplate(schemaTemplate); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/VermeerService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/VermeerService.java new file mode 100644 index 000000000..9b756f470 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/VermeerService.java @@ -0,0 +1,121 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.service.space; + +import com.google.common.collect.ImmutableMap; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; +import org.apache.hugegraph.client.RestClient; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.driver.HugeClientBuilder; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.util.E; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +@Log4j2 +@Service +public class VermeerService { + @Autowired + private HugeConfig config; + + private static final String GET_SYS_CFG = "api/v1.0/memt_clu/config/getsyscfg"; + + public boolean isVermeerEnabled(String username, String password) { + Map vermeer = this.getVermeer(username, password, + false); + if (vermeer != null) { + return (Boolean) vermeer.get("enable"); + } + return false; + } + + public Map getVermeer(String username, String password, + boolean throwIfNoConfig) { + String dashboard = config.get(HubbleOptions.DASHBOARD_ADDRESS); + String protocol = config.get(HubbleOptions.SERVER_PROTOCOL); + if (throwIfNoConfig) { + E.checkArgument(StringUtils.isNotEmpty(dashboard), + "Please set 'dashboard.address' in config file " + + "conf/hugegraph-hubble.properties."); + } else if (StringUtils.isEmpty(dashboard)) { + return ImmutableMap.of("enable", false); + } + HugeClientBuilder builder = HugeClient.builder(protocol + "://" + dashboard, + null, + null, + true) + .configUser(username, password); + RestClient client = new RestClient(builder.url(), builder.token(), + builder.timeout(), + builder.maxConns(), + builder.maxConnsPerRoute(), + builder.trustStoreFile(), + builder.trustStorePassword()); + Map sertMap = ImmutableMap.of("sertype", "vermeer"); + boolean enable = false; + try { + Map result = client.post(GET_SYS_CFG, sertMap).readObject(Map.class); + Map data = (Map) result.get("data"); + if (data == null || data.isEmpty()) { + enable = false; + } else { + enable = "true".equals(data.get("cfgvalue")); + } + client.close(); + } catch (Exception e) { + log.info(e.getMessage()); + enable = false; + } + return ImmutableMap.of("enable", enable); + } + + public Map load(HugeClient client, + String graphspace, String graph, String taskType, + Map params) { + Map jsonTask = new HashMap<>(); + jsonTask.put("task_type", taskType); + jsonTask.put("graph", convert2VG(graphspace, graph)); + jsonTask.put("params", params); + return client.vermeer().post(jsonTask); + } + + public Map compute(HugeClient client, + String graphspace, String graph, + Map params) { + Map jsonTask = new HashMap<>(); + jsonTask.put("task_type", "compute"); + jsonTask.put("graph", convert2VG(graphspace, graph)); + jsonTask.put("params", params); + return client.vermeer().post(jsonTask); + } + + public void deleteGraph(HugeClient client, String graphspace, + String graph) { + client.vermeer().deleteGraphByName(convert2VG(graphspace, graph)); + } + + public String convert2VG(String space, String graph) { + return space + "-" + graph; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/ESUtil.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/ESUtil.java new file mode 100644 index 000000000..b4a09b2e3 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/ESUtil.java @@ -0,0 +1,60 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.util; + +import org.apache.commons.lang3.StringUtils; + +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Map; + +public class ESUtil { + public static Object getValueByPath(Map map, + String[] keys) { + if (keys.length == 1) { + return map.getOrDefault(keys[0], null); + } else { + Object data1 = map.get(keys[0]); + if (data1 instanceof Map) { + return getValueByPath((Map) data1, + Arrays.copyOfRange(keys, 1, + keys.length)); + } + + return data1; + } + } + + public static String parseTimestamp(String esTimestatmp) { + // 转换ES中的@timestamp为当前时区时间戳 + if (StringUtils.isEmpty(esTimestatmp)) { + return null; + } + ZonedDateTime dateTime = + ZonedDateTime.parse(esTimestatmp, + DateTimeFormatter.ISO_DATE_TIME); + dateTime = dateTime.withZoneSameInstant(ZoneId.systemDefault()); + + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd " + + "HH:mm:ss"); + return dateTime.format(dtf); + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/EntityUtil.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/EntityUtil.java index 68139a607..21c838975 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/EntityUtil.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/EntityUtil.java @@ -18,12 +18,12 @@ package org.apache.hugegraph.util; -import java.lang.reflect.Field; - import org.apache.hugegraph.annotation.MergeProperty; import org.apache.hugegraph.common.Mergeable; import org.apache.hugegraph.exception.InternalException; +import java.lang.reflect.Field; + public final class EntityUtil { @SuppressWarnings("unchecked") diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/Ex.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/Ex.java index e988a4f6d..8ea75869c 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/Ex.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/Ex.java @@ -18,11 +18,11 @@ package org.apache.hugegraph.util; -import java.util.concurrent.Callable; - import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.exception.InternalException; +import java.util.concurrent.Callable; + public final class Ex { public static void check(boolean expression, String message, diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/FileUtil.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/FileUtil.java index 876b850a4..1157542ae 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/FileUtil.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/FileUtil.java @@ -38,7 +38,7 @@ public static int countLines(String path) { public static int countLines(File file) { if (!file.exists()) { throw new IllegalArgumentException(String.format( - "The file %s doesn't exist", file)); + "The file %s doesn't exist", file)); } long fileLength = file.length(); try (FileInputStream fis = new FileInputStream(file); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/GremlinUtil.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/GremlinUtil.java index 352e1fc0c..03b7fc9b2 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/GremlinUtil.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/GremlinUtil.java @@ -63,6 +63,235 @@ public final class GremlinUtil { Pattern.compile("^\\s*//.*") ); + public static final String GREMLIN_HLM_SCHEMA = + "graph.schema().propertyKey('姓名').asText().ifNotExist().create();\n" + + "graph.schema().propertyKey('性别').asText().ifNotExist().create();\n" + + "graph.schema().propertyKey('年龄').asInt().ifNotExist().create();\n" + + "graph.schema().propertyKey('特点').asText().ifNotExist().create();\n" + + "graph.schema().propertyKey('亲疏').asText().ifNotExist().create();\n" + + "\n" + + "graph.schema().vertexLabel('男人')" + + ".properties('姓名', '性别', '年龄', '特点', '亲疏')" + + ".primaryKeys('姓名').ifNotExist().create();\n" + + "graph.schema().vertexLabel('女人')" + + ".properties('姓名', '性别', '年龄', '特点', '亲疏')" + + ".primaryKeys('姓名').ifNotExist().create();\n" + + "graph.schema().vertexLabel('机构')" + + ".properties('姓名', '特点', '亲疏')" + + ".primaryKeys('姓名').ifNotExist().create();\n" + + "\n" + + "graph.schema().edgeLabel('父子').sourceLabel('男人')" + + ".targetLabel('男人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('父女').sourceLabel('男人')" + + ".targetLabel('女人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('母子').sourceLabel('女人')" + + ".targetLabel('男人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('母女').sourceLabel('女人')" + + ".targetLabel('女人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('妻').sourceLabel('男人')" + + ".targetLabel('女人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('妾').sourceLabel('男人')" + + ".targetLabel('女人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('相恋').sourceLabel('男人')" + + ".targetLabel('女人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('朋友').sourceLabel('男人')" + + ".targetLabel('女人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('姐妹').sourceLabel('女人')" + + ".targetLabel('女人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('丫环').sourceLabel('男人')" + + ".targetLabel('女人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('丫头').sourceLabel('女人')" + + ".targetLabel('女人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('兵部指挥').sourceLabel('机构')" + + ".targetLabel('男人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('巡盐御史').sourceLabel('机构')" + + ".targetLabel('男人').ifNotExist().create();\n" + + "graph.schema().edgeLabel('尚书令').sourceLabel('机构')" + + ".targetLabel('男人').ifNotExist().create();\n\n\n"; + public static final String GREMLIN_HLM_DATA = + "jiataigong = graph.addVertex(T.label, '男人', '姓名', '贾太公', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'o-l5');\n" + + "jiayan = graph.addVertex(T.label, '男人', '姓名', '贾演', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'o-l6');\n" + + "jiadaihua = graph.addVertex(T.label, '男人', '姓名', '贾代化', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'o-l5');\n" + + "jiayuan = graph.addVertex(T.label, '男人', '姓名', '贾源', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'o-l4');\n" + + "jiadaishan = graph.addVertex(T.label, '男人', '姓名', '贾代善', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'o-l3');\n" + + "jiamu = graph.addVertex(T.label, '女人', '姓名', '贾母', " + + "'性别', '女', '年龄', 0, '特点', '史太君,老祖宗', '亲疏', 'o-l3');\n" + + "jiajing = graph.addVertex(T.label, '男人', '姓名', '贾敬', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'o-l5');\n" + + "jiazhen = graph.addVertex(T.label, '男人', '姓名', '贾珍', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'm-l4');\n" + + "youdajie = graph.addVertex(T.label, '女人', '姓名', '尤氏', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'm-l4');\n" + + "jiarong = graph.addVertex(T.label, '男人', '姓名', '贾蓉', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'y-l3');\n" + + "qingkeqing = graph.addVertex(T.label, '女人', '姓名', '秦可卿', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'y-l3');\n" + + "jiashe = graph.addVertex(T.label, '男人', '姓名', '贾赦', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'o-l4');\n" + + "jialian = graph.addVertex(T.label, '男人', '姓名', '贾琏', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'm-l3');\n" + + "wangxifeng = graph.addVertex(T.label, '女人', '姓名', '王熙凤', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'm-l2');\n" + + "youerjie = graph.addVertex(T.label, '女人', '姓名', '尤二姐', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'm-l3');\n" + + "pinger = graph.addVertex(T.label, '女人', '姓名', '平儿', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'y-l3');\n" + + "qiutong = graph.addVertex(T.label, '女人', '姓名', '秋桐', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'y-l3');\n" + + "jiayingchun = graph.addVertex(T.label, '女人', '姓名', '贾迎春', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'y-l3');\n" + + "sunshaozu = graph.addVertex(T.label, '男人', '姓名', '孙绍祖', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'y-l3');\n" + + "jiazheng = graph.addVertex(T.label, '男人', '姓名', '贾政', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'm-l2');\n" + + "wangfuren = graph.addVertex(T.label, '女人', '姓名', '王夫人', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'm-l2');\n" + + "zhaoyiniang = graph.addVertex(T.label, '女人', '姓名', '赵姨娘', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'm-l4');\n" + + "jiahuan = graph.addVertex(T.label, '男人', '姓名', '贾环', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'y-l4');\n" + + "jiatanchun = graph.addVertex(T.label, '女人', '姓名', '贾探春', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'y-l4');\n" + + "jiayuanchun = graph.addVertex(T.label, '女人', '姓名', '贾元春', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'y-l3');\n" + + "jiazhu = graph.addVertex(T.label, '男人', '姓名', '贾珠', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'y-l3');\n" + + "liwan = graph.addVertex(T.label, '女人', '姓名', '李纨', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'm-l3');\n" + + "jialan = graph.addVertex(T.label, '男人', '姓名', '贾兰', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'b-l4');\n" + + "jiabaoyu = graph.addVertex(T.label, '男人', '姓名', '贾宝玉', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'y-l1');\n" + + "xuebaochai = graph.addVertex(T.label, '女人', '姓名', '薛宝钗', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'y-l2');\n" + + "jiamin = graph.addVertex(T.label, '女人', '姓名', '贾敏', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'm-l3');\n" + + "linruhai = graph.addVertex(T.label, '男人', '姓名', '林如海', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'm-l3');\n" + + "lindaiyu = graph.addVertex(T.label, '女人', '姓名', '林黛玉', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'y-l1');\n" + + "shihou = graph.addVertex(T.label, '男人', '姓名', '史候', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'o-l6');\n" + + "shigong = graph.addVertex(T.label, '男人', '姓名', '史公', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'o-l5');\n" + + "shiba = graph.addVertex(T.label, '男人', '姓名', '史氏', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'o-l4');\n" + + "shinai = graph.addVertex(T.label, '男人', '姓名', '史鼐', " + + "'性别', '男', '年龄', 0, '特点', '保龄侯', '亲疏', 'o-l4');\n" + + "shiding = graph.addVertex(T.label, '男人', '姓名', '史鼎', " + + "'性别', '男', '年龄', 0, '特点', '忠靖侯', '亲疏', 'o-l4');\n" + + "shixiangyun = graph.addVertex(T.label, '女人', '姓名', '史湘云', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'y-l3');\n" + + "weiruolan = graph.addVertex(T.label, '男人', '姓名', '卫若兰', " + + "'性别', '男', '年龄', 0, '特点', '-', '亲疏', 'm-l4');\n" + + "xueyima = graph.addVertex(T.label, '女人', '姓名', '薛姨妈', " + + "'性别', '女', '年龄', 0, '特点', '-', '亲疏', 'm-l3');\n" + + "\n" + + "jiataigong.addEdge('父子', jiayan);\n" + + "jiataigong.addEdge('父子', jiayuan);\n" + + "jiayan.addEdge('父子', jiadaihua);\n" + + "jiayuan.addEdge('父子', jiadaishan);\n" + + "jiadaishan.addEdge('妻', jiamu);\n" + + "jiadaihua.addEdge('父子', jiajing);\n" + + "jiajing.addEdge('父子', jiazhen);\n" + + "jiazhen.addEdge('父子', jiarong);\n" + + "jiazhen.addEdge('妾', youdajie);\n" + + "jiarong.addEdge('妻', qingkeqing);\n" + + "jiashe.addEdge('父子', jialian);\n" + + "jialian.addEdge('妻', wangxifeng);\n" + + "jialian.addEdge('妾', youerjie);\n" + + "jialian.addEdge('妾', pinger);\n" + + "jialian.addEdge('妾', qiutong);\n" + + "wangxifeng.addEdge('丫头', pinger);\n" + + "jiashe.addEdge('丫环', qiutong);\n" + + "youdajie.addEdge('姐妹', youerjie);\n" + + "jiashe.addEdge('父女', jiayingchun);\n" + + "sunshaozu.addEdge('妻', jiayingchun);\n" + + "jiazheng.addEdge('妻', wangfuren);\n" + + "jiazheng.addEdge('妾', zhaoyiniang);\n" + + "zhaoyiniang.addEdge('母子', jiahuan);\n" + + "zhaoyiniang.addEdge('母女', jiatanchun);\n" + + "wangfuren.addEdge('母女', jiayuanchun);\n" + + "wangfuren.addEdge('母子', jiazhu);\n" + + "jiazhu.addEdge('妻', liwan);\n" + + "jiazhu.addEdge('父子', jialan);\n" + + "liwan.addEdge('母子', jialan);\n" + + "wangfuren.addEdge('母子', jiabaoyu);\n" + + "jiabaoyu.addEdge('妻', xuebaochai);\n" + + "linruhai.addEdge('妻', jiamin);\n" + + "linruhai.addEdge('父女', lindaiyu);\n" + + "jiamin.addEdge('母女', lindaiyu);\n" + + "jiabaoyu.addEdge('相恋', lindaiyu);\n" + + "jiamu.addEdge('母子', jiashe);\n" + + "jiamu.addEdge('母子', jiazheng);\n" + + "jiamu.addEdge('母女', jiamin);\n" + + "jiadaishan.addEdge('父子', jiashe);\n" + + "jiadaishan.addEdge('父子', jiazheng);\n" + + "jiadaishan.addEdge('父女', jiamin);\n" + + "shihou.addEdge('父子', shigong);\n" + + "shigong.addEdge('父子', shiba);\n" + + "shigong.addEdge('父子', shinai);\n" + + "shigong.addEdge('父子', shiding);\n" + + "shigong.addEdge('父女', jiamu);\n" + + "shiba.addEdge('父女', shixiangyun);\n" + + "weiruolan.addEdge('妻', shixiangyun);\n" + + "jiabaoyu.addEdge('朋友', shixiangyun);\n" + + "xueyima.addEdge('姐妹', wangfuren);\n" + + "xueyima.addEdge('母女', xuebaochai);"; + + public static final String GREMLIN_LOAD_HLM = GREMLIN_HLM_SCHEMA + + GREMLIN_HLM_DATA; + + public static final String GREMLIN_COVID19_SCHEMA = + "\"graph.schema().propertyKey('性别').asText().ifNotExist().create();\\n" + + "graph.schema().propertyKey('年龄').asInt().ifNotExist().create();\\n" + + "graph.schema().propertyKey('防疫政策').asText().ifNotExist().create();\\n" + + "graph.schema().propertyKey('类型').asText().ifNotExist().create();\\n" + + "graph.schema().propertyKey('时间').asText().ifNotExist().create();\\n" + + "\\n" + + "graph.schema().vertexLabel('patient').properties('性别','年龄')" + + ".useCustomizeStringId().nullableKeys('性别','年龄')" + + ".enableLabelIndex(false).ifNotExist().create();\\n" + + "graph.schema().vertexLabel('place')" + + ".useCustomizeStringId()" + + ".enableLabelIndex(false).ifNotExist().create();\\n" + + "graph.schema().vertexLabel('city').properties('防疫政策')" + + ".useCustomizeStringId().nullableKeys('防疫政策')" + + ".enableLabelIndex(false).ifNotExist().create();\\n" + + "graph.schema().vertexLabel('vehicle').properties('类型')" + + ".useCustomizeStringId().nullableKeys('类型')" + + ".enableLabelIndex(false).ifNotExist().create();\\n" + + "\\n" + + "graph.schema().edgeLabel('relation')" + + ".sourceLabel('patient').targetLabel('patient')" + + ".properties('类型').nullableKeys('类型')" + + ".enableLabelIndex(false).ifNotExist().create();\\n" + + "graph.schema().edgeLabel('reside')" + + ".sourceLabel('patient').targetLabel('place')" + + ".properties('时间').nullableKeys('时间')" + + ".enableLabelIndex(false).ifNotExist().create();\\n" + + "graph.schema().edgeLabel('work')" + + ".sourceLabel('patient').targetLabel('place')" + + ".properties('时间').nullableKeys('时间')" + + ".enableLabelIndex(false).ifNotExist().create();\\n" + + "graph.schema().edgeLabel('stay')" + + ".sourceLabel('patient').targetLabel('place')" + + ".properties('时间').nullableKeys('时间')" + + ".enableLabelIndex(false).ifNotExist().create();" + + "\\ngraph.schema().edgeLabel('comfirm')" + + ".sourceLabel('patient').targetLabel('city')" + + ".properties('时间').nullableKeys('时间')" + + ".enableLabelIndex(false).ifNotExist().create();\\n" + + "graph.schema().edgeLabel('take')" + + ".sourceLabel('patient').targetLabel('vehicle')" + + ".properties('时间').nullableKeys('时间')" + + ".enableLabelIndex(false).ifNotExist().create();\\n\\n\""; + public static String escapeId(Object id) { if (!(id instanceof String)) { return id.toString(); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/HubbleUtil.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/HubbleUtil.java index 186f0b738..057ef8edd 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/HubbleUtil.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/HubbleUtil.java @@ -18,21 +18,183 @@ package org.apache.hugegraph.util; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.time.Instant; -import java.util.Collection; +import java.time.ZoneOffset; +import java.util.TimeZone; import java.util.Date; import java.util.UUID; +import java.util.Calendar; +import java.util.Collection; import java.util.regex.Pattern; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.collections.CollectionUtils; public final class HubbleUtil { + static { + TimeZone.setDefault(TimeZone.getTimeZone(ZoneOffset.of("+8"))); + } + + public static final Pattern HOST_PATTERN = + Pattern.compile("(([0-9]{1,3}\\.){3}[0-9]{1,3}|" + "([0-9A-Za-z_!~*'()-]+\\.)*[0-9A-Za-z_!~*'()-]+)$"); + private static final String DF = "yyyy-MM-dd HH:mm:ss"; + + private static final String M_FORMAT = "yyyyMMdd'T'HHmmssSSS"; + public static final DateFormat DATE_FORMAT = new SimpleDateFormat(DF); + + public static String dateFormat() { + return DATE_FORMAT.format(new Date()); + } + + public static String dateFormatMillis() { + return (new SimpleDateFormat(M_FORMAT)).format(new Date()); + } + + public static String dateFormatMonth(Date date) { + return (new SimpleDateFormat("yyyyMM").format(date)); + } + + public static String dateFormatDay(Date date) { + return (new SimpleDateFormat("yyyyMMdd").format(date)); + } + + public static String dateFormatDay(String date) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + Date da = null; + try { + da = sdf.parse(date); + } catch (ParseException e) { + throw new RuntimeException(e); + } + return (new SimpleDateFormat("yyyy-MM-dd").format(da)); + } + + public static String dateFormatLastMonth() { + Calendar cal = Calendar.getInstance(); + int month = cal.get(Calendar.MONTH); + + cal.set(Calendar.MONTH, month - 1); + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + return (new SimpleDateFormat("yyyyMM").format(cal.getTime())); + } + + public static String dateFormatLastDay() { + Calendar cal = Calendar.getInstance(); + int da = cal.get(Calendar.DATE); + cal.set(Calendar.DATE, da - 1); + return (new SimpleDateFormat("yyyyMMdd").format(cal.getTime())); + } - public static final Pattern HOST_PATTERN = Pattern.compile( - "(([0-9]{1,3}\\.){3}[0-9]{1,3}|" + - "([0-9A-Za-z_!~*'()-]+\\.)*[0-9A-Za-z_!~*'()-]+)$" - ); + + + /** + * 获取当前时间往前推7天的时间戳数组(单位/秒) + * @return 包含前7天时间戳和当前时间戳的数组 + */ + public static long[] getTimestampsBefore7Days() { + Calendar cal = Calendar.getInstance(); + long currentTimestamp = cal.getTimeInMillis(); + // 将时间设置为当前时间往前推24小时 + cal.add(Calendar.HOUR_OF_DAY, -24 * 7); + long timestampBefore24Hours = cal.getTimeInMillis(); + return new long[]{timestampBefore24Hours / 1000, + currentTimestamp / 1000}; + } + + /** + * 获取当前时间往前推24小时的时间戳数组(单位/秒) + * @return 包含前24小时时间戳和当前时间戳的数组 + */ + public static long[] getTimestampsBefore24Hours() { + Calendar cal = Calendar.getInstance(); + long currentTimestamp = cal.getTimeInMillis(); + // 将时间设置为当前时间往前推24小时 + cal.add(Calendar.HOUR_OF_DAY, -24); + long timestampBefore24Hours = cal.getTimeInMillis(); + return new long[]{timestampBefore24Hours / 1000, + currentTimestamp / 1000}; + } + + + public static long[] getTimestampsBefore24Hours(String time) { + Date date = null; + try { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd HH:mm:ss"); + date = dateFormat.parse(time); + } catch (ParseException e) { + throw new RuntimeException(e); + } + return getTimestampsBefore24Hours(date.getTime()); + } + + /** + * 获取timestamp时间往前推24小时的时间戳数组(单位/秒) + * @param timestamp 给定时间戳(单位/ms) + * @return 包含前24小时时间戳和当前时间戳的数组 + */ + private static long[] getTimestampsBefore24Hours(long timestamp) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(timestamp); + // 将时间设置为当前时间往前推24小时 + cal.add(Calendar.HOUR_OF_DAY, -24); + return new long[]{cal.getTimeInMillis() / 1000, timestamp / 1000}; + } + + + /** + * 获取给定日期所在周的周一和周日的时间戳数组(单位/秒) + * @param date 给定日期 + * @return 包含周一和周日时间戳的数组 + */ + public static long[] getWeekTimestamps(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + resetTime(cal); + long startOfWeek = cal.getTimeInMillis(); + // 将日期调整到下周一 + cal.add(Calendar.DAY_OF_WEEK, 7); + resetTime(cal); + cal.add(Calendar.SECOND, -1); + long endOfWeek = cal.getTimeInMillis(); + return new long[]{startOfWeek / 1000, endOfWeek / 1000}; + } + + + /** + * 获取给定日期所在月份的第一天和最后一天的时间戳数组(单位/秒) + * @param date 给定日期 + * @return 包含月份第一天和最后一天时间戳的数组 + */ + public static long[] getMonthTimestamps(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + // 将日期调整到该月的第一天 + cal.set(Calendar.DAY_OF_MONTH, 1); + resetTime(cal); + long startOfMonth = cal.getTimeInMillis(); + // 将日期调整到下个月的第一天 + cal.add(Calendar.MONTH, 1); + resetTime(cal); + // 将日期调整到本月的最后一天 + cal.add(Calendar.SECOND, -1); + // 获取月份的结束时间戳 + long endOfMonth = cal.getTimeInMillis(); + return new long[]{startOfMonth, endOfMonth}; + } + + /** + * 重置时间为当天的开始时间(即00:00:00) + */ + private static void resetTime(Calendar cal) { + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + } public static Date nowDate() { return new Date(); @@ -56,4 +218,8 @@ public static String generateSimpleId() { public static String md5(String rawText) { return DigestUtils.md5Hex(rawText); } + + public static String md5Secret(String rawText) { + return md5("a1p" + md5(rawText).substring(5, 15) + "ck0").substring(1, 17); + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/HugeClientUtil.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/HugeClientUtil.java index e0bb4238b..0bd577cbd 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/HugeClientUtil.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/HugeClientUtil.java @@ -20,17 +20,16 @@ import java.util.Set; +import org.apache.commons.lang3.StringUtils; import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.entity.GraphConnection; import org.apache.hugegraph.exception.ExternalException; -import org.apache.hugegraph.exception.GenericException; import org.apache.hugegraph.exception.ServerException; -import org.apache.hugegraph.rest.ClientException; -import org.apache.hugegraph.structure.gremlin.Result; -import org.apache.hugegraph.structure.gremlin.ResultSet; import org.springframework.web.util.UriComponentsBuilder; + +import org.apache.hugegraph.rest.ClientException; import com.google.common.collect.ImmutableSet; public final class HugeClientUtil { @@ -42,31 +41,36 @@ public final class HugeClientUtil { ); public static HugeClient tryConnect(GraphConnection connection) { + String graphSpace = connection.getGraphSpace(); String graph = connection.getGraph(); String host = connection.getHost(); Integer port = connection.getPort(); + String token = connection.getToken(); String username = connection.getUsername(); String password = connection.getPassword(); int timeout = connection.getTimeout(); - String protocol = connection.getProtocol() == null ? - DEFAULT_PROTOCOL : connection.getProtocol(); + String protocol = StringUtils.isEmpty(connection.getProtocol()) ? + DEFAULT_PROTOCOL : + connection.getProtocol(); String trustStoreFile = connection.getTrustStoreFile(); String trustStorePassword = connection.getTrustStorePassword(); String url = UriComponentsBuilder.newInstance() - .scheme(protocol).host(host).port(port).toUriString(); + .scheme(protocol) + .host(host).port(port) + .toUriString(); if (username == null) { username = ""; password = ""; } HugeClient client; + boolean skipRequiredChecks = (graph == null || graph.isEmpty()); try { - client = HugeClient.builder(url, graph) + client = HugeClient.builder(url, graphSpace, graph, skipRequiredChecks) + .configToken(token) .configUser(username, password) - // TODO: change it to connTimeout & readTimeout .configTimeout(timeout) .configSSL(trustStoreFile, trustStorePassword) - .configHttpBuilder(http -> http.followRedirects(false)) .build(); } catch (IllegalStateException e) { String message = e.getMessage(); @@ -74,7 +78,7 @@ public static HugeClient tryConnect(GraphConnection connection) { throw new ExternalException("client-server.version.unmatched", e); } if (message != null && (message.startsWith("Error loading trust store from") || - message.startsWith("Cannot find trust store file"))) { + message.startsWith("Cannot find trust store file"))) { throw new ExternalException("https.load.truststore.error", e); } throw e; @@ -82,12 +86,15 @@ public static HugeClient tryConnect(GraphConnection connection) { String message = e.getMessage(); if (Constant.STATUS_UNAUTHORIZED == e.status() || (message != null && message.startsWith("Authentication"))) { - throw new ExternalException("graph-connection.username-or-password.incorrect", e); + throw new ExternalException( + "graph-connection.username-or-password.incorrect", e); } - if (message != null && message.contains("Invalid syntax for username and password")) { - throw new ExternalException("graph-connection.missing-username-password", e); + if (message != null && message.contains("Invalid syntax for " + + "username and password")) { + throw new ExternalException( + "graph-connection.missing-username-password", e); } - throw new GenericException(e); + throw e; } catch (ClientException e) { Throwable cause = e.getCause(); if (cause == null || cause.getMessage() == null) { @@ -100,31 +107,12 @@ public static HugeClient tryConnect(GraphConnection connection) { message.contains("Host name may not be null")) { throw new ExternalException("service.unknown-host", e, host); } else if (message.contains("")) { - throw new ExternalException("service.suspected-web", e, host, port); + throw new ExternalException("service.suspected-web", + e, host, port); } throw e; - } catch (Exception e) { - throw new GenericException(e); } - try { - ResultSet rs = client.gremlin().gremlin("g.V().limit(1)").execute(); - rs.iterator().forEachRemaining(Result::getObject); - } catch (ServerException e) { - if (Constant.STATUS_UNAUTHORIZED == e.status()) { - throw new ExternalException("graph-connection.username-or-password.incorrect", e); - } - String message = e.message(); - if (message != null && message.contains("Could not rebind [g]")) { - throw new ExternalException("graph-connection.graph.unexist", e, graph, host, port); - } - if (!isAcceptable(message)) { - throw e; - } - } catch (Exception e) { - client.close(); - throw e; - } return client; } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/PageUtil.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/PageUtil.java index 3f4832276..da90d03ff 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/PageUtil.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/PageUtil.java @@ -43,7 +43,12 @@ public static IPage page(List entities, int pageNo, int pageSize) { } else { pages = 0; // Return all entities when page size is negative - records = pageSize < 0 ? entities : Collections.emptyList(); + if (pageSize < 0) { + records = entities; + pageSize = entities.size(); + } else { + records = Collections.emptyList(); + } } Page page = new Page<>(current, pageSize, entities.size(), true); @@ -52,4 +57,18 @@ public static IPage page(List entities, int pageNo, int pageSize) { page.setPages(pages); return page; } + + public static IPage newPage(List records, int pageNo, + int pageSize, int total) { + + int current = pageNo > 1 ? pageNo : 1; + int pages = 0; + + Page page = new Page<>(current, pageSize, total, true); + page.setRecords(records); + page.setOrders(Collections.emptyList()); + page.setPages(pages); + + return page; + } } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/SQLUtil.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/SQLUtil.java index 98dc5de7e..8ba416425 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/SQLUtil.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/SQLUtil.java @@ -19,6 +19,7 @@ package org.apache.hugegraph.util; import org.apache.commons.lang3.StringUtils; + import org.apache.hugegraph.common.Constant; public final class SQLUtil { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/UrlUtil.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/UrlUtil.java new file mode 100644 index 000000000..e931e8256 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/UrlUtil.java @@ -0,0 +1,74 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.util; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +public class UrlUtil { + public static Host parseHost(String url) { + Host host = new Host(); + + String text = url; + String scheme = null; + int schemeIdx = url.indexOf("://"); + if (schemeIdx > 0) { + scheme = url.substring(0, schemeIdx); + text = url.substring(schemeIdx + 3); + } + + int port = -1; + int portIdx = text.lastIndexOf(":"); + if (portIdx > 0) { + String portStr = null; + int pathIdx = text.indexOf("/"); + if (pathIdx > 0) { + portStr = text.substring(portIdx + 1, pathIdx); + } else { + portStr = text.substring(portIdx + 1); + } + try { + port = Integer.parseInt(portStr); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid HTTP host: " + text, + e); + } + + text = text.substring(0, portIdx); + + host.setScheme(scheme); + host.setHost(text); + host.setPort(port); + } + + return host; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Host { + protected String host; + protected int port; + protected String scheme; + } +} + + diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/version/HubbleVersion.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/version/HubbleVersion.java index f6979965c..3bfb7b2bb 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/version/HubbleVersion.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/version/HubbleVersion.java @@ -32,13 +32,13 @@ public final class HubbleVersion { // The second parameter of Version.of() is for IDE running without JAR public static final Version VERSION = Version.of(HubbleVersion.class, - "1.5.0"); + "3.5.0"); public static void check() { // Check version of hugegraph-common & hugegraph-client - VersionUtil.check(CommonVersion.VERSION, "1.6.0", "1.7", + VersionUtil.check(CommonVersion.VERSION, "1.6.0", "1.9", CommonVersion.NAME); - VersionUtil.check(ClientVersion.VERSION, "1.8.0", "1.9", + VersionUtil.check(ClientVersion.VERSION, "3.5.0", "3.6", ClientVersion.NAME); } } diff --git a/hugegraph-hubble/hubble-be/src/main/resources/application.properties b/hugegraph-hubble/hubble-be/src/main/resources/application.properties index 851a2746e..aa0f607b4 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/application.properties +++ b/hugegraph-hubble/hubble-be/src/main/resources/application.properties @@ -1,4 +1,5 @@ # +# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with this # work for additional information regarding copyright ownership. The ASF @@ -17,10 +18,11 @@ info.app.name=hugegraph-hubble info.app.version=v1.2 +spring.profiles.active=dev -# web static file path +# web static file path, local h2 database or remote mysql for you to choose +# local h2 database spring.resources.static-locations=classpath:/ui/ - spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:file:./db;DB_CLOSE_ON_EXIT=FALSE spring.datasource.username=sa @@ -28,6 +30,12 @@ spring.datasource.password= spring.datasource.schema=classpath:database/schema.sql spring.datasource.data=classpath:database/data.sql +# remote mysql +#spring.datasource.url=jdbc:mysql://{ip}:{port}/{database}?serverTimezone=Asia/Shanghai +#spring.datasource.username={username} +#spring.datasource.password={password} +#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.maximum-pool-size=15 spring.datasource.hikari.auto-commit=true @@ -62,8 +70,12 @@ mybatis.configuration.default-statement-timeout=600 management.endpoints.web.exposure.include=* +# close es health check +management.health.elasticsearch.enabled=false + logging.level.org.springframework=WARN -logging.level.org.apache.hugegraph.mapper=INFO -logging.level.org.apache.hugegraph.service=INFO +logging.level.com.baidu.hugegraph.mapper=INFO +logging.level.com.baidu.hugegraph.service=INFO logging.file=logs/hugegraph-hubble.log +#logging.config=file:./conf/log4j2.xml logging.file.max-size=10MB diff --git a/hugegraph-hubble/hubble-be/src/main/resources/database/data.sql b/hugegraph-hubble/hubble-be/src/main/resources/database/data.sql index b6f344278..bab147963 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/database/data.sql +++ b/hugegraph-hubble/hubble-be/src/main/resources/database/data.sql @@ -1,19 +1,20 @@ SELECT 1; /* + * * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. */ -- INSERT INTO `graph_connection`(name, graph, host, port, timeout, create_time) VALUES ('s', 'hugegraph', 'localhost', 8080, 60, sysdate); diff --git a/hugegraph-hubble/hubble-be/src/main/resources/database/schema.sql b/hugegraph-hubble/hubble-be/src/main/resources/database/schema.sql index c4c646f51..3c5e63851 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/database/schema.sql +++ b/hugegraph-hubble/hubble-be/src/main/resources/database/schema.sql @@ -1,3 +1,39 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -23,41 +59,63 @@ CREATE TABLE IF NOT EXISTS `user_info` ( UNIQUE (`username`) ); -CREATE TABLE IF NOT EXISTS `graph_connection` ( - `id` INT NOT NULL AUTO_INCREMENT, - `name` VARCHAR(48) NOT NULL, - `graph` VARCHAR(48) NOT NULL, - `host` VARCHAR(48) NOT NULL DEFAULT 'localhost', - `port` INT NOT NULL DEFAULT '8080', - `timeout` INT NOT NULL, - `username` VARCHAR(48), - `password` VARCHAR(48), - `enabled` BOOLEAN NOT NULL DEFAULT true, - `disable_reason` VARCHAR(65535) NOT NULL DEFAULT '', - `create_time` DATETIME(6) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE (`name`), - UNIQUE (`graph`, `host`, `port`) +-- DROP TABLE IF EXISTS `app_info`; +CREATE TABLE IF NOT EXISTS `app_info`( + `graph_name` varchar(255) DEFAULT NULL, + `app_name` varchar(255) NOT NULL, + `app_type` varchar(255) NOT NULL, + `count_query` text DEFAULT NULL, + `distribution_query` text DEFAULT NULL, + `description` text DEFAULT NULL, + PRIMARY KEY (`graph_name`, `app_name`, `app_type`) ); +-- DROP TABLE IF EXISTS `execute_history`; CREATE TABLE IF NOT EXISTS `execute_history` ( `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL, - `async_id` LONG NOT NULL DEFAULT 0, + `conn_id` INT, + `graphspace` VARCHAR(48) NOT NULL, + `graph` VARCHAR(48) NOT NULL, + `async_id` LONG NOT NULL, `execute_type` TINYINT NOT NULL, - `content` VARCHAR(65535) NOT NULL, + `content` TEXT NOT NULL, + `text` TEXT NOT NULL, `execute_status` TINYINT NOT NULL, `async_status` TINYINT NOT NULL DEFAULT 0, `duration` LONG NOT NULL, `create_time` DATETIME(6) NOT NULL, PRIMARY KEY (`id`) -); + ); + CREATE INDEX IF NOT EXISTS `execute_history_conn_id` ON `execute_history`(`conn_id`); + +// DROP TABLE IF EXISTS `edit_history`; +CREATE TABLE IF NOT EXISTS `edit_history` +( + `id` int NOT NULL AUTO_INCREMENT, + `graphspace` varchar(255) DEFAULT NULL, + `graph` varchar(255) DEFAULT NULL, + `element_id` varchar(255) DEFAULT NULL, + `label` varchar(255) DEFAULT NULL, + `property_num` int DEFAULT NULL, + `option_type` varchar(255) DEFAULT NULL, + `option_time` datetime DEFAULT NULL, + `option_person` varchar(255) DEFAULT NULL, + `content` longtext, + PRIMARY KEY (`id`) +); + +CREATE INDEX IF NOT EXISTS `idx_graphspace_graph` ON `edit_history` (`graphspace`, `graph`); + + CREATE TABLE IF NOT EXISTS `gremlin_collection` ( `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL, + `conn_id` INT, + `graphspace` VARCHAR(48) NOT NULL, + `graph` VARCHAR(48) NOT NULL, `name` VARCHAR(48) NOT NULL, + `type` VARCHAR(48) NOT NULL, `content` VARCHAR(65535) NOT NULL, `create_time` DATETIME(6) NOT NULL, PRIMARY KEY (`id`), @@ -67,7 +125,9 @@ CREATE INDEX IF NOT EXISTS `gremlin_collection_conn_id` ON `gremlin_collection`( CREATE TABLE IF NOT EXISTS `file_mapping` ( `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL, + `conn_id` INT, + `graphspace` VARCHAR(48) NOT NULL, + `graph` VARCHAR(48) NOT NULL, `job_id` INT NOT NULL DEFAULT 0, `name` VARCHAR(128) NOT NULL, `path` VARCHAR(256) NOT NULL, @@ -87,7 +147,9 @@ CREATE INDEX IF NOT EXISTS `file_mapping_conn_id` ON `file_mapping`(`conn_id`); CREATE TABLE IF NOT EXISTS `load_task` ( `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL, + `conn_id` INT, + `graphspace` VARCHAR(48) NOT NULL, + `graph` VARCHAR(48) NOT NULL, `job_id` INT NOT NULL DEFAULT 0, `file_id` INT NOT NULL, `file_name` VARCHAR(128) NOT NULL, @@ -105,7 +167,9 @@ CREATE TABLE IF NOT EXISTS `load_task` ( CREATE TABLE IF NOT EXISTS `job_manager` ( `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL DEFAULT 0, + `conn_id` INT DEFAULT 0, + `graphspace` VARCHAR(48) NOT NULL, + `graph` VARCHAR(48) NOT NULL, `job_name` VARCHAR(100) NOT NULL DEFAULT '', `job_remarks` VARCHAR(200) NOT NULL DEFAULT '', `job_size` LONG NOT NULL DEFAULT 0, @@ -114,12 +178,14 @@ CREATE TABLE IF NOT EXISTS `job_manager` ( `update_time` DATETIME(6) NOT NULL, `create_time` DATETIME(6) NOT NULL, PRIMARY KEY (`id`), - UNIQUE (`job_name`, `conn_id`) + UNIQUE (`job_name`, `graphspace`, `graph`) ); CREATE TABLE IF NOT EXISTS `async_task` ( `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL DEFAULT 0, + `conn_id` INT DEFAULT 0, + `graphspace` VARCHAR(48) NOT NULL, + `graph` VARCHAR(48) NOT NULL, `task_id` INT NOT NULL DEFAULT 0, `task_name` VARCHAR(100) NOT NULL DEFAULT '', `task_reason` VARCHAR(200) NOT NULL DEFAULT '', @@ -134,3 +200,12 @@ CREATE TABLE IF NOT EXISTS `async_task` ( CREATE INDEX IF NOT EXISTS `load_task_conn_id` ON `load_task`(`conn_id`); CREATE INDEX IF NOT EXISTS `load_task_file_id` ON `load_task`(`file_id`); + +CREATE TABLE IF NOT EXISTS `datasource` ( + `id` INT NOT NULL AUTO_INCREMENT, + `datasource_name` VARCHAR(128) NOT NULL, + `datasource_config` TEXT NOT NULL, + `creator` VARCHAR(64) NOT NULL DEFAULT '', + `create_time` DATETIME(6) NOT NULL, + PRIMARY KEY (`id`) +); diff --git a/hugegraph-hubble/hubble-be/src/main/resources/hugegraph-hubble.properties b/hugegraph-hubble/hubble-be/src/main/resources/hugegraph-hubble.properties index 28dc5337c..62e9a4120 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/hugegraph-hubble.properties +++ b/hugegraph-hubble/hubble-be/src/main/resources/hugegraph-hubble.properties @@ -1,4 +1,5 @@ # +# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with this # work for additional information regarding copyright ownership. The ASF @@ -21,6 +22,8 @@ server.port=8088 graph_connection.ip_white_list=[*] graph_connection.port_white_list=[-1] +client.request_timeout=310 + gremlin.suffix_limit=250 gremlin.vertex_degree_limit=100 gremlin.edges_total_limit=500 @@ -29,3 +32,39 @@ gremlin.batch_query_ids=100 server.protocol=http #ssl.client_truststore_file= #ssl.client_truststore_password= + +cluster=hg +idc=bddwd + +# ===== Deployment Mode ===== +# Set to false for standalone RocksDB mode (no PD dependency) +pd.enabled=false +# Direct server URL, only used when pd.enabled=false +server.direct_url=http://127.0.0.1:8080 + +# pd +pd.peers=127.0.0.1:8686 +pd.server=127.0.0.1:8620 + +# dashboard +dashboard.address=127.0.0.1:8092 +# BOTH, NODE_PORT, DDS +route.type=NODE_PORT + +# Set monitor url +monitor.url= +prometheus.url=http://127.0.0.1:8090 + +# ES +es.urls= + +proxy.servlet_url=/api/v1.3/ingest/* +proxy.target_url=WhatURLAtHere +# TODO X Fix proxy + +# TODO Evaluate the afs part AND REMOVED +## afs conf for graph sketch (some olap algorithm result will be saved in afs) +#afs.uri=UNKNOWN +#afs.dir=/user/hugegraph/graph_sketch/ +#afs.user=username +#afs.password=password diff --git a/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages.properties b/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages.properties index ddbb082d4..551560039 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages.properties +++ b/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages.properties @@ -1,4 +1,5 @@ # +# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with this # work for additional information regarding copyright ownership. The ASF @@ -202,3 +203,11 @@ license.verfiy.mac-unmatch-ip=Failed to get mac address for IP {0} license.verify.mac.unauthorized=The hugegraph-hubble's mac {0} doesn't match the authorized {1} https.load.truststore.error=Failed to load https trusted certificate + +service.no-available=No service available +service.graphspace.no-available=No service available +service.default.no-available=No service avaialbe under namespace named 'DEFAULT' +service.url.parse.error=Parse host info ({0}) error?please check the url in \ + service config + +service.manual.disable.modify=Disallown modify manual service diff --git a/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages_zh_CN.properties b/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages_zh_CN.properties index 7c333d384..1fe4c9368 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages_zh_CN.properties +++ b/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages_zh_CN.properties @@ -1,4 +1,5 @@ # +# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with this # work for additional information regarding copyright ownership. The ASF @@ -202,3 +203,8 @@ license.verfiy.mac-unmatch-ip=hugegraph-hubble 机器的 MAC 与 IP {0} 不匹 license.verify.mac.unauthorized=hugegraph-hubble 机器的 MAC {0} 不在已授权范围内 {1} https.load.truststore.error=https 可信证书加载失败 + +service.no-available=当前无可用服务 +service.default.no-available=DEFAULT命名空间下的DEFAULT服务无法使用 +service.url.parse.error="无法解析的主机名或 IP ({0}) ,请修改相关服务的URL配置" +service.manual.disable.modify=禁止修改手动启动的图服务 diff --git a/hugegraph-hubble/hubble-be/src/main/resources/log4j2.xml b/hugegraph-hubble/hubble-be/src/main/resources/log4j2.xml index 3410533ba..e9551e294 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/log4j2.xml +++ b/hugegraph-hubble/hubble-be/src/main/resources/log4j2.xml @@ -1,75 +1,50 @@ - - - UTF-8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) [%thread] --- %logger{35} : %msg%n + + + + + + logs/hugegraph-text2gremlin.log + + hugegraph-text2gremlin.log.%d{yyyy-MM-dd} + + + %d{yyyy-MM-dd HH:mm:ss.SSS},%msg%n + + + + + + + + + + + + - - - - - diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/EntityUtilTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/EntityUtilTest.java deleted file mode 100644 index f3f75ddd9..000000000 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/EntityUtilTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -package org.apache.hugegraph.unit; - -import java.util.Date; - -import org.apache.hugegraph.entity.GraphConnection; -import org.apache.hugegraph.testutil.Assert; -import org.apache.hugegraph.util.EntityUtil; -import org.junit.Test; - -public class EntityUtilTest { - - @Test - public void testMerge() throws InterruptedException { - GraphConnection oldEntity; - GraphConnection newEntity; - oldEntity = new GraphConnection(1, "conn1", "graph1", "host1", 8001, - 30, "", "", true, "", - new Date(), "http", "", ""); - Thread.sleep(10); - newEntity = new GraphConnection(2, "conn2", "graph2", "host2", 8002, - 40, "u", "p", false, "xxx", - new Date(), "http", "", ""); - - GraphConnection entity = EntityUtil.merge(oldEntity, newEntity); - Assert.assertEquals(oldEntity.getId(), entity.getId()); - Assert.assertEquals(newEntity.getName(), entity.getName()); - Assert.assertEquals(newEntity.getGraph(), entity.getGraph()); - Assert.assertEquals(newEntity.getHost(), entity.getHost()); - Assert.assertEquals(newEntity.getPort(), entity.getPort()); - Assert.assertEquals(oldEntity.getTimeout(), entity.getTimeout()); - Assert.assertEquals(newEntity.getUsername(), entity.getUsername()); - Assert.assertEquals(newEntity.getPassword(), entity.getPassword()); - Assert.assertEquals(oldEntity.getCreateTime(), entity.getCreateTime()); - } -} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUploadControllerTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUploadControllerTest.java new file mode 100644 index 000000000..8d3314dff --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUploadControllerTest.java @@ -0,0 +1,269 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.unit; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; +import org.springframework.mock.web.MockMultipartFile; + +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.controller.load.FileUploadController; +import org.apache.hugegraph.entity.enums.FileMappingStatus; +import org.apache.hugegraph.entity.enums.JobStatus; +import org.apache.hugegraph.entity.load.FileMapping; +import org.apache.hugegraph.entity.load.JobManager; +import org.apache.hugegraph.exception.ExternalException; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.service.load.FileMappingService; +import org.apache.hugegraph.service.load.JobManagerService; +import org.apache.hugegraph.testutil.Assert; + +public class FileUploadControllerTest { + + @Test + public void testCheckFileValidAcceptsUppercaseTrimmedFormat() + throws Exception { + FileUploadController controller = this.controller(" CSV ", " TXT "); + MockMultipartFile file = new MockMultipartFile("file", "HLM.TXT", + "text/plain", + "name\nmarko".getBytes()); + JobManager job = JobManager.builder() + .id(1) + .jobStatus(JobStatus.UPLOADING) + .build(); + + this.checkFileValid(controller, job, file, "HLM.TXT"); + } + + @Test + public void testCheckFileValidSkipsNullAndBlankWhitelistItems() + throws Exception { + FileUploadController controller = this.controller(" CSV ", null, " ", + " TXT "); + MockMultipartFile file = new MockMultipartFile("file", "HLM.TXT", + "text/plain", + "name\nmarko".getBytes()); + JobManager job = JobManager.builder() + .id(1) + .jobStatus(JobStatus.UPLOADING) + .build(); + + this.checkFileValid(controller, job, file, "HLM.TXT"); + } + + @Test + public void testCheckFileValidRejectsMissingExtension() throws Exception { + FileUploadController controller = this.controller("csv", "txt"); + MockMultipartFile file = new MockMultipartFile("file", "HLM", + "text/plain", + "name\nmarko".getBytes()); + JobManager job = JobManager.builder() + .id(1) + .jobStatus(JobStatus.UPLOADING) + .build(); + + Assert.assertThrows(ExternalException.class, () -> { + this.checkFileValid(controller, job, file, "HLM"); + }); + } + + @Test + public void testCheckFileValidRejectsEmptyWhitelist() throws Exception { + FileUploadController controller = this.controller((String[]) null); + MockMultipartFile file = new MockMultipartFile("file", "HLM.TXT", + "text/plain", + "name\nmarko".getBytes()); + JobManager job = JobManager.builder() + .id(1) + .jobStatus(JobStatus.UPLOADING) + .build(); + + Assert.assertThrows(ExternalException.class, () -> { + this.checkFileValid(controller, job, file, "HLM.TXT"); + }); + } + + @Test + public void testReserveUploadQuotaUsesGraphRouteForNewMapping() + throws Exception { + FileUploadController controller = this.controller("csv"); + FileMappingService service = Mockito.mock(FileMappingService.class); + JobManagerService jobService = Mockito.mock(JobManagerService.class); + JobManager job = JobManager.builder().id(1).jobSize(20L).build(); + Mockito.when(jobService.get(1)).thenReturn(job); + Mockito.when(service.get("DEFAULT", "hugegraph", 1, "data.csv")) + .thenReturn(null); + Mockito.when(service.listByJob(1)).thenReturn(Collections.emptyList()); + this.setField(controller, "service", service); + this.setField(controller, "jobService", jobService); + + FileMapping mapping = this.reserveUploadQuota(controller, "DEFAULT", + "hugegraph", 1, + "data.csv", + "upload/data.csv", 10L); + + ArgumentCaptor captor = ArgumentCaptor.forClass( + FileMapping.class); + Mockito.verify(service).save(captor.capture()); + Assert.assertEquals(mapping, captor.getValue()); + Assert.assertEquals("DEFAULT", mapping.getGraphSpace()); + Assert.assertEquals("hugegraph", mapping.getGraph()); + Assert.assertEquals("data.csv", mapping.getName()); + Assert.assertEquals("upload/data.csv", mapping.getPath()); + Assert.assertEquals(10L, mapping.getTotalSize()); + Assert.assertEquals(FileMappingStatus.UPLOADING, + mapping.getFileStatus()); + } + + @Test + public void testReserveUploadQuotaRejectsCompletedDuplicate() + throws Exception { + FileUploadController controller = this.controller("csv"); + FileMappingService service = Mockito.mock(FileMappingService.class); + JobManagerService jobService = Mockito.mock(JobManagerService.class); + JobManager job = JobManager.builder().id(1).jobSize(20L).build(); + FileMapping completed = new FileMapping("DEFAULT", "hugegraph", + "data.csv", + "upload/old.csv"); + completed.setFileStatus(FileMappingStatus.COMPLETED); + Mockito.when(jobService.get(1)).thenReturn(job); + Mockito.when(service.get("DEFAULT", "hugegraph", 1, "data.csv")) + .thenReturn(completed); + this.setField(controller, "service", service); + this.setField(controller, "jobService", jobService); + + Assert.assertThrows(ExternalException.class, () -> { + this.reserveUploadQuota(controller, "DEFAULT", "hugegraph", 1, + "data.csv", "upload/data.csv", 10L); + }); + Mockito.verify(service, Mockito.never()).save(Mockito.any()); + Mockito.verify(service, Mockito.never()).update(Mockito.any()); + } + + @Test + public void testReserveUploadQuotaUpdatesExistingUploadingMapping() + throws Exception { + FileUploadController controller = this.controller("csv"); + FileMappingService service = Mockito.mock(FileMappingService.class); + JobManagerService jobService = Mockito.mock(JobManagerService.class); + JobManager job = JobManager.builder().id(1).jobSize(20L).build(); + FileMapping existing = new FileMapping("DEFAULT", "hugegraph", + "data.csv", + "upload/old.csv"); + existing.setId(2); + existing.setJobId(1); + existing.setTotalSize(5L); + existing.setFileStatus(FileMappingStatus.UPLOADING); + List uploading = new ArrayList<>(); + uploading.add(existing); + Mockito.when(jobService.get(1)).thenReturn(job); + Mockito.when(service.get("DEFAULT", "hugegraph", 1, "data.csv")) + .thenReturn(existing); + Mockito.when(service.listByJob(1)).thenReturn(uploading); + this.setField(controller, "service", service); + this.setField(controller, "jobService", jobService); + + FileMapping mapping = this.reserveUploadQuota(controller, "DEFAULT", + "hugegraph", 1, + "data.csv", + "upload/data.csv", 10L); + + Assert.assertEquals(existing, mapping); + Assert.assertEquals("upload/data.csv", mapping.getPath()); + Assert.assertEquals(10L, mapping.getTotalSize()); + Assert.assertEquals(FileMappingStatus.UPLOADING, + mapping.getFileStatus()); + Mockito.verify(service).update(existing); + Mockito.verify(service, Mockito.never()).save(Mockito.any()); + } + + private FileUploadController controller(String... formats) throws Exception { + FileUploadController controller = new FileUploadController(); + HugeConfig config = Mockito.mock(HugeConfig.class); + Mockito.when(config.get(HubbleOptions.UPLOAD_FILE_FORMAT_LIST)) + .thenReturn(formats == null ? null : Arrays.asList(formats)); + Mockito.when(config.get(HubbleOptions.UPLOAD_SINGLE_FILE_SIZE_LIMIT)) + .thenReturn(1024L); + Mockito.when(config.get(HubbleOptions.UPLOAD_TOTAL_FILE_SIZE_LIMIT)) + .thenReturn(2048L); + this.setField(controller, "config", config); + return controller; + } + + private void checkFileValid(FileUploadController controller, JobManager job, + MockMultipartFile file, String fileName) + throws Exception { + Method method = FileUploadController.class.getDeclaredMethod("checkFileValid", + String.class, + String.class, + int.class, + JobManager.class, + org.springframework.web.multipart.MultipartFile.class, + String.class); + method.setAccessible(true); + try { + method.invoke(controller, "DEFAULT", "hugegraph", 1, job, file, + fileName); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof Exception) { + throw (Exception) cause; + } + throw e; + } + } + + private FileMapping reserveUploadQuota(FileUploadController controller, + String graphSpace, String graph, + int jobId, String fileName, + String filePath, + Long sourceFileSize) + throws Exception { + Method method = FileUploadController.class.getDeclaredMethod( + "reserveUploadQuota", String.class, String.class, + int.class, String.class, String.class, Long.class); + method.setAccessible(true); + try { + return (FileMapping) method.invoke(controller, graphSpace, graph, + jobId, fileName, filePath, + sourceFileSize); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof Exception) { + throw (Exception) cause; + } + throw e; + } + } + + private void setField(Object object, String name, Object value) throws Exception { + Field field = object.getClass().getDeclaredField(name); + field.setAccessible(true); + field.set(object, value); + } +} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUtilTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUtilTest.java index ac959bf14..59c10010f 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUtilTest.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUtilTest.java @@ -18,10 +18,11 @@ package org.apache.hugegraph.unit; -import org.apache.hugegraph.testutil.Assert; -import org.apache.hugegraph.util.FileUtil; import org.junit.Test; +import org.apache.hugegraph.testutil.Assert; +import org.apache.hugegraph.util.FileUtil;; + public class FileUtilTest { @Test diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/GraphConnectionTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/GraphConnectionTest.java deleted file mode 100644 index aa2196093..000000000 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/GraphConnectionTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.hugegraph.unit; - -import org.apache.hugegraph.HugeGraphHubble; -import org.apache.hugegraph.common.Constant; -import org.apache.hugegraph.common.Response; -import org.apache.hugegraph.entity.GraphConnection; -import org.apache.hugegraph.testutil.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@TestPropertySource("classpath:application.properties") -@SpringBootTest(classes = HugeGraphHubble.class, webEnvironment = - SpringBootTest.WebEnvironment.RANDOM_PORT) -public class GraphConnectionTest { - - private static final String HOST = "127.0.0.1"; - private static final int PORT = 8080; - - @Autowired - private TestRestTemplate testRestTemplate; - - @Test - public void testGraphConnect() { - GraphConnection entry = - GraphConnection.builder().host(HOST).port(PORT).name("test").graph( - "hugegraph").build(); - Response response = testRestTemplate.postForObject( - Constant.API_VERSION + "graph-connections", - entry, Response.class); - Assert.assertEquals(response.getMessage(), 200, response.getStatus()); - } -} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/HubbleOptionsTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/HubbleOptionsTest.java new file mode 100644 index 000000000..453408899 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/HubbleOptionsTest.java @@ -0,0 +1,35 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.unit; + +import org.junit.Test; + +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.testutil.Assert; + +public class HubbleOptionsTest { + + @Test + public void testUploadFormatDefaultIncludesCsvAndTxt() { + Assert.assertTrue(HubbleOptions.UPLOAD_FILE_FORMAT_LIST.defaultValue() + .contains("csv")); + Assert.assertTrue(HubbleOptions.UPLOAD_FILE_FORMAT_LIST.defaultValue() + .contains("txt")); + } +} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/OltpAlgoControllerTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/OltpAlgoControllerTest.java new file mode 100644 index 000000000..a0d0f5f3d --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/OltpAlgoControllerTest.java @@ -0,0 +1,52 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hugegraph.unit; + +import java.lang.reflect.Method; + +import org.junit.Test; +import org.springframework.web.bind.annotation.PostMapping; + +import org.apache.hugegraph.controller.algorithm.OltpAlgoController; +import org.apache.hugegraph.testutil.Assert; + +public class OltpAlgoControllerTest { + + @Test + public void testShortPathAliasMappingExists() throws Exception { + Method method = OltpAlgoController.class.getDeclaredMethod("shortPathAlias", + String.class, + String.class, + org.apache.hugegraph.entity.algorithm.ShortestPathEntity.class); + + PostMapping mapping = method.getAnnotation(PostMapping.class); + Assert.assertEquals("shortpath", mapping.value()[0]); + } + + @Test + public void testAllShortPathAliasMappingExists() throws Exception { + Method method = OltpAlgoController.class.getDeclaredMethod("allShortPathAlias", + String.class, + String.class, + org.apache.hugegraph.entity.algorithm.AllShortestPathsEntity.class); + + PostMapping mapping = method.getAnnotation(PostMapping.class); + Assert.assertEquals("allshortpath", mapping.value()[0]); + } +} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/OltpAlgoServiceTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/OltpAlgoServiceTest.java new file mode 100644 index 000000000..cdfec470b --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/OltpAlgoServiceTest.java @@ -0,0 +1,189 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hugegraph.unit; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Arrays; + +import org.junit.Test; +import org.mockito.Mockito; + +import org.apache.hugegraph.api.gremlin.GremlinRequest; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.driver.GraphManager; +import org.apache.hugegraph.driver.GremlinManager; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.query.GraphView; +import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.service.algorithm.OltpAlgoService; +import org.apache.hugegraph.structure.graph.Edge; +import org.apache.hugegraph.structure.graph.Path; +import org.apache.hugegraph.structure.graph.Vertex; +import org.apache.hugegraph.structure.gremlin.ResultSet; +import org.apache.hugegraph.testutil.Assert; + +public class OltpAlgoServiceTest { + + @Test + public void testBuildPathGraphViewKeepsPathEdges() throws Exception { + Vertex marko = new Vertex("person"); + marko.id("marko"); + Vertex vadas = new Vertex("person"); + vadas.id("vadas"); + + Edge knows = new Edge("knows"); + knows.id("S1:marko>vadas"); + knows.source(marko); + knows.target(vadas); + + HugeClient client = Mockito.mock(HugeClient.class); + Path path = new Path(Arrays.asList(marko, knows, vadas)); + + GraphView graphView = this.buildPathGraphView(client, path); + + Assert.assertEquals(2, graphView.getVertices().size()); + Assert.assertEquals(1, graphView.getEdges().size()); + Assert.assertTrue(graphView.getEdges().contains(knows)); + } + + @Test + public void testBuildPathGraphViewBackfillsEdgeEndpointVertices() + throws Exception { + Vertex marko = new Vertex("person"); + marko.id("marko"); + Vertex vadas = new Vertex("person"); + vadas.id("vadas"); + + Edge knows = new Edge("knows"); + knows.id("S1:marko>vadas"); + knows.source(marko); + knows.target(vadas); + + GremlinManager gremlin = Mockito.mock(GremlinManager.class); + Mockito.when(gremlin.gremlin(Mockito.anyString())) + .thenAnswer(invocation -> new GremlinRequest.Builder( + invocation.getArgument(0), gremlin)); + Mockito.when(gremlin.execute(Mockito.any())) + .thenReturn(this.resultSet(marko, vadas)); + HugeClient client = Mockito.mock(HugeClient.class); + Mockito.when(client.gremlin()).thenReturn(gremlin); + Path path = new Path(Arrays.asList(knows)); + + GraphView graphView = this.buildPathGraphView(client, path); + + Assert.assertEquals(2, graphView.getVertices().size()); + Assert.assertEquals(1, graphView.getEdges().size()); + Assert.assertTrue(graphView.getEdges().contains(knows)); + Mockito.verify(gremlin, Mockito.times(1)) + .gremlin("g.V('marko','vadas').limit(1000)"); + Mockito.verify(client, Mockito.never()).graph(); + } + + @Test + public void testBuildPathGraphViewBackfillsEdgesForVertexIdPath() + throws Exception { + Vertex marko = new Vertex("person"); + marko.id("marko"); + Vertex vadas = new Vertex("person"); + vadas.id("vadas"); + + Edge knows = new Edge("knows"); + knows.id("S1:marko>vadas"); + knows.source(marko); + knows.target(vadas); + + GremlinManager gremlin = Mockito.mock(GremlinManager.class); + Mockito.when(gremlin.gremlin(Mockito.anyString())) + .thenAnswer(invocation -> new GremlinRequest.Builder( + invocation.getArgument(0), gremlin)); + Mockito.when(gremlin.execute(Mockito.any())) + .thenReturn(this.resultSet(marko, vadas), + this.resultSet(knows)); + HugeClient client = Mockito.mock(HugeClient.class); + Mockito.when(client.gremlin()).thenReturn(gremlin); + OltpAlgoService service = this.serviceWithConfig(); + Path path = new Path(Arrays.asList("marko", "vadas")); + + GraphView graphView = this.buildPathGraphView(service, client, path); + + Assert.assertEquals(2, graphView.getVertices().size()); + Assert.assertEquals(1, graphView.getEdges().size()); + Assert.assertTrue(graphView.getEdges().contains(knows)); + Mockito.verify(gremlin).gremlin("g.V('marko','vadas').limit(1000)"); + Mockito.verify(gremlin).gremlin( + "g.V('marko','vadas').bothE().local(limit(1000)).dedup()"); + } + + @Test + public void testBuildPathGraphViewIgnoresNullVertexIds() + throws Exception { + HugeClient client = Mockito.mock(HugeClient.class); + OltpAlgoService service = this.serviceWithConfig(); + Path path = new Path(Arrays.asList((Object) null)); + + GraphView graphView = this.buildPathGraphView(service, client, path); + + Assert.assertEquals(0, graphView.getVertices().size()); + Assert.assertEquals(0, graphView.getEdges().size()); + Mockito.verify(client, Mockito.never()).gremlin(); + } + + private GraphView buildPathGraphView(HugeClient client, Path path) + throws Exception { + return this.buildPathGraphView(new OltpAlgoService(), client, path); + } + + private GraphView buildPathGraphView(OltpAlgoService service, + HugeClient client, Path path) + throws Exception { + Method method = OltpAlgoService.class.getDeclaredMethod("buildPathGraphView", + HugeClient.class, + Path.class); + method.setAccessible(true); + return (GraphView) method.invoke(service, client, path); + } + + private OltpAlgoService serviceWithConfig() throws Exception { + OltpAlgoService service = new OltpAlgoService(); + HugeConfig config = Mockito.mock(HugeConfig.class); + Mockito.when(config.get(HubbleOptions.GREMLIN_BATCH_QUERY_IDS)) + .thenReturn(1000); + Mockito.when(config.get(HubbleOptions.GREMLIN_EDGES_TOTAL_LIMIT)) + .thenReturn(1000); + Mockito.when(config.get(HubbleOptions.GREMLIN_VERTEX_DEGREE_LIMIT)) + .thenReturn(1000); + this.setField(service, "config", config); + return service; + } + + private ResultSet resultSet(Object... data) throws Exception { + ResultSet resultSet = new ResultSet(); + this.setField(resultSet, "data", Arrays.asList(data)); + resultSet.graphManager(Mockito.mock(GraphManager.class)); + return resultSet; + } + + private void setField(Object object, String name, Object value) + throws Exception { + Field field = object.getClass().getDeclaredField(name); + field.setAccessible(true); + field.set(object, value); + } +} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java index 6cdd3026a..fae068fbc 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java @@ -23,9 +23,11 @@ @RunWith(Suite.class) @Suite.SuiteClasses({ - EntityUtilTest.class, - FileUtilTest.class + FileUploadControllerTest.class, + FileUtilTest.class, + HubbleOptionsTest.class, + OltpAlgoControllerTest.class, + OltpAlgoServiceTest.class }) public class UnitTestSuite { - } diff --git a/hugegraph-hubble/hubble-be/src/test/python/steps/check_server_status.py b/hugegraph-hubble/hubble-be/src/test/python/steps/check_server_status.py index 317606acf..c84385383 100644 --- a/hugegraph-hubble/hubble-be/src/test/python/steps/check_server_status.py +++ b/hugegraph-hubble/hubble-be/src/test/python/steps/check_server_status.py @@ -16,13 +16,14 @@ # under the License. import json -import requests import sys + +import requests from assertpy import assert_that from behave import * -from imp import reload reload(sys) +sys.setdefaultencoding('utf8') use_step_matcher("re") diff --git a/hugegraph-hubble/hubble-be/src/test/resources/application.properties b/hugegraph-hubble/hubble-be/src/test/resources/application.properties index 65eb287d2..c0f4bb7b9 100644 --- a/hugegraph-hubble/hubble-be/src/test/resources/application.properties +++ b/hugegraph-hubble/hubble-be/src/test/resources/application.properties @@ -1,4 +1,5 @@ # +# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with this # work for additional information regarding copyright ownership. The ASF @@ -19,7 +20,7 @@ server.servlet.context-path=/api/v1.1 server.port=8088 spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.url=jdbc:h2:mem:db spring.datasource.username=sa spring.datasource.password= spring.datasource.schema=classpath:database/schema.sql @@ -37,10 +38,16 @@ spring.datasource.hikari.connection-test-query=SELECT 1 spring.messages.encoding=UTF-8 spring.messages.basename=i18n/messages -mybatis.type-aliases-package=org.apache.hugegraph.entity -mybatis-plus.type-enums-package=org.apache.hugegraph.entity.enums +mybatis.type-aliases-package=com.baidu.hugegraph.entity +mybatis-plus.type-enums-package=com.baidu.hugegraph.entity.enums mybatis.configuration.cache-enabled=false mybatis.configuration.map-underscore-to-camel-case=true mybatis.configuration.use-generated-keys=true mybatis.configuration.default-executor-type=reuse mybatis.configuration.default-statement-timeout=600 + +logging.level.org.springframework=WARN +logging.level.com.baidu.hugegraph.mapper=DEBUG +logging.level.com.baidu.hugegraph.service=INFO +logging.file=logs/hugegraph-hubble.log +logging.file.max-size=10MB diff --git a/hugegraph-hubble/hubble-be/src/test/resources/database/data.sql b/hugegraph-hubble/hubble-be/src/test/resources/database/data.sql index d68b739a6..a590bcb84 100644 --- a/hugegraph-hubble/hubble-be/src/test/resources/database/data.sql +++ b/hugegraph-hubble/hubble-be/src/test/resources/database/data.sql @@ -1,5 +1,6 @@ SELECT 1; /* + * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this * work for additional information regarding copyright ownership. The ASF diff --git a/hugegraph-hubble/hubble-be/src/test/resources/database/schema.sql b/hugegraph-hubble/hubble-be/src/test/resources/database/schema.sql index c4c646f51..1b343c9a3 100644 --- a/hugegraph-hubble/hubble-be/src/test/resources/database/schema.sql +++ b/hugegraph-hubble/hubble-be/src/test/resources/database/schema.sql @@ -1,18 +1,19 @@ /* + * * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. */ CREATE TABLE IF NOT EXISTS `user_info` ( @@ -29,11 +30,8 @@ CREATE TABLE IF NOT EXISTS `graph_connection` ( `graph` VARCHAR(48) NOT NULL, `host` VARCHAR(48) NOT NULL DEFAULT 'localhost', `port` INT NOT NULL DEFAULT '8080', - `timeout` INT NOT NULL, `username` VARCHAR(48), `password` VARCHAR(48), - `enabled` BOOLEAN NOT NULL DEFAULT true, - `disable_reason` VARCHAR(65535) NOT NULL DEFAULT '', `create_time` DATETIME(6) NOT NULL, PRIMARY KEY (`id`), UNIQUE (`name`), @@ -42,95 +40,19 @@ CREATE TABLE IF NOT EXISTS `graph_connection` ( CREATE TABLE IF NOT EXISTS `execute_history` ( `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL, - `async_id` LONG NOT NULL DEFAULT 0, `execute_type` TINYINT NOT NULL, `content` VARCHAR(65535) NOT NULL, `execute_status` TINYINT NOT NULL, - `async_status` TINYINT NOT NULL DEFAULT 0, `duration` LONG NOT NULL, `create_time` DATETIME(6) NOT NULL, PRIMARY KEY (`id`) ); -CREATE INDEX IF NOT EXISTS `execute_history_conn_id` ON `execute_history`(`conn_id`); CREATE TABLE IF NOT EXISTS `gremlin_collection` ( `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL, `name` VARCHAR(48) NOT NULL, `content` VARCHAR(65535) NOT NULL, `create_time` DATETIME(6) NOT NULL, PRIMARY KEY (`id`), - UNIQUE (`conn_id`, `name`) -); -CREATE INDEX IF NOT EXISTS `gremlin_collection_conn_id` ON `gremlin_collection`(`conn_id`); - -CREATE TABLE IF NOT EXISTS `file_mapping` ( - `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL, - `job_id` INT NOT NULL DEFAULT 0, - `name` VARCHAR(128) NOT NULL, - `path` VARCHAR(256) NOT NULL, - `total_lines` LONG NOT NULL, - `total_size` LONG NOT NULL, - `file_status` TINYINT NOT NULL DEFAULT 0, - `file_setting` VARCHAR(65535) NOT NULL, - `vertex_mappings` VARCHAR(65535) NOT NULL, - `edge_mappings` VARCHAR(65535) NOT NULL, - `load_parameter` VARCHAR(65535) NOT NULL, - `create_time` DATETIME(6) NOT NULL, - `update_time` DATETIME(6) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE (`conn_id`, `job_id`, `name`) -); -CREATE INDEX IF NOT EXISTS `file_mapping_conn_id` ON `file_mapping`(`conn_id`); - -CREATE TABLE IF NOT EXISTS `load_task` ( - `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL, - `job_id` INT NOT NULL DEFAULT 0, - `file_id` INT NOT NULL, - `file_name` VARCHAR(128) NOT NULL, - `options` VARCHAR(65535) NOT NULL, - `vertices` VARCHAR(512) NOT NULL, - `edges` VARCHAR(512) NOT NULL, - `file_total_lines` LONG NOT NULL, - `load_status` TINYINT NOT NULL, - `file_read_lines` LONG NOT NULL, - `last_duration` LONG NOT NULL, - `curr_duration` LONG NOT NULL, - `create_time` DATETIME(6) NOT NULL, - PRIMARY KEY (`id`) + UNIQUE (`name`) ); - -CREATE TABLE IF NOT EXISTS `job_manager` ( - `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL DEFAULT 0, - `job_name` VARCHAR(100) NOT NULL DEFAULT '', - `job_remarks` VARCHAR(200) NOT NULL DEFAULT '', - `job_size` LONG NOT NULL DEFAULT 0, - `job_status` TINYINT NOT NULL DEFAULT 0, - `job_duration` LONG NOT NULL DEFAULT 0, - `update_time` DATETIME(6) NOT NULL, - `create_time` DATETIME(6) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE (`job_name`, `conn_id`) -); - -CREATE TABLE IF NOT EXISTS `async_task` ( - `id` INT NOT NULL AUTO_INCREMENT, - `conn_id` INT NOT NULL DEFAULT 0, - `task_id` INT NOT NULL DEFAULT 0, - `task_name` VARCHAR(100) NOT NULL DEFAULT '', - `task_reason` VARCHAR(200) NOT NULL DEFAULT '', - `task_type` TINYINT NOT NULL DEFAULT 0, - `algorithm_name` VARCHAR(48) NOT NULL DEFAULT '', - `task_content` VARCHAR(65535) NOT NULL DEFAULT '', - `task_status` TINYINT NOT NULL DEFAULT 0, - `task_duration` LONG NOT NULL DEFAULT 0, - `create_time` DATETIME(6) NOT NULL, - PRIMARY KEY (`id`) -); - -CREATE INDEX IF NOT EXISTS `load_task_conn_id` ON `load_task`(`conn_id`); -CREATE INDEX IF NOT EXISTS `load_task_file_id` ON `load_task`(`file_id`); diff --git a/hugegraph-hubble/hubble-be/src/test/resources/log4j2.xml b/hugegraph-hubble/hubble-be/src/test/resources/log4j2.xml deleted file mode 100644 index 3410533ba..000000000 --- a/hugegraph-hubble/hubble-be/src/test/resources/log4j2.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - UTF-8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hugegraph-hubble/hubble-dist/assembly/travis/run_algorithm_api_inventory.py b/hugegraph-hubble/hubble-dist/assembly/travis/run_algorithm_api_inventory.py new file mode 100755 index 000000000..4aec356cf --- /dev/null +++ b/hugegraph-hubble/hubble-dist/assembly/travis/run_algorithm_api_inventory.py @@ -0,0 +1,360 @@ +#!/usr/bin/env python3 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import argparse +import json +import re +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parents[4] +FE_ROOT = REPO_ROOT / "hugegraph-hubble" / "hubble-fe" / "src" +BE_ROOT = REPO_ROOT / "hugegraph-hubble" / "hubble-be" / "src" / "main" / "java" +COMPATIBILITY_ALIASES = { + "allshortpath": "allshortestpaths", + "shortpath": "shortestPath", +} + + +def parse_object_string_entries(body): + pattern = re.compile( + r"^\s*(?:(?P['\"])(?P\w+)(?P=key_quote)|" + r"(?P\w+))\s*:\s*(?P['\"])" + r"(?P(?:\\.|(?!(?P=value_quote)).)*)(?P=value_quote)", + re.MULTILINE + ) + entries = [] + for match in pattern.finditer(body): + entries.append(( + match.group("quoted_key") or match.group("bare_key"), + unescape_js_string(match.group("value")) + )) + return entries + + +def parse_algorithm_url_entries(body): + pattern = re.compile( + r"\[\s*ALGORITHM_NAME\.(?P\w+)\s*\]\s*:\s*" + r"(?P['\"])(?P(?:\\.|(?!(?P=quote)).)*)(?P=quote)" + ) + entries = [] + for match in pattern.finditer(body): + entries.append(( + match.group("symbol"), + unescape_js_string(match.group("url")) + )) + return entries + + +def unescape_js_string(value): + return value.replace("\\'", "'").replace('\\"', '"').replace("\\\\", "\\") + + +def parse_algorithm_names(): + source = FE_ROOT / "utils" / "constants.js" + text = source.read_text(encoding="utf-8") + match = re.search(r"export const ALGORITHM_NAME = \{(?P.*?)\};", text, + re.DOTALL) + if not match: + raise RuntimeError("Unable to find ALGORITHM_NAME in constants.js") + return dict(parse_object_string_entries(match.group("body"))) + + +def parse_frontend_algorithm_urls(algorithm_names): + source = FE_ROOT / "utils" / "constants.js" + text = source.read_text(encoding="utf-8") + match = re.search(r"export const Algorithm_Url = \{(?P.*?)\};", text, + re.DOTALL) + if not match: + raise RuntimeError("Unable to find Algorithm_Url in constants.js") + urls = [] + seen = set() + for symbol, url in parse_algorithm_url_entries(match.group("body")): + key = (symbol, url) + if key in seen: + continue + seen.add(key) + urls.append({ + "symbol": symbol, + "ui_name": algorithm_names.get(symbol, symbol), + "frontend_url": url, + "source": str(source.relative_to(REPO_ROOT)) + }) + return urls + + +def parse_backend_algorithm_endpoints(): + controller = (BE_ROOT / "org" / "apache" / "hugegraph" / "controller" / + "algorithm" / "OltpAlgoController.java") + text = controller.read_text(encoding="utf-8") + endpoints = [] + for annotation in re.findall(r"@PostMapping\(([^)]*)\)", text): + endpoints.extend(re.findall(r"\"([^\"]+)\"", annotation)) + return sorted(set(endpoints)) + + +def controller_has_mapping(controller_name, pattern): + controller = (BE_ROOT / "org" / "apache" / "hugegraph" / "controller" / + controller_name) + text = controller.read_text(encoding="utf-8") + return re.search(pattern, text, re.DOTALL) is not None + + +def write_report(path, inventory, boundary): + aliases = inventory_aliases(boundary) + backend_only = inventory_backend_only(boundary) + lines = [ + "# Hubble Algorithm API Inventory", + "", + "Generated from source code. This classifies FE OLTP algorithm slugs " + "against Hubble BE OLTP controller routes. OLAP, Vermeer, and Cypher " + "are boundary-route checks; this is not live API proof.", + "", + "## Summary", + "", + "| Metric | Count |", + "|-|-|", + f"| FE OLTP algorithm slugs | {len(inventory)} |", + f"| BE compatibility aliases | {len(aliases)} |", + f"| Non-alias BE-only endpoints | {len(backend_only)} |", + "", + "## FE OLTP Slug Inventory", + "", + "| UI algorithm | Frontend slug | Hubble BE endpoint | Status |", + "|-|-|-|-|", + ] + for item in inventory: + endpoint = item["backend_endpoint"] or "" + lines.append("| {ui_name} | {frontend_url} | {endpoint} | {status} |".format( + ui_name=item["ui_name"], + frontend_url=item["frontend_url"] or "", + endpoint=endpoint, + status=item["status"] + )) + lines.extend([ + "", + "## Boundary Routes", + "", + "| Area | Hubble route present | Verification scope |", + "|-|-|-|", + ]) + for item in boundary: + lines.append("| {area} | {present} | {scope} |".format( + area=item["area"], + present="yes" if item["route_present"] else "no", + scope=item["verification_scope"] + )) + lines.extend([ + "", + "## Backend Compatibility Aliases", + "", + "| Backend endpoint | Canonical endpoint | Status |", + "|-|-|-|", + ]) + for item in sorted(inventory_aliases(boundary), key=lambda alias: alias["endpoint"]): + lines.append("| {endpoint} | {canonical} | {status} |".format( + endpoint=item["endpoint"], + canonical=item["canonical_endpoint"], + status=item["status"] + )) + lines.extend([ + "", + "## Non-Alias Backend-Only Endpoints", + "", + "| Backend endpoint | Status |", + "|-|-|", + ]) + if backend_only: + for endpoint in backend_only: + lines.append(f"| {endpoint} | backend-only-without-frontend-slug |") + else: + lines.append("| | none |") + path.write_text("\n".join(lines) + "\n", encoding="utf-8") + + +def inventory_aliases(boundary): + for item in boundary: + if item.get("area") == "OLTP algorithms": + return item.get("compatibility_aliases", []) + return [] + + +def inventory_backend_only(boundary): + for item in boundary: + if item.get("area") == "OLTP algorithms": + return item.get("backend_only_endpoints", []) + return [] + + +def main(): + parser = argparse.ArgumentParser(description="Inventory Hubble algorithm API boundaries") + parser.add_argument("--json-output", type=Path, + help="Optional path for machine-readable inventory") + parser.add_argument("--markdown-output", type=Path, + help="Optional path for markdown inventory") + parser.add_argument("--self-test", action="store_true", + help="Run parser self-tests and exit") + args = parser.parse_args() + if args.self_test: + run_self_tests() + return + + algorithm_names = parse_algorithm_names() + frontend_urls = parse_frontend_algorithm_urls(algorithm_names) + backend_endpoints = parse_backend_algorithm_endpoints() + backend_endpoint_set = set(backend_endpoints) + inventory = [] + + for frontend in frontend_urls: + frontend_url = frontend.get("frontend_url") + backend_endpoint = None + status = "frontend-listed-without-hubble-be-route" + if frontend_url in backend_endpoint_set: + backend_endpoint = frontend_url + status = "supported-by-hubble-be" + inventory.append({ + "symbol": frontend["symbol"], + "ui_name": frontend["ui_name"], + "frontend_url": frontend_url, + "frontend_source": frontend.get("source"), + "backend_endpoint": backend_endpoint, + "status": status + }) + + frontend_url_set = {item["frontend_url"] for item in frontend_urls} + compatibility_aliases = [ + { + "endpoint": endpoint, + "canonical_endpoint": COMPATIBILITY_ALIASES[endpoint], + "status": "backend-only-compatibility-alias" + } + for endpoint in backend_endpoints + if endpoint in COMPATIBILITY_ALIASES + ] + backend_only = [ + endpoint for endpoint in backend_endpoints + if endpoint not in frontend_url_set and endpoint not in COMPATIBILITY_ALIASES + ] + boundary = [ + { + "area": "OLTP algorithms", + "route_present": len(backend_endpoints) > 0, + "compatibility_aliases": compatibility_aliases, + "backend_only_endpoints": backend_only, + "verification_scope": ("source inventory for all routes; " + "live smoke covers shortestPath") + }, + { + "area": "OLAP algorithms", + "route_present": controller_has_mapping( + "algorithm/OlapAlgoController.java", + r"algorithms/olap" + ), + "verification_scope": ("source route inventory only; live execution " + "depends on computer backend configuration") + }, + { + "area": "Vermeer algorithms", + "route_present": controller_has_mapping( + "algorithm/VermeerAlgoController.java", + r"algorithms/vermeer" + ), + "verification_scope": ("source route inventory only; live execution " + "depends on Vermeer graph loading") + }, + { + "area": "Cypher", + "route_present": controller_has_mapping( + "query/CypherController.java", + r"/\{graph\}/cypher" + ), + "verification_scope": "source route inventory plus optional live smoke" + }, + ] + + result = { + "backend_algorithm_endpoints": backend_endpoints, + "backend_compatibility_aliases": compatibility_aliases, + "backend_only_endpoints": backend_only, + "boundary_routes": boundary, + "inventory": inventory, + "summary": { + "frontend_algorithm_count": len(frontend_urls), + "backend_algorithm_endpoint_count": len(backend_endpoints), + "supported_by_hubble_be_count": sum( + 1 for item in inventory if item["status"] == "supported-by-hubble-be" + ), + "frontend_only_count": sum( + 1 for item in inventory + if item["status"] == "frontend-listed-without-hubble-be-route" + ), + "backend_compatibility_alias_count": len(compatibility_aliases), + "backend_only_count": len(backend_only) + } + } + + if args.json_output: + args.json_output.parent.mkdir(parents=True, exist_ok=True) + args.json_output.write_text(json.dumps(result, indent=2, sort_keys=True) + "\n", + encoding="utf-8") + if args.markdown_output: + args.markdown_output.parent.mkdir(parents=True, exist_ok=True) + write_report(args.markdown_output, inventory, boundary) + + print(json.dumps(result["summary"], sort_keys=True)) + if result["summary"]["frontend_algorithm_count"] == 0: + raise SystemExit("No FE algorithm URLs found") + if result["summary"]["backend_algorithm_endpoint_count"] == 0: + raise SystemExit("No Hubble BE algorithm endpoints found") + if result["summary"]["frontend_only_count"] > 0: + raise SystemExit("Some FE algorithm slugs have no Hubble BE route") + if result["summary"]["backend_only_count"] > 0: + raise SystemExit("Some non-alias Hubble BE endpoints have no FE slug") + if not all(item["route_present"] for item in boundary): + raise SystemExit("Some Hubble analysis boundary routes are missing") + + +def run_self_tests(): + names = parse_object_string_entries(""" + PAGE_RANK: 'PageRank', + "K_OUT": "K-out", + 'QUOTE': 'Don\\'t stop', + """) + assert dict(names) == { + "PAGE_RANK": "PageRank", + "K_OUT": "K-out", + "QUOTE": "Don't stop", + } + + urls = parse_frontend_algorithm_urls({"PAGE_RANK": "PageRank", "K_OUT": "K-out"}) + assert urls, "repository Algorithm_Url entries should parse" + + synthetic_url_body = """ + [ALGORITHM_NAME.PAGE_RANK]: "pageRank", + [ALGORITHM_NAME.K_OUT]: 'kout', + """ + assert parse_algorithm_url_entries(synthetic_url_body) == [ + ("PAGE_RANK", "pageRank"), + ("K_OUT", "kout") + ] + assert COMPATIBILITY_ALIASES["shortpath"] == "shortestPath" + print(json.dumps({"status": "passed", "selfTests": 4}, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/hugegraph-hubble/hubble-dist/assembly/travis/run_live_hubble_smoke.py b/hugegraph-hubble/hubble-dist/assembly/travis/run_live_hubble_smoke.py new file mode 100755 index 000000000..371173ab0 --- /dev/null +++ b/hugegraph-hubble/hubble-dist/assembly/travis/run_live_hubble_smoke.py @@ -0,0 +1,705 @@ +#!/usr/bin/env python3 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import argparse +import gzip +import json +import os +import shutil +import subprocess +import tarfile +import tempfile +import time +import urllib.error +import urllib.parse +import urllib.request +import uuid +from pathlib import Path + + +def request(method, url, body=None, headers=None, timeout=10): + data = None + merged_headers = {"Accept-Encoding": "identity", **(headers or {})} + if body is not None: + if isinstance(body, bytes): + data = body + else: + data = json.dumps(body).encode("utf-8") + merged_headers = {"Content-Type": "application/json", + **merged_headers} + req = urllib.request.Request(url, data=data, headers=merged_headers, + method=method) + with urllib.request.urlopen(req, timeout=timeout) as response: + raw_payload = response.read() + if response.headers.get("Content-Encoding") == "gzip": + raw_payload = gzip.decompress(raw_payload) + payload = raw_payload.decode("utf-8") + content_type = response.headers.get("Content-Type", "") + if ("application/json" in content_type or "+json" in content_type) and payload: + return json.loads(payload) + return payload + + +def unwrap(response, name): + if not isinstance(response, dict) or response.get("status") != 200: + raise RuntimeError(f"{name} failed: {response}") + return response.get("data") + + +def server_json(method, server_url, path, body=None, timeout=10): + return request(method, f"{server_url}{path}", body, timeout=timeout) + + +def wait_for_health(hubble_url, deadline_seconds): + deadline = time.time() + deadline_seconds + last_error = None + while time.time() < deadline: + try: + response = request("GET", f"{hubble_url}/actuator/health", timeout=3) + if isinstance(response, dict) and response.get("status") == "UP": + return response + except Exception as exc: # noqa: BLE001 - smoke tool should report final error + last_error = exc + time.sleep(1) + raise RuntimeError(f"Hubble health did not become UP: {last_error}") + + +def extract_tarball(tarball, work_dir): + with tarfile.open(tarball, "r:gz") as archive: + archive.extractall(work_dir) + homes = [path for path in work_dir.iterdir() + if path.is_dir() and path.name.startswith("apache-hugegraph-hubble-")] + if not homes: + raise RuntimeError(f"Unable to find Hubble home under {work_dir}") + return homes[0] + + +def configure_hubble_bind_host(hubble_home, bind_host): + if not bind_host: + return + conf = hubble_home / "conf" / "hugegraph-hubble.properties" + text = conf.read_text(encoding="utf-8") + lines = [] + replaced = False + for line in text.splitlines(): + if line.startswith("hubble.host="): + lines.append(f"hubble.host={bind_host}") + replaced = True + else: + lines.append(line) + if not replaced: + lines.append(f"hubble.host={bind_host}") + conf.write_text("\n".join(lines) + "\n", encoding="utf-8") + + +def create_connection(hubble_url, server_url, graph_name, connection_name): + parsed = urllib.parse.urlparse(server_url) + port = parsed.port or (443 if parsed.scheme == "https" else 80) + existing = request( + "GET", + f"{hubble_url}/api/v1.2/graph-connections?page_no=1&page_size=100" + ) + records = ((existing.get("data") or {}).get("records") or [] + if isinstance(existing, dict) else []) + for record in records: + if (record.get("graph") == graph_name and + record.get("host") == parsed.hostname and + record.get("port") == port): + return record.get("id") + body = { + "name": connection_name, + "graph": graph_name, + "host": parsed.hostname, + "port": port, + "username": "", + "password": "", + "protocol": parsed.scheme or "http" + } + data = unwrap(request("POST", f"{hubble_url}/api/v1.2/graph-connections", + body), + "create Hubble connection") + conn_id = data.get("id") + if conn_id is None: + raise RuntimeError(f"Create Hubble connection returned no id: {data}") + return conn_id + + +def run_hubble_only_checks(hubble_url): + checks = [] + health = request("GET", f"{hubble_url}/actuator/health") + checks.append({"name": "hubble-health", "status": "passed", "detail": health}) + root = request("GET", f"{hubble_url}/") + if '
' not in root: + raise RuntimeError("Hubble root did not serve React root") + checks.append({"name": "hubble-ui-root", "status": "passed"}) + for route in ( + "/graph-management", + "/graph-management/1/metadata-configs", + "/graph-management/1/data-import/import-manager", + "/graph-management/1/data-analyze", + "/graph-management/1/async-tasks", + ): + body = request("GET", f"{hubble_url}{route}") + if '
' not in body: + raise RuntimeError(f"Route did not serve React root: {route}") + checks.append({"name": f"route:{route}", "status": "passed"}) + return checks + + +def run_server_checks(hubble_url, server_url, graph_name, connection_name): + checks = [] + versions = request("GET", f"{server_url}/versions") + checks.append({"name": "server-versions", "status": "passed", + "detail_type": type(versions).__name__}) + conn_id = create_connection(hubble_url, server_url, graph_name, + connection_name) + checks.append({"name": "hubble-create-graph-connection", "status": "passed", + "conn_id": conn_id}) + for name, path in ( + ("schema-graphview", "schema/graphview"), + ("job-manager-list", "job-manager?page_no=1&page_size=10"), + ("async-task-list", "async-tasks?page_no=1&page_size=10"), + ): + response = request("GET", f"{hubble_url}/api/v1.2/graph-connections/{conn_id}/{path}") + if response.get("status") != 200: + raise RuntimeError(f"{name} failed: {response}") + checks.append({"name": name, "status": "passed"}) + return checks + + +def get_json_status(method, url, body=None): + try: + response = request(method, url, body) + if isinstance(response, dict): + return response.get("status", 200) + return 200 + except urllib.error.HTTPError as exc: + try: + payload = exc.read().decode("utf-8") + response = json.loads(payload) + return response.get("status", exc.code) + except (UnicodeDecodeError, json.JSONDecodeError): + return exc.code + + +def run_analysis_boundary_checks(hubble_url, graph_space, graph_name): + base = f"{hubble_url}/api/v1.3/graphspaces/{graph_space}/graphs/{graph_name}" + checks = [] + + cypher_status = get_json_status( + "GET", + f"{base}/cypher?cypher={urllib.parse.quote('MATCH (n) RETURN n LIMIT 1')}" + ) + checks.append({ + "name": "analysis-cypher-boundary", + "status": "passed", + "http_or_business_status": cypher_status, + "classification": ("hubble-api-available" + if cypher_status == 200 else + "boundary-or-environment-dependent") + }) + + olap_status = get_json_status("POST", f"{base}/algorithms/olap", { + "algorithm": "pagerank", + "worker": 1, + "params": {} + }) + checks.append({ + "name": "analysis-olap-boundary", + "status": "passed", + "http_or_business_status": olap_status, + "classification": ("hubble-api-available" + if olap_status == 200 else + "boundary-or-environment-dependent") + }) + + return checks + + +def ignore_conflict(call): + try: + return call() + except urllib.error.HTTPError as exc: + if exc.code == 400: + return None + raise + + +def create_schema(hubble_url, server_url, graph_name, conn_id, prefix): + base = f"{hubble_url}/api/v1.2/graph-connections/{conn_id}/schema" + pk_id = f"{prefix}_id" + pk_name = f"{prefix}_name" + pk_rank = f"{prefix}_rank" + vl_person = f"{prefix}_person" + el_knows = f"{prefix}_knows" + + checks = [] + for name, data_type in ((pk_id, "TEXT"), (pk_name, "TEXT"), + (pk_rank, "INT")): + body = {"name": name, "data_type": data_type, "cardinality": "SINGLE"} + response = ignore_conflict( + lambda body=body: request("POST", f"{base}/propertykeys", body) + ) + if response is not None: + unwrap(response, f"create property key {name}") + checks.append({"name": "hubble-schema-propertykeys", "status": "passed"}) + + vertex_body = { + "name": vl_person, + "id_strategy": "CUSTOMIZE_STRING", + "properties": [ + {"name": pk_name, "nullable": True}, + {"name": pk_rank, "nullable": True} + ], + "primary_keys": [], + "property_indexes": [], + "open_label_index": True, + "style": {"color": "#2B65FF", "icon": "user", + "display_fields": []} + } + response = ignore_conflict( + lambda: request("POST", f"{base}/vertexlabels", vertex_body) + ) + if response is not None: + unwrap(response, f"create vertex label {vl_person}") + checks.append({"name": "hubble-schema-vertexlabel", "status": "passed", + "label": vl_person}) + + edge_body = { + "name": el_knows, + "source_label": vl_person, + "target_label": vl_person, + "link_multi_times": False, + "properties": [], + "sort_keys": [], + "property_indexes": [], + "open_label_index": True, + "style": {"color": "#0EB880", "display_fields": []} + } + response = ignore_conflict( + lambda: request("POST", f"{base}/edgelabels", edge_body) + ) + if response is not None: + unwrap(response, f"create edge label {el_knows}") + checks.append({"name": "hubble-schema-edgelabel", "status": "passed", + "label": el_knows}) + + direct = server_json("GET", server_url, + f"/graphs/{graph_name}/schema/vertexlabels/{vl_person}") + if direct.get("name") != vl_person: + raise RuntimeError(f"Direct Server schema check failed: {direct}") + checks.append({"name": "server-direct-schema-vertexlabel", + "status": "passed", "label": vl_person}) + return checks, { + "pk_id": pk_id, + "pk_name": pk_name, + "pk_rank": pk_rank, + "vl_person": vl_person, + "el_knows": el_knows + } + + +def encode_multipart(fields, file_field, file_name, content): + boundary = "----hubble694" + uuid.uuid4().hex + parts = [] + for name, value in fields.items(): + parts.append( + f"--{boundary}\r\n" + f"Content-Disposition: form-data; name=\"{name}\"\r\n\r\n" + f"{value}\r\n".encode("utf-8") + ) + parts.append( + f"--{boundary}\r\n" + f"Content-Disposition: form-data; name=\"{file_field}\"; " + f"filename=\"{file_name}\"\r\n" + "Content-Type: text/csv\r\n\r\n".encode("utf-8") + ) + parts.append(content) + parts.append(f"\r\n--{boundary}--\r\n".encode("utf-8")) + return b"".join(parts), f"multipart/form-data; boundary={boundary}" + + +def upload_csv(hubble_url, conn_id, prefix, schema): + job = unwrap(request("POST", + f"{hubble_url}/api/v1.2/graph-connections/{conn_id}/job-manager", + {"job_name": f"{prefix}_job", + "job_remarks": "issue_694_live_loader_smoke"}), + "create loader job") + job_id = job["id"] + file_name = f"{prefix}_edges.csv" + csv_text = ( + f"source,target,{schema['pk_name']},{schema['pk_rank']}\n" + f"{prefix}_alice,{prefix}_bob,Alice,1\n" + f"{prefix}_bob,{prefix}_carol,Bob,2\n" + ) + token_map = unwrap(request( + "GET", + f"{hubble_url}/api/v1.2/graph-connections/{conn_id}/job-manager/" + f"{job_id}/upload-file/token?names={urllib.parse.quote(file_name)}" + ), "create upload token") + token = token_map[file_name] + multipart_body, content_type = encode_multipart( + { + "name": file_name, + "size": str(len(csv_text.encode("utf-8"))), + "token": token, + "total": "1", + "index": "0" + }, + "file", + file_name, + csv_text.encode("utf-8") + ) + upload = unwrap(request( + "POST", + f"{hubble_url}/api/v1.2/graph-connections/{conn_id}/job-manager/" + f"{job_id}/upload-file", + multipart_body, + {"Content-Type": content_type} + ), "upload loader csv") + file_id = upload["id"] + unwrap(request( + "PUT", + f"{hubble_url}/api/v1.2/graph-connections/{conn_id}/job-manager/" + f"{job_id}/upload-file/next-step" + ), "advance upload step") + return job_id, file_id + + +def configure_mapping(hubble_url, conn_id, job_id, file_id, schema): + base = (f"{hubble_url}/api/v1.2/graph-connections/{conn_id}/job-manager/" + f"{job_id}/file-mappings") + mapping = unwrap(request("POST", f"{base}/{file_id}/file-setting", { + "has_header": True, + "format": "CSV", + "delimiter": ",", + "charset": "UTF-8", + "date_format": "yyyy-MM-dd HH:mm:ss", + "time_zone": "GMT+8", + "skipped_line": "(^#|^//).*|" + }), "configure file setting") + if "source" not in mapping["file_setting"]["column_names"]: + raise RuntimeError(f"File setting did not read CSV columns: {mapping}") + + null_values = {"checked": ["", "NULL", "null"], "customized": []} + unwrap(request("POST", f"{base}/{file_id}/vertex-mappings", { + "label": schema["vl_person"], + "id_fields": ["source"], + "field_mapping": [ + {"column_name": schema["pk_name"], "mapped_name": schema["pk_name"]}, + {"column_name": schema["pk_rank"], "mapped_name": schema["pk_rank"]} + ], + "value_mapping": [], + "null_values": null_values + }), "add source vertex mapping") + unwrap(request("POST", f"{base}/{file_id}/vertex-mappings", { + "label": schema["vl_person"], + "id_fields": ["target"], + "field_mapping": [], + "value_mapping": [], + "null_values": null_values + }), "add target vertex mapping") + unwrap(request("POST", f"{base}/{file_id}/edge-mappings", { + "label": schema["el_knows"], + "source_fields": ["source"], + "target_fields": ["target"], + "field_mapping": [], + "value_mapping": [], + "null_values": null_values + }), "add edge mapping") + unwrap(request("PUT", f"{base}/next-step"), "advance mapping step") + unwrap(request("POST", f"{base}/load-parameter", { + "check_vertex": False, + "insert_timeout": 60, + "max_parse_errors": 1, + "max_insert_errors": 1, + "retry_times": 1, + "retry_interval": 1 + }), "configure load parameters") + + +def wait_for_load_task(hubble_url, conn_id, job_id, file_id): + base = (f"{hubble_url}/api/v1.2/graph-connections/{conn_id}/job-manager/" + f"{job_id}/load-tasks") + tasks = unwrap(request("POST", f"{base}/start?file_mapping_ids={file_id}", + {}), + "start load task") + if not tasks: + raise RuntimeError("Load task start returned no tasks") + task_id = tasks[0]["id"] + deadline = time.time() + 90 + last_task = tasks[0] + while time.time() < deadline: + last_task = unwrap(request("GET", f"{base}/{task_id}"), + "poll load task") + status = last_task.get("status") + if status in ("SUCCEED", "FAILED", "STOPPED", "PAUSED"): + break + time.sleep(1) + if last_task.get("status") != "SUCCEED": + raise RuntimeError(f"Load task did not succeed: {last_task}") + job = unwrap(request( + "GET", + f"{hubble_url}/api/v1.2/graph-connections/{conn_id}/job-manager/{job_id}" + ), "poll loader job") + return task_id, last_task, job + + +def first_table_value(gremlin_result): + table = gremlin_result.get("table_view") or gremlin_result.get("tableView") + if not table: + raise RuntimeError(f"No table view in gremlin result: {gremlin_result}") + rows = table.get("data") or table.get("rows") or [] + if not rows: + raise RuntimeError(f"No rows in gremlin result: {gremlin_result}") + row = rows[0] + if isinstance(row, dict): + return next(iter(row.values())) + if isinstance(row, list): + return row[0] + return row + + +def run_hubble_gremlin(hubble_url, conn_id, content): + return unwrap(request( + "POST", + f"{hubble_url}/api/v1.2/graph-connections/{conn_id}/gremlin-query", + {"content": content} + ), f"Hubble Gremlin {content}") + + +def run_server_gremlin_count(server_url, content): + response = server_json("POST", server_url, "/gremlin", {"gremlin": content}) + try: + return int(response["result"]["data"][0]) + except (KeyError, IndexError, TypeError, ValueError) as exc: + raise RuntimeError(f"Unexpected Server Gremlin response: {response}") from exc + + +def run_live_function_flow(hubble_url, server_url, graph_name, conn_id, prefix): + checks = [] + schema_checks, schema = create_schema(hubble_url, server_url, graph_name, + conn_id, prefix) + checks.extend(schema_checks) + job_id, file_id = upload_csv(hubble_url, conn_id, prefix, schema) + checks.append({"name": "hubble-upload-csv", "status": "passed", + "job_id": job_id, "file_mapping_id": file_id}) + configure_mapping(hubble_url, conn_id, job_id, file_id, schema) + checks.append({"name": "hubble-file-mapping", "status": "passed", + "file_mapping_id": file_id}) + task_id, task, job = wait_for_load_task(hubble_url, conn_id, job_id, file_id) + checks.append({"name": "hubble-loader-task", "status": "passed", + "task_id": task_id, "task_status": task.get("status"), + "job_status": job.get("job_status")}) + + vertex_gremlin = (f"g.V().hasLabel('{schema['vl_person']}')." + f"hasId(within('{prefix}_alice','{prefix}_bob'," + f"'{prefix}_carol')).count()") + edge_gremlin = (f"g.E().hasLabel('{schema['el_knows']}').count()") + h_vertices = int(first_table_value(run_hubble_gremlin(hubble_url, conn_id, + vertex_gremlin))) + h_edges = int(first_table_value(run_hubble_gremlin(hubble_url, conn_id, + edge_gremlin))) + server_vertex_gremlin = ( + f"hugegraph.traversal().V().hasLabel('{schema['vl_person']}')." + f"hasId(within('{prefix}_alice','{prefix}_bob'," + f"'{prefix}_carol')).count()" + ) + server_edge_gremlin = ( + f"hugegraph.traversal().E().hasLabel('{schema['el_knows']}').count()" + ) + d_vertices = run_server_gremlin_count(server_url, server_vertex_gremlin) + d_edges = run_server_gremlin_count(server_url, server_edge_gremlin) + if (h_vertices, h_edges) != (d_vertices, d_edges): + raise RuntimeError("Hubble and Server Gremlin counts differ: " + f"{(h_vertices, h_edges)} != {(d_vertices, d_edges)}") + checks.append({"name": "hubble-server-gremlin-count-compare", + "status": "passed", "vertices": h_vertices, + "edges": h_edges}) + + shortest_body = { + "source": f"{prefix}_alice", + "target": f"{prefix}_carol", + "direction": "OUT", + "label": schema["el_knows"], + "max_depth": 3, + "max_degree": 1000, + "skip_degree": 0, + "capacity": 10000 + } + hubble_shortest = unwrap(request( + "POST", + f"{hubble_url}/api/v1.2/graph-connections/{conn_id}/algorithms/shortpath", + shortest_body + ), "Hubble shortestPath") + direct_shortest = server_json( + "GET", server_url, + f"/graphs/{graph_name}/traversers/shortestpath" + f"?source={urllib.parse.quote(json.dumps(prefix + '_alice'))}" + f"&target={urllib.parse.quote(json.dumps(prefix + '_carol'))}" + f"&direction=OUT&label={urllib.parse.quote(schema['el_knows'])}" + f"&max_depth=3&max_degree=1000&skip_degree=0&capacity=10000" + ) + graph_view = (hubble_shortest.get("graph_view") or + hubble_shortest.get("graphView") or {}) + vertices = graph_view.get("vertices") or [] + edges = graph_view.get("edges") or [] + if len(vertices) < 3 or len(edges) < 2: + raise RuntimeError(f"Hubble shortestPath graph view incomplete: " + f"{hubble_shortest}") + direct_vertices = direct_shortest.get("vertices") or [] + direct_edges = direct_shortest.get("edges") or [] + direct_path = direct_shortest.get("path") or [] + if len(direct_vertices) < 3 or len(direct_edges) < 2 or len(direct_path) < 3: + raise RuntimeError(f"Server direct shortestPath returned no path: " + f"{direct_shortest}") + checks.append({"name": "hubble-server-shortestpath-compare", + "status": "passed", "hubble_vertices": len(vertices), + "hubble_edges": len(edges), + "server_vertices": len(direct_vertices), + "server_edges": len(direct_edges), + "server_path_objects": len(direct_path)}) + return checks + + +def main(): + parser = argparse.ArgumentParser(description="Run live Hubble issue #694 smoke") + parser.add_argument("tarball", type=Path) + parser.add_argument("--server-url", default="http://127.0.0.1:8080") + parser.add_argument("--hubble-url", default=os.environ.get("HUBBLE_URL", + "http://127.0.0.1:8088")) + parser.add_argument("--graph", default=os.environ.get("HUGEGRAPH_GRAPH", "hugegraph")) + parser.add_argument("--work-dir", type=Path) + parser.add_argument("--keep-work-dir", action="store_true") + parser.add_argument("--skip-start", action="store_true") + parser.add_argument("--foreground-start", action="store_true") + parser.add_argument("--bind-host") + parser.add_argument("--loader-flow", action="store_true") + parser.add_argument("--analysis-boundary", action="store_true") + parser.add_argument("--graphspace", default=os.environ.get("HUGEGRAPH_GRAPHSPACE", + "DEFAULT")) + parser.add_argument("--connection-name") + parser.add_argument("--data-prefix") + parser.add_argument("--json-output", type=Path) + args = parser.parse_args() + + hubble_url = args.hubble_url.rstrip("/") + server_url = args.server_url.rstrip("/") + work_dir = args.work_dir or Path(tempfile.mkdtemp(prefix="hubble-694-live-")) + created_work_dir = args.work_dir is None + hubble_home = None + process = None + log_handle = None + hubble_log = None + report = { + "tarball": str(args.tarball), + "hubble_url": hubble_url, + "server_url": server_url, + "graph": args.graph, + "checks": [], + "status": "failed" + } + prefix = args.data_prefix or f"issue_694_{int(time.time())}" + connection_name = args.connection_name or f"{prefix}_conn" + report["data_prefix"] = prefix + report["connection_name"] = connection_name + + try: + if not args.skip_start: + work_dir.mkdir(parents=True, exist_ok=True) + hubble_home = extract_tarball(args.tarball, work_dir) + configure_hubble_bind_host(hubble_home, args.bind_host) + hubble_log = work_dir / "hubble-live-smoke.log" + log_handle = hubble_log.open("w", encoding="utf-8") + if args.foreground_start: + process = subprocess.Popen( + [str(hubble_home / "bin" / "start-hubble.sh"), "-f"], + cwd=str(hubble_home), + stdout=log_handle, + stderr=subprocess.STDOUT, + text=True + ) + else: + result = subprocess.run( + [str(hubble_home / "bin" / "start-hubble.sh")], + cwd=str(hubble_home), + stdout=log_handle, + stderr=subprocess.STDOUT, + text=True, + check=False + ) + if result.returncode != 0: + raise RuntimeError("Hubble start script failed with " + f"exit code {result.returncode}") + wait_for_health(hubble_url, 90) + else: + wait_for_health(hubble_url, 10) + + report["checks"].extend(run_hubble_only_checks(hubble_url)) + report["checks"].extend(run_server_checks(hubble_url, server_url, + args.graph, connection_name)) + + if args.loader_flow: + conn_id = next(check["conn_id"] for check in report["checks"] + if check["name"] == "hubble-create-graph-connection") + report["checks"].extend(run_live_function_flow(hubble_url, + server_url, + args.graph, + conn_id, + prefix)) + if args.analysis_boundary: + report["checks"].extend(run_analysis_boundary_checks(hubble_url, + args.graphspace, + args.graph)) + + report["status"] = "passed" + except (urllib.error.URLError, RuntimeError) as exc: + report["error"] = str(exc) + if hubble_log is not None and hubble_log.exists(): + report["hubble_log_tail"] = "\n".join( + hubble_log.read_text(encoding="utf-8", errors="replace") + .splitlines()[-80:] + ) + raise SystemExit(json.dumps(report, indent=2, sort_keys=True)) + finally: + if process is not None: + process.terminate() + try: + process.wait(timeout=20) + except subprocess.TimeoutExpired: + process.kill() + if log_handle is not None: + log_handle.close() + if hubble_home is not None: + subprocess.run([str(hubble_home / "bin" / "stop-hubble.sh")], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + check=False) + if args.json_output: + args.json_output.parent.mkdir(parents=True, exist_ok=True) + args.json_output.write_text(json.dumps(report, indent=2, + sort_keys=True) + "\n", + encoding="utf-8") + if created_work_dir and not args.keep_work_dir: + shutil.rmtree(work_dir, ignore_errors=True) + + print(json.dumps(report, indent=2, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/hugegraph-hubble/hubble-dist/assembly/travis/run_ui_browser_smoke.js b/hugegraph-hubble/hubble-dist/assembly/travis/run_ui_browser_smoke.js new file mode 100755 index 000000000..d7246cc10 --- /dev/null +++ b/hugegraph-hubble/hubble-dist/assembly/travis/run_ui_browser_smoke.js @@ -0,0 +1,153 @@ +#!/usr/bin/env node +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const MAC_CHROME_PATHS = [ + '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', + '/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing', + path.join(process.env.HOME || '', + 'Library/Caches/ms-playwright/chromium-1226/chrome-mac-arm64/' + + 'Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing') +]; + +function argValue(name, fallback) { + const index = process.argv.indexOf(name); + if (index >= 0 && index + 1 < process.argv.length) { + return process.argv[index + 1]; + } + return fallback; +} + +function chromiumExecutablePath() { + const configured = argValue('--chromium-executable', + process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH || + process.env.CHROME_PATH || ''); + if (configured) { + return configured; + } + for (const candidate of MAC_CHROME_PATHS) { + if (candidate && fs.existsSync(candidate)) { + return candidate; + } + } + return undefined; +} + +async function loadPlaywright() { + try { + return require('playwright'); + } catch (error) { + throw new Error( + 'Playwright is required for UI browser smoke. Install/enable it before ' + + 'closing the browser gate. Original error: ' + error.message + ); + } +} + +async function main() { + const hubbleUrl = (argValue('--hubble-url', process.env.HUBBLE_URL) || + 'http://127.0.0.1:8088').replace(/\/$/, ''); + const outputDir = path.resolve(argValue('--output-dir', + '.workflow/hubble-v2-issue-694/evidence/ui')); + const connId = argValue('--conn-id', process.env.HUBBLE_CONN_ID || '1'); + const jsonOutput = argValue('--json-output', ''); + const { chromium } = await loadPlaywright(); + const executablePath = chromiumExecutablePath(); + + fs.mkdirSync(outputDir, { recursive: true }); + const browser = await chromium.launch({ headless: true, executablePath }); + const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); + const network = []; + const consoleErrors = []; + + page.on('requestfinished', (request) => { + const url = request.url(); + if (url.includes('/api/v1.2/')) { + network.push({ method: request.method(), url }); + } + }); + page.on('console', (message) => { + if (message.type() === 'error') { + consoleErrors.push(message.text()); + } + }); + + const routes = [ + { name: 'graph-management', path: '/graph-management', + requiredApi: '/api/v1.2/graph-connections' }, + { name: 'metadata-configs', path: `/graph-management/${connId}/metadata-configs`, + requiredApi: `/api/v1.2/graph-connections/${connId}/schema/` }, + { name: 'data-import', path: `/graph-management/${connId}/data-import/import-manager`, + requiredApi: `/api/v1.2/graph-connections/${connId}/job-manager` }, + { name: 'data-analyze', path: `/graph-management/${connId}/data-analyze`, + requiredApi: `/api/v1.2/graph-connections/${connId}/schema/` }, + { name: 'async-tasks', path: `/graph-management/${connId}/async-tasks`, + requiredApi: `/api/v1.2/graph-connections/${connId}/async-tasks` } + ]; + + const results = []; + try { + for (const route of routes) { + network.length = 0; + await page.goto(hubbleUrl + route.path, { + waitUntil: 'networkidle', + timeout: 30000 + }); + const screenshot = path.join(outputDir, `${route.name}.png`); + await page.screenshot({ path: screenshot, fullPage: true }); + const text = await page.locator('body').innerText({ timeout: 5000 }); + const rawKeyPattern = /\b(addition|data-analyze|async-tasks|server-data-import)\.[A-Za-z0-9_.-]+/; + const apiMatched = network.some((entry) => entry.url.includes(route.requiredApi)); + results.push({ + route: route.path, + screenshot, + apiMatched, + requiredApi: route.requiredApi, + rawI18nKeyFound: rawKeyPattern.test(text), + requestCount: network.length + }); + } + } finally { + await browser.close(); + } + + const report = { + hubbleUrl, + results, + consoleErrors, + status: results.every((result) => result.apiMatched && + !result.rawI18nKeyFound) ? 'passed' : 'failed' + }; + if (jsonOutput) { + fs.mkdirSync(path.dirname(path.resolve(jsonOutput)), { recursive: true }); + fs.writeFileSync(jsonOutput, JSON.stringify(report, null, 2) + '\n'); + } + console.log(JSON.stringify(report, null, 2)); + if (report.status !== 'passed') { + process.exit(1); + } +} + +main().catch((error) => { + console.error(error.message); + process.exit(1); +}); diff --git a/hugegraph-hubble/hubble-dist/assembly/travis/run_ui_full_acceptance.js b/hugegraph-hubble/hubble-dist/assembly/travis/run_ui_full_acceptance.js new file mode 100755 index 000000000..dd012677c --- /dev/null +++ b/hugegraph-hubble/hubble-dist/assembly/travis/run_ui_full_acceptance.js @@ -0,0 +1,95 @@ +#!/usr/bin/env node +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const childProcess = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +function argValue(name, fallback) { + const index = process.argv.indexOf(name); + if (index >= 0 && index + 1 < process.argv.length) { + return process.argv[index + 1]; + } + return fallback; +} + +function run(name, command, args) { + const startedAt = new Date().toISOString(); + const result = childProcess.spawnSync(command, args, { + cwd: path.resolve(__dirname, '../../../..'), + encoding: 'utf-8' + }); + return { + name, + command: [command, ...args].join(' '), + startedAt, + status: result.status === 0 ? 'passed' : 'failed', + stdout: result.stdout, + stderr: result.stderr + }; +} + +function main() { + const scriptDir = __dirname; + const outputDir = path.resolve(argValue('--output-dir', + '.workflow/hubble-v2-issue-694/evidence/ui')); + const hubbleUrl = argValue('--hubble-url', process.env.HUBBLE_URL || + 'http://127.0.0.1:8088'); + const connId = argValue('--conn-id', process.env.HUBBLE_CONN_ID || '1'); + const chromiumExecutable = argValue('--chromium-executable', + process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH || + process.env.CHROME_PATH || ''); + const jsonOutput = argValue('--json-output', + path.join(outputDir, 'ui-full-acceptance.json')); + fs.mkdirSync(outputDir, { recursive: true }); + + const checks = [ + run('ui-browser-smoke', 'node', [ + path.join(scriptDir, 'run_ui_browser_smoke.js'), + '--hubble-url', hubbleUrl, + '--conn-id', connId, + '--output-dir', outputDir, + '--json-output', path.join(outputDir, 'ui-browser-smoke.json'), + '--chromium-executable', chromiumExecutable + ]), + run('ui-i18n-switch-smoke', 'node', [ + path.join(scriptDir, 'run_ui_i18n_switch_smoke.js'), + '--hubble-url', hubbleUrl, + '--output-dir', outputDir, + '--json-output', path.join(outputDir, 'ui-i18n-switch-smoke.json'), + '--chromium-executable', chromiumExecutable + ]) + ]; + + const report = { + hubbleUrl, + connId, + outputDir, + checks, + status: checks.every((check) => check.status === 'passed') ? 'passed' : 'failed' + }; + fs.writeFileSync(path.resolve(jsonOutput), JSON.stringify(report, null, 2) + '\n'); + console.log(JSON.stringify(report, null, 2)); + if (report.status !== 'passed') { + process.exit(1); + } +} + +main(); diff --git a/hugegraph-hubble/hubble-dist/assembly/travis/run_ui_i18n_switch_smoke.js b/hugegraph-hubble/hubble-dist/assembly/travis/run_ui_i18n_switch_smoke.js new file mode 100755 index 000000000..60e6dc7c0 --- /dev/null +++ b/hugegraph-hubble/hubble-dist/assembly/travis/run_ui_i18n_switch_smoke.js @@ -0,0 +1,124 @@ +#!/usr/bin/env node +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const MAC_CHROME_PATHS = [ + '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', + '/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing', + path.join(process.env.HOME || '', + 'Library/Caches/ms-playwright/chromium-1226/chrome-mac-arm64/' + + 'Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing') +]; + +function argValue(name, fallback) { + const index = process.argv.indexOf(name); + if (index >= 0 && index + 1 < process.argv.length) { + return process.argv[index + 1]; + } + return fallback; +} + +function chromiumExecutablePath() { + const configured = argValue('--chromium-executable', + process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH || + process.env.CHROME_PATH || ''); + if (configured) { + return configured; + } + for (const candidate of MAC_CHROME_PATHS) { + if (candidate && fs.existsSync(candidate)) { + return candidate; + } + } + return undefined; +} + +async function loadPlaywright() { + try { + return require('playwright'); + } catch (error) { + throw new Error( + 'Playwright is required for runtime i18n smoke. Original error: ' + + error.message + ); + } +} + +async function captureLanguage(page, hubbleUrl, language, screenshot) { + await page.addInitScript((value) => { + window.localStorage.setItem('languageType', value); + }, language); + await page.goto(hubbleUrl + '/graph-management', { + waitUntil: 'networkidle', + timeout: 30000 + }); + await page.screenshot({ path: screenshot, fullPage: true }); + return await page.locator('body').innerText({ timeout: 5000 }); +} + +async function main() { + const hubbleUrl = (argValue('--hubble-url', process.env.HUBBLE_URL) || + 'http://127.0.0.1:8088').replace(/\/$/, ''); + const outputDir = path.resolve(argValue('--output-dir', + '.workflow/hubble-v2-issue-694/evidence/ui')); + const jsonOutput = argValue('--json-output', ''); + const { chromium } = await loadPlaywright(); + const executablePath = chromiumExecutablePath(); + fs.mkdirSync(outputDir, { recursive: true }); + + const browser = await chromium.launch({ headless: true, executablePath }); + const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); + let zhText; + let enText; + try { + zhText = await captureLanguage(page, hubbleUrl, 'zh-CN', + path.join(outputDir, 'i18n-zh-CN.png')); + enText = await captureLanguage(page, hubbleUrl, 'en-US', + path.join(outputDir, 'i18n-en-US.png')); + } finally { + await browser.close(); + } + + const report = { + hubbleUrl, + zhContainsChinese: /[\u4e00-\u9fff]/.test(zhText), + enContainsGraphManager: /Graph|Management|graph|management/.test(enText), + textChanged: zhText !== enText, + status: 'failed' + }; + report.status = report.zhContainsChinese && report.enContainsGraphManager && + report.textChanged ? 'passed' : 'failed'; + + if (jsonOutput) { + fs.mkdirSync(path.dirname(path.resolve(jsonOutput)), { recursive: true }); + fs.writeFileSync(jsonOutput, JSON.stringify(report, null, 2) + '\n'); + } + console.log(JSON.stringify(report, null, 2)); + if (report.status !== 'passed') { + process.exit(1); + } +} + +main().catch((error) => { + console.error(error.message); + process.exit(1); +}); diff --git a/hugegraph-hubble/hubble-dist/assembly/travis/verify-hubble-issue-694.sh b/hugegraph-hubble/hubble-dist/assembly/travis/verify-hubble-issue-694.sh new file mode 100755 index 000000000..dbc4af713 --- /dev/null +++ b/hugegraph-hubble/hubble-dist/assembly/travis/verify-hubble-issue-694.sh @@ -0,0 +1,148 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +set -euo pipefail + +if [[ $# -lt 1 || $# -gt 2 ]]; then + echo "Usage: $0 [server-url]" >&2 + exit 1 +fi + +tarball=$1 +server_url=${2:-http://127.0.0.1:8080} +server_url=${server_url%/} +hubble_url=${HUBBLE_URL:-http://127.0.0.1:8088} +hubble_url=${hubble_url%/} +graph_name=${HUGEGRAPH_GRAPH:-hugegraph} +work_dir=${HUBBLE_694_WORK_DIR:-$(mktemp -d)} +cleanup_work_dir=${HUBBLE_694_KEEP_WORK_DIR:-false} +hubble_home="" + +server_protocol=${server_url%%://*} +server_address=${server_url#*://} +if [[ "${server_protocol}" == "${server_url}" ]]; then + server_protocol=http + server_address=${server_url} +fi +server_address=${server_address%%/*} +server_host=${server_address%%:*} +server_port=${server_address##*:} +if [[ "${server_port}" == "${server_address}" ]]; then + if [[ "${server_protocol}" == "https" ]]; then + server_port=443 + else + server_port=80 + fi +fi + +cleanup() { + if [[ -n "${hubble_home}" && -x "${hubble_home}/bin/stop-hubble.sh" ]]; then + "${hubble_home}/bin/stop-hubble.sh" >/dev/null 2>&1 || true + fi + if [[ "${cleanup_work_dir}" != "true" ]]; then + rm -rf "${work_dir}" + fi +} +trap cleanup EXIT + +if [[ ! -f "${tarball}" ]]; then + echo "Hubble tarball not found: ${tarball}" >&2 + exit 1 +fi + +mkdir -p "${work_dir}" +tar -xzf "${tarball}" -C "${work_dir}" +hubble_home=$(find "${work_dir}" -maxdepth 1 -type d -name 'apache-hugegraph-hubble-*' | head -n 1) +if [[ -z "${hubble_home}" ]]; then + echo "Unable to find unpacked Hubble home in ${work_dir}" >&2 + exit 1 +fi + +echo "Starting Hubble candidate: ${hubble_home}" +"${hubble_home}/bin/start-hubble.sh" + +for _ in $(seq 1 60); do + if curl -fsS "${hubble_url}/actuator/health" >/dev/null; then + break + fi + sleep 1 +done + +curl -fsS "${hubble_url}/actuator/health" | grep -q '"UP"' +curl -fsS "${hubble_url}/" | grep -q '
' + +for route in \ + /graph-management \ + /graph-management/1/metadata-configs \ + /graph-management/1/data-import/import-manager \ + /graph-management/1/data-analyze \ + /graph-management/1/async-tasks +do + curl -fsS "${hubble_url}${route}" | grep -q '
' +done + +curl -fsS "${server_url}/versions" >/dev/null + +connection_body=$(cat <&2 + echo "${connection_response}" >&2 + exit 1 +fi + +conn_id=$(printf '%s' "${connection_response}" | + sed -n 's/.*"id":\([0-9][0-9]*\).*/\1/p') + +if [[ -z "${conn_id}" ]]; then + echo "Unable to resolve Hubble graph connection id" >&2 + echo "${connection_response}" >&2 + exit 1 +fi + +schema_response=$(curl -fsS \ + "${hubble_url}/api/v1.2/graph-connections/${conn_id}/schema/graphview") +if ! echo "${schema_response}" | grep -q '"status":200'; then + echo "Hubble schema graphview API failed" >&2 + echo "${schema_response}" >&2 + exit 1 +fi + +job_response=$(curl -fsS \ + "${hubble_url}/api/v1.2/graph-connections/${conn_id}/job-manager?page_no=1&page_size=10") +if ! echo "${job_response}" | grep -q '"status":200'; then + echo "Hubble job-manager API failed" >&2 + echo "${job_response}" >&2 + exit 1 +fi + +task_response=$(curl -fsS \ + "${hubble_url}/api/v1.2/graph-connections/${conn_id}/async-tasks?page_no=1&page_size=10") +if ! echo "${task_response}" | grep -q '"status":200'; then + echo "Hubble async-tasks API failed" >&2 + echo "${task_response}" >&2 + exit 1 +fi + +echo "Hubble issue #694 smoke passed with connection id ${conn_id}" diff --git a/hugegraph-hubble/hubble-dist/pom.xml b/hugegraph-hubble/hubble-dist/pom.xml index 61f29d3b9..2f60820fe 100644 --- a/hugegraph-hubble/hubble-dist/pom.xml +++ b/hugegraph-hubble/hubble-dist/pom.xml @@ -34,7 +34,7 @@ ${assembly.dir}/descriptor ${assembly.dir}/static ${project.basedir}/../hubble-fe - v16.20.2 + v18.20.8 v1.22.21 @@ -43,6 +43,19 @@ org.apache.hugegraph hubble-be ${revision} + + + + org.apache.logging.log4j + log4j-slf4j-impl + + + org.springframework.boot + spring-boot-starter-log4j2 + + @@ -90,7 +103,7 @@ ${build.yarn.version} https://mirrors.aliyun.com/nodejs-release/ https://repo.huaweicloud.com/yarn/ - https://registry.npmmirror.com + @@ -100,7 +113,7 @@ yarn - install --network-timeout 600000 + install --frozen-lockfile --network-timeout 600000 --prefer-offline --ignore-engines @@ -111,6 +124,10 @@ build + + false + --max-old-space-size=4096 + diff --git a/hugegraph-hubble/hubble-fe/.env b/hugegraph-hubble/hubble-fe-old(legacy)/.env similarity index 100% rename from hugegraph-hubble/hubble-fe/.env rename to hugegraph-hubble/hubble-fe-old(legacy)/.env diff --git a/hugegraph-hubble/hubble-fe/CHANGELOG.md b/hugegraph-hubble/hubble-fe-old(legacy)/CHANGELOG.md similarity index 100% rename from hugegraph-hubble/hubble-fe/CHANGELOG.md rename to hugegraph-hubble/hubble-fe-old(legacy)/CHANGELOG.md diff --git a/hugegraph-hubble/hubble-fe/CHANGELOG.zh-CN.md b/hugegraph-hubble/hubble-fe-old(legacy)/CHANGELOG.zh-CN.md similarity index 100% rename from hugegraph-hubble/hubble-fe/CHANGELOG.zh-CN.md rename to hugegraph-hubble/hubble-fe-old(legacy)/CHANGELOG.zh-CN.md diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/README.md b/hugegraph-hubble/hubble-fe-old(legacy)/README.md new file mode 100644 index 000000000..8abda2689 --- /dev/null +++ b/hugegraph-hubble/hubble-fe-old(legacy)/README.md @@ -0,0 +1,3 @@ +# HugeGraph-Hubble + +Front-end implementation of HugeGraph diff --git a/hugegraph-hubble/hubble-fe/add-license.js b/hugegraph-hubble/hubble-fe-old(legacy)/add-license.js similarity index 100% rename from hugegraph-hubble/hubble-fe/add-license.js rename to hugegraph-hubble/hubble-fe-old(legacy)/add-license.js diff --git a/hugegraph-hubble/hubble-fe/config-overrides.js b/hugegraph-hubble/hubble-fe-old(legacy)/config-overrides.js similarity index 100% rename from hugegraph-hubble/hubble-fe/config-overrides.js rename to hugegraph-hubble/hubble-fe-old(legacy)/config-overrides.js diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/package.json b/hugegraph-hubble/hubble-fe-old(legacy)/package.json new file mode 100644 index 000000000..711ca918e --- /dev/null +++ b/hugegraph-hubble/hubble-fe-old(legacy)/package.json @@ -0,0 +1,78 @@ +{ + "name": "hubble", + "version": "1.6.0", + "author": "wangzixi", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/hugegraph/hugegraph-hubble" + }, + "dependencies": { + "@types/classnames": "^2.2.10", + "@types/codemirror": "^0.0.96", + "@types/d3": "^5.7.2", + "@types/file-saver": "^2.0.1", + "@types/jest": "24.0.15", + "@types/lodash-es": "^4.17.3", + "@types/node": "14.11.8", + "@types/react": "16.9.52", + "@types/react-dom": "16.9.8", + "@types/react-highlight-words": "^0.16.1", + "@types/uuid": "^8.3.0", + "@types/validator": "^13.1.0", + "antd": "^4.18.5", + "axios": "^0.19.0", + "classnames": "^2.2.6", + "codemirror": "^5.55.0", + "file-saver": "^2.0.2", + "framer-motion": "^2.1.2", + "i18next": "^19.5.3", + "less": "^3.11.3", + "lodash-es": "^4.17.15", + "mobx": "^5.13.0", + "mobx-react": "^6.2.2", + "prettier": "^2.0.5", + "react": "^16.13.1", + "react-dnd": "^11.1.3", + "react-dnd-html5-backend": "^11.1.3", + "react-dom": "^16.13.1", + "react-highlight-words": "^0.16.0", + "react-i18next": "^11.7.3", + "react-json-view": "^1.19.1", + "react-popper-tooltip": "^2.11.1", + "react-scripts": "3.4.1", + "typescript": "^3.9.6", + "uuid": "^8.3.1", + "validator": "^13.1.1", + "vis-network": "7.3.5", + "wouter": "^2.5.1" + }, + "scripts": { + "start": "react-app-rewired start", + "build": "CI=false && react-app-rewired build && yarn run license", + "test": "react-app-rewired test", + "license": "node add-license.js" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "customize-cra": "^0.9.1", + "less-loader": "^5.0.0", + "react-app-rewired": "^2.1.6", + "stylelint": "^13.6.1", + "stylelint-config-standard": "^20.0.0" + }, + "keywords": [ + "hugegraph" + ] +} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/public/favicon.ico b/hugegraph-hubble/hubble-fe-old(legacy)/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..db66b04952560901bb4d448076f25d68ca86fa89 GIT binary patch literal 4286 zcmchaeN0nV7>6&6FhYzY&S+Hzw00E~85G70cIcK3TB*UA#w<#Vo6G(%e#NMfwpb7< zHY)NVwAGbO*}|Ngb5jJ?Zn8K+$YLBaql6)L#t%XYXsunT-P!L{ZoQORgiK4GzUQ9a zzR!E^IhUTxFd_Jhi(}|J^K}%%%wQNM9-xa^3TVIgh0k8p%PBR6I;DoNhf-rW+F@wp z*!V*94O>?Iw0jZvgJclS%>&OW(8Y1Hb%?mfTEcno;G{tvde%jBT z^DJ@L#GjA6tpR+au7%@h+?7Fntel$@uGwHKs0N>c3EzFgCcz>w2uLvQR=(!GT*}+F zZ+q0Jb-=A>GHuL#25>G|=6U%dXmTnFdTxif$kxBv;nfPwF6D4pdhE#bNMRK(Z{O~Sg}^$8!U zPbH?S&m^U(&LzLAYD!tDY)(-qe-bN{W^rb|C3QL&_p&&S2tyr4VHz+y3_>>`Tn4HI zo_5_Fx4w9$r}#iLDKZF%=J-5P@Xh>w_34GJsrk@;qEC}KR&qOSq54t3-q`f3=eijNqmh|e1+ zPw2CiClCtS_FHA5s``@Ibj@WJ8U;HwU(RbUI62>mu@j6P?&K$KI{wFQ>L>YT)L==? z1Yzhm(mrp$CDns#a~170?gZV{B_`k5x6lm82v^XjV9(Li%?mF$ksw!}TG)oMyK&tK z=KYD^JlgN|nZ*^TBO>1-zQ_7UVjpVQz~-j0S0j$OzFS-k$OvZirE||I_;x{9(XqF* z>eFIdu(5MoX0*dW7pIS2hdW>`H}|DYlDI!MFFx9_C4-D`{?ew!8QgO$itSTtH?67C z9+%j$<}l}D=G}XZIj%DpC+1(g4%fgs((k~0)T1rn=Kf{%`;wM5Sskr;%Lt_+1J z)$gxk&-pXAB&K~u!M3JV+qx?c9zQRwp$B7LOYglvPPPy3NT2{$@jFVeuObdF zk88Lut06+Sr#k1U%lK>ajAEburAz5{Fpgfc9gA3y~^!WP& z)Xgf=3(&oy8#G`KHKF}KoD7%>)`2lKz-dGOA=D^z zWE*^I8m^V#D&X!@o$!mEHrA*0BR{Pn0xW_@hxO2i_RpXSNI?|vxoIAF<=~2+-+|)^ z?fHj0@qf7w-*Bd-hcy=%$+I=;c_&VCp&H23An12R-`h2JWML4Ewk3P#h zFXfoL)HPho4@IQUk9d9!>?YpVze@;t6iaS^LN$=Y5@v}85W>WQSHR1J6ymLg32D1= rBc#|m#IRhj4uz1G7QnpZJ;!@K{T_wp$Xw#h+k)KIN9d#w4IuvkIS-<| literal 0 HcmV?d00001 diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/public/index.html b/hugegraph-hubble/hubble-fe-old(legacy)/public/index.html new file mode 100644 index 000000000..c5bcd62a8 --- /dev/null +++ b/hugegraph-hubble/hubble-fe-old(legacy)/public/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + HugeGraph + + + +
+ + diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/public/manifest.json b/hugegraph-hubble/hubble-fe-old(legacy)/public/manifest.json new file mode 100644 index 000000000..1f2f141fa --- /dev/null +++ b/hugegraph-hubble/hubble-fe-old(legacy)/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_add.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_add.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_add.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_add.svg index bfb107490..be87afc9a 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_add.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_add.svg @@ -53,4 +53,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_add_node.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_add_node.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_add_node.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_add_node.svg index 66347e7aa..6f1c62f54 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_add_node.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_add_node.svg @@ -30,4 +30,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow.svg index 1885992f9..3d4c9cf57 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow.svg @@ -29,4 +29,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_16.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_16.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_16.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_16.svg index 4c6894819..5ee638a32 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_16.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_16.svg @@ -25,4 +25,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_blue.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_blue.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_blue.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_blue.svg index f58bcebbf..bb664dfe9 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_blue.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_blue.svg @@ -31,4 +31,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_selected.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_selected.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_selected.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_selected.svg index e76ff5eb6..fada8e1f6 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_selected.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_selected.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_white.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_white.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_white.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_white.svg index ed96b68d4..fe375e513 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_arrow_white.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_arrow_white.svg @@ -33,4 +33,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_back_32.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_back_32.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_back_32.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_back_32.svg index c5744cf0f..3662cef0f 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_back_32.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_back_32.svg @@ -33,4 +33,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_back_32_normal.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_back_32_normal.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_back_32_normal.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_back_32_normal.svg index 3bdd14066..412fd2edc 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_back_32_normal.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_back_32_normal.svg @@ -24,4 +24,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_back_32_pressed.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_back_32_pressed.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_back_32_pressed.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_back_32_pressed.svg index d76a624ec..519a18bda 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_back_32_pressed.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_back_32_pressed.svg @@ -24,4 +24,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_biaoge_hover.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_biaoge_hover.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_biaoge_hover.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_biaoge_hover.svg index dbc401bc6..3883e4961 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_biaoge_hover.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_biaoge_hover.svg @@ -23,4 +23,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_biaoge_normal.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_biaoge_normal.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_biaoge_normal.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_biaoge_normal.svg index e0142bec9..0a1ea5d17 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_biaoge_normal.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_biaoge_normal.svg @@ -23,4 +23,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_biaoge_pressed.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_biaoge_pressed.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_biaoge_pressed.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_biaoge_pressed.svg index f18dc62af..6cb910b73 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_biaoge_pressed.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_biaoge_pressed.svg @@ -23,4 +23,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_cebianshouqi.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_cebianshouqi.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_cebianshouqi.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_cebianshouqi.svg index 8acbdda5f..f5906c002 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_cebianshouqi.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_cebianshouqi.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_cebianzhankai.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_cebianzhankai.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_cebianzhankai.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_cebianzhankai.svg index 58aa3a411..1663442c4 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_cebianzhankai.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_cebianzhankai.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_close_16.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_close_16.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_close_16.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_close_16.svg index 9b7ecac32..1ba0c115e 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_close_16.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_close_16.svg @@ -28,4 +28,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_close_white.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_close_white.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_close_white.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_close_white.svg index 683b6f28e..96a509e49 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_close_white.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_close_white.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_daorushuju_normal.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_daorushuju_normal.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_daorushuju_normal.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_daorushuju_normal.svg index 309bda2a0..4a42b93df 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_daorushuju_normal.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_daorushuju_normal.svg @@ -23,4 +23,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_daorushuju_pressed.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_daorushuju_pressed.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_daorushuju_pressed.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_daorushuju_pressed.svg index 5310b8c8e..452fb88c8 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_daorushuju_pressed.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_daorushuju_pressed.svg @@ -23,4 +23,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_done_144.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_done_144.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_done_144.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_done_144.svg index c77858979..53da27bce 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_done_144.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_done_144.svg @@ -69,4 +69,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_error_12.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_error_12.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_error_12.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_error_12.svg index 5c493d041..39fbe7e2d 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_error_12.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_error_12.svg @@ -25,4 +25,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_fail.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_fail.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_fail.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_fail.svg index 419e35458..a42ea6d29 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_fail.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_fail.svg @@ -66,4 +66,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_fangda_16.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_fangda_16.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_fangda_16.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_fangda_16.svg index ceb6c4944..19953ac35 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_fangda_16.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_fangda_16.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_json_hover.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_json_hover.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_json_hover.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_json_hover.svg index ea70407e1..0722485b1 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_json_hover.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_json_hover.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_json_normal.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_json_normal.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_json_normal.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_json_normal.svg index d9185d6f1..45b154001 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_json_normal.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_json_normal.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_json_pressed.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_json_pressed.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_json_pressed.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_json_pressed.svg index 0c96d2537..45208646b 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_json_pressed.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_json_pressed.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_liebiaomoshi_black.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_liebiaomoshi_black.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_liebiaomoshi_black.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_liebiaomoshi_black.svg index 521a07fa7..886cf40fd 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_liebiaomoshi_black.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_liebiaomoshi_black.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_liebiaomoshi_white.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_liebiaomoshi_white.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_liebiaomoshi_white.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_liebiaomoshi_white.svg index 7fdeb9069..208f0268c 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_liebiaomoshi_white.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_liebiaomoshi_white.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_loading@2x.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_loading@2x.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_loading@2x.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_loading@2x.svg index 9d6387a56..9e8fcea17 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_loading@2x.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_loading@2x.svg @@ -62,4 +62,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_loading_back.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_loading_back.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_loading_back.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_loading_back.svg index b31881d3f..a8543277e 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_loading_back.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_loading_back.svg @@ -65,4 +65,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_loading_front.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_loading_front.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_loading_front.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_loading_front.svg index ea7490c15..662006c13 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_loading_front.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_loading_front.svg @@ -43,4 +43,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_middle_16.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_middle_16.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_middle_16.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_middle_16.svg index daf8e682f..658f76b78 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_middle_16.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_middle_16.svg @@ -30,4 +30,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_pass.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_pass.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_pass.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_pass.svg index 869206d53..1b0067454 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_pass.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_pass.svg @@ -35,4 +35,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_progress_done.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_progress_done.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_progress_done.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_progress_done.svg index 100aa5fa9..d77ca7409 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_progress_done.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_progress_done.svg @@ -32,4 +32,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_quanping_16.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_quanping_16.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_quanping_16.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_quanping_16.svg index 2ab27ce86..28874ca09 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_quanping_16.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_quanping_16.svg @@ -25,4 +25,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_question_mark.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_question_mark.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_question_mark.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_question_mark.svg index 9b33079ab..8071c91fe 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_question_mark.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_question_mark.svg @@ -33,4 +33,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_refresh.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_refresh.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_refresh.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_refresh.svg index 93c1902b5..97aa77fd3 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_refresh.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_refresh.svg @@ -35,4 +35,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_renwuguanli_normal.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_renwuguanli_normal.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_renwuguanli_normal.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_renwuguanli_normal.svg index ec72663da..5fe551385 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_renwuguanli_normal.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_renwuguanli_normal.svg @@ -21,4 +21,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_renwuguanli_pressed.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_renwuguanli_pressed.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_renwuguanli_pressed.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_renwuguanli_pressed.svg index f3b72792e..42242d244 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_renwuguanli_pressed.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_renwuguanli_pressed.svg @@ -22,4 +22,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_shuju_normal.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_shuju_normal.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_shuju_normal.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_shuju_normal.svg index c41c61ebe..6421b4943 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_shuju_normal.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_shuju_normal.svg @@ -31,4 +31,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_shuju_pressed.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_shuju_pressed.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_shuju_pressed.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_shuju_pressed.svg index 17abce564..7a6482341 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_shuju_pressed.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_shuju_pressed.svg @@ -31,4 +31,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_sousuo_empty.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_sousuo_empty.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_sousuo_empty.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_sousuo_empty.svg index fbba91c36..cff385faa 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_sousuo_empty.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_sousuo_empty.svg @@ -74,4 +74,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_straight.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_straight.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_straight.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_straight.svg index 7f4691279..d60456046 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_straight.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_straight.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_straight_selected.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_straight_selected.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_straight_selected.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_straight_selected.svg index d0b1ff146..4b7983a61 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_straight_selected.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_straight_selected.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_suoxiao_16.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_suoxiao_16.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_suoxiao_16.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_suoxiao_16.svg index 3d082e7fc..c613555cb 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_suoxiao_16.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_suoxiao_16.svg @@ -26,4 +26,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_topback.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_topback.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_topback.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_topback.svg index 39ec0aa63..65c379a01 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_topback.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_topback.svg @@ -32,4 +32,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuichuquanping_16.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuichuquanping_16.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuichuquanping_16.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuichuquanping_16.svg index 3485c6cd8..173948758 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuichuquanping_16.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuichuquanping_16.svg @@ -29,4 +29,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tumoshi_black.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tumoshi_black.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tumoshi_black.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tumoshi_black.svg index 1d71e4f67..1aa2c5362 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tumoshi_black.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tumoshi_black.svg @@ -32,4 +32,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tumoshi_white.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tumoshi_white.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tumoshi_white.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tumoshi_white.svg index a3ce6ccaf..8dd23b731 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tumoshi_white.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tumoshi_white.svg @@ -32,4 +32,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuzhanshi_hover.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuzhanshi_hover.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuzhanshi_hover.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuzhanshi_hover.svg index de4a22646..5ef8639b7 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuzhanshi_hover.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuzhanshi_hover.svg @@ -26,4 +26,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuzhanshi_normal.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuzhanshi_normal.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuzhanshi_normal.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuzhanshi_normal.svg index 516135c70..5b8e74713 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuzhanshi_normal.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuzhanshi_normal.svg @@ -28,4 +28,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuzhanshi_pressed.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuzhanshi_pressed.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuzhanshi_pressed.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuzhanshi_pressed.svg index 9044419cc..4811918de 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_tuzhanshi_pressed.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_tuzhanshi_pressed.svg @@ -26,4 +26,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_xiazai_16.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_xiazai_16.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_xiazai_16.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_xiazai_16.svg index 31dfc3592..521ce09cd 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_xiazai_16.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_xiazai_16.svg @@ -25,4 +25,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_yingshe_16.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_yingshe_16.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_yingshe_16.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_yingshe_16.svg index 97bbbdafd..f19debb8e 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_yingshe_16.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_yingshe_16.svg @@ -28,4 +28,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_yuanshuju_normal.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_yuanshuju_normal.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_yuanshuju_normal.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_yuanshuju_normal.svg index 367d5d940..4a6146f38 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_yuanshuju_normal.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_yuanshuju_normal.svg @@ -28,4 +28,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_yuanshuju_pressed.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_yuanshuju_pressed.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/ic_yuanshuju_pressed.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_yuanshuju_pressed.svg index dcb23e9b4..9c1c28973 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/ic_yuanshuju_pressed.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/ic_yuanshuju_pressed.svg @@ -28,4 +28,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/icon_clickarrow_left_grey.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/icon_clickarrow_left_grey.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/icon_clickarrow_left_grey.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/icon_clickarrow_left_grey.svg index fa590b9f3..9c37737d4 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/icon_clickarrow_left_grey.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/icon_clickarrow_left_grey.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/icon_clickarrow_rigth_grey.svg b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/icon_clickarrow_rigth_grey.svg similarity index 99% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/icon_clickarrow_rigth_grey.svg rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/icon_clickarrow_rigth_grey.svg index a5e3e2209..49d45a852 100644 --- a/hugegraph-hubble/hubble-fe/src/assets/imgs/icon_clickarrow_rigth_grey.svg +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/icon_clickarrow_rigth_grey.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/hugegraph-hubble/hubble-fe/src/assets/imgs/logo.png b/hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/logo.png similarity index 100% rename from hugegraph-hubble/hubble-fe/src/assets/imgs/logo.png rename to hugegraph-hubble/hubble-fe-old(legacy)/src/assets/imgs/logo.png diff --git a/hugegraph-hubble/hubble-fe/src/components/App.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/App.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/App.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/App.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/common/AppBar.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/AppBar.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/common/AppBar.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/AppBar.less diff --git a/hugegraph-hubble/hubble-fe/src/components/common/AppBar.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/AppBar.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/common/AppBar.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/AppBar.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/common/LoadingDataView.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/LoadingDataView.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/common/LoadingDataView.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/LoadingDataView.less diff --git a/hugegraph-hubble/hubble-fe/src/components/common/LoadingDataView.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/LoadingDataView.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/common/LoadingDataView.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/LoadingDataView.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/common/Tooltip.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/Tooltip.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/common/Tooltip.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/Tooltip.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/common/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/common/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/common/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagement.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagement.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagement.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagement.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagement.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagement.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagement.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagement.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagementEmptyList.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagementEmptyList.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagementEmptyList.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagementEmptyList.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagementHeader.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagementHeader.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagementHeader.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagementHeader.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagementLimitHint.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagementLimitHint.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagementLimitHint.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagementLimitHint.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagementList.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagementList.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagementList.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagementList.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagementSidebar.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagementSidebar.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/GraphManagementSidebar.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/GraphManagementSidebar.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/NewGraphConfig.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/NewGraphConfig.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/NewGraphConfig.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/NewGraphConfig.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/async-tasks/AsyncTaskList.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/async-tasks/AsyncTaskList.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/async-tasks/AsyncTaskList.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/async-tasks/AsyncTaskList.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/async-tasks/AsyncTaskList.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/async-tasks/AsyncTaskList.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/async-tasks/AsyncTaskList.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/async-tasks/AsyncTaskList.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/async-tasks/AsyncTaskResult.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/async-tasks/AsyncTaskResult.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/async-tasks/AsyncTaskResult.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/async-tasks/AsyncTaskResult.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/async-tasks/AsyncTaskResult.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/async-tasks/AsyncTaskResult.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/async-tasks/AsyncTaskResult.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/async-tasks/AsyncTaskResult.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/async-tasks/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/async-tasks/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/async-tasks/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/async-tasks/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DataAnalyze.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DataAnalyze.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DataAnalyze.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DataAnalyze.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DataAnalyze.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DataAnalyze.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DataAnalyze.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DataAnalyze.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DataAnalyzeContent.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DataAnalyzeContent.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DataAnalyzeContent.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DataAnalyzeContent.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DataAnalyzeInfoDrawer.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DataAnalyzeInfoDrawer.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DataAnalyzeInfoDrawer.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DataAnalyzeInfoDrawer.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DynamicAddEdge.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DynamicAddEdge.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DynamicAddEdge.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DynamicAddEdge.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DynamicAddNode.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DynamicAddNode.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/DynamicAddNode.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/DynamicAddNode.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/ExecLogAndQueryCollections.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/ExecLogAndQueryCollections.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/ExecLogAndQueryCollections.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/ExecLogAndQueryCollections.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/GremlinKeyWords.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/GremlinKeyWords.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/GremlinKeyWords.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/GremlinKeyWords.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/QueryAndAlgorithmLibrary.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/QueryAndAlgorithmLibrary.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/QueryAndAlgorithmLibrary.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/QueryAndAlgorithmLibrary.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/AllPath.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/AllPath.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/AllPath.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/AllPath.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/CustomPath.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/CustomPath.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/CustomPath.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/CustomPath.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/FocusDetection.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/FocusDetection.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/FocusDetection.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/FocusDetection.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/Jaccard.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/Jaccard.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/Jaccard.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/Jaccard.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/KHop.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/KHop.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/KHop.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/KHop.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/KStepNeighbor.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/KStepNeighbor.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/KStepNeighbor.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/KStepNeighbor.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/LoopDetection.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/LoopDetection.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/LoopDetection.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/LoopDetection.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/ModelSimilarity.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ModelSimilarity.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/ModelSimilarity.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ModelSimilarity.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/NeighborRank.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/NeighborRank.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/NeighborRank.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/NeighborRank.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/PersonalRank.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/PersonalRank.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/PersonalRank.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/PersonalRank.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/RadiographicInspection.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/RadiographicInspection.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/RadiographicInspection.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/RadiographicInspection.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/SameNeighbor.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/SameNeighbor.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/SameNeighbor.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/SameNeighbor.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/ShortestPath.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ShortestPath.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/ShortestPath.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ShortestPath.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/ShortestPathAll.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ShortestPathAll.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/ShortestPathAll.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ShortestPathAll.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/SingleSourceWeightedShortestPath.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/SingleSourceWeightedShortestPath.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/SingleSourceWeightedShortestPath.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/SingleSourceWeightedShortestPath.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/WeightedShortestPath.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/WeightedShortestPath.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/algorithm/WeightedShortestPath.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/WeightedShortestPath.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/common/Favorite.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/common/Favorite.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/common/Favorite.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/common/Favorite.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/GraphPopOver.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/GraphPopOver.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/GraphPopOver.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/GraphPopOver.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/GraphQueryResult.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/GraphQueryResult.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/GraphQueryResult.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/GraphQueryResult.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/JSONQueryResult.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/JSONQueryResult.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/JSONQueryResult.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/JSONQueryResult.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/QueryFilterOptions.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/QueryFilterOptions.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/QueryFilterOptions.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/QueryFilterOptions.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/QueryResult.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/QueryResult.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/QueryResult.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/QueryResult.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/TableQueryResult.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/TableQueryResult.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/TableQueryResult.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/TableQueryResult.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-analyze/query-result/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportFinish.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportFinish.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportFinish.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportFinish.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportManager.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportManager.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportManager.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportManager.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportManager.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportManager.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportManager.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportManager.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportTaskList.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTaskList.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportTaskList.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTaskList.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportTasks.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTasks.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportTasks.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTasks.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportTasks.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTasks.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/ImportTasks.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTasks.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/UploadEntry.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/UploadEntry.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/UploadEntry.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/UploadEntry.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/UploadEntry.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/UploadEntry.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/UploadEntry.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/UploadEntry.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/EdgeMap.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/EdgeMap.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/EdgeMap.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/EdgeMap.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/FileConfigs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/FileConfigs.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/FileConfigs.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/FileConfigs.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigManipulations.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigManipulations.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigManipulations.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigManipulations.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigs.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigs.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigs.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeInfo.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeInfo.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeInfo.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeInfo.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/VertexMap.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/VertexMap.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/VertexMap.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/VertexMap.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/datamap-configs/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/error-logs/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/error-logs/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/BasicSettings.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/BasicSettings.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/BasicSettings.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/BasicSettings.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/DataImportDetails.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/DataImportDetails.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/DataImportDetails.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/DataImportDetails.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/DataMaps.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/DataMaps.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/DataMaps.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/DataMaps.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/UploadedFiles.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/UploadedFiles.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/UploadedFiles.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/UploadedFiles.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/job-details/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/server-data-import/ImportConfigs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ImportConfigs.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/server-data-import/ImportConfigs.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ImportConfigs.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/server-data-import/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/import-tasks/server-data-import/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/data-import/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/MetadataConfigs.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/MetadataConfigs.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/MetadataConfigs.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/MetadataConfigs.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/MetadataConfigs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/MetadataConfigs.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/MetadataConfigs.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/MetadataConfigs.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/common/EmptyDataView.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/common/EmptyDataView.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/common/EmptyDataView.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/common/EmptyDataView.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/edge-type/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CheckAndEditEdge.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckAndEditEdge.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CheckAndEditEdge.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckAndEditEdge.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CheckAndEditVertex.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckAndEditVertex.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CheckAndEditVertex.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckAndEditVertex.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CheckProperty.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckProperty.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CheckProperty.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckProperty.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CreateEdge.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateEdge.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CreateEdge.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateEdge.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CreateProperty.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateProperty.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CreateProperty.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateProperty.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CreateVertex.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateVertex.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/CreateVertex.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateVertex.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/GraphView.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/GraphView.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/GraphView.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/GraphView.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/GraphView.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/GraphView.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/GraphView.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/GraphView.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/graph-view/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property-index/PropertyIndex.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/PropertyIndex.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property-index/PropertyIndex.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/PropertyIndex.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property-index/PropertyIndex.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/PropertyIndex.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property-index/PropertyIndex.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/PropertyIndex.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property-index/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property-index/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property/MetadataProperties.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/MetadataProperties.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property/MetadataProperties.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/MetadataProperties.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property/MetadataProperties.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/MetadataProperties.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property/MetadataProperties.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/MetadataProperties.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property/ReuseProperties.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/ReuseProperties.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property/ReuseProperties.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/ReuseProperties.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property/ReuseProperties.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/ReuseProperties.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property/ReuseProperties.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/ReuseProperties.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/property/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.less diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/graph-management/metadata-configs/vertex-type/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/components/hubble-ui/index.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/hubble-ui/index.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/hubble-ui/index.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/hubble-ui/index.tsx diff --git a/hugegraph-hubble/hubble-fe/src/components/hubble-ui/src/index.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/hubble-ui/src/index.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/components/hubble-ui/src/index.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/components/hubble-ui/src/index.less diff --git a/hugegraph-hubble/hubble-fe/src/hooks/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/hooks/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/hooks/useInitDataImport.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useInitDataImport.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/hooks/useInitDataImport.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useInitDataImport.tsx diff --git a/hugegraph-hubble/hubble-fe/src/hooks/useLocationWithConfirmation.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useLocationWithConfirmation.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/hooks/useLocationWithConfirmation.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useLocationWithConfirmation.tsx diff --git a/hugegraph-hubble/hubble-fe/src/hooks/useMultiKeyPress.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useMultiKeyPress.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/hooks/useMultiKeyPress.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useMultiKeyPress.tsx diff --git a/hugegraph-hubble/hubble-fe/src/i18n/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/AsyncTasks.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/AsyncTasks.json similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/AsyncTasks.json rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/AsyncTasks.json diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/GraphManagementSidebar.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/GraphManagementSidebar.json similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/GraphManagementSidebar.json rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/GraphManagementSidebar.json diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/addition.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/addition.json similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/addition.json rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/addition.json diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/common.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/common.json similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/common.json rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/common.json diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/data-import/import-tasks/ImportTasks.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/data-import/import-tasks/ImportTasks.json similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/data-import/import-tasks/ImportTasks.json rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/data-import/import-tasks/ImportTasks.json diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/dataAnalyze.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/dataAnalyze.json similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/dataAnalyze.json rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/dataAnalyze.json diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/graph-managment/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/index.ts diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/AsyncTasks.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/AsyncTasks.json new file mode 100644 index 000000000..d02ae887f --- /dev/null +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/AsyncTasks.json @@ -0,0 +1,64 @@ +{ + "async-tasks": { + "title": "Task Management", + "placeholders": { + "search": "Enter task ID or name to search" + }, + "table-column-title": { + "task-id": "Task ID", + "task-name": "Task Name", + "task-type": "Task Type", + "create-time": "Create Time", + "time-consuming": "Time Consuming", + "status": "Status", + "manipulation": "Operation" + }, + "table-filters": { + "task-type": { + "all": "All", + "gremlin": "Gremlin Task", + "algorithm": "Algorithm Task", + "remove-schema": "Remove Metadata", + "create-index": "Create Index", + "rebuild-index": "Rebuild Index" + }, + "status": { + "all": "All", + "scheduling": "Scheduling", + "scheduled": "Queued", + "queued": "Queued", + "running": "Running", + "restoring": "Restoring", + "success": "Success", + "failed": "Failed", + "cancelling": "Cancelled", + "cancelled": "Cancelled" + } + }, + "table-selection": { + "selected": "Selected {{number}} items", + "delete-batch": "Batch Delete" + }, + "manipulations": { + "abort": "Abort", + "aborting": "Aborting", + "delete": "Delete", + "check-result": "Check Result", + "check-reason": "Check Reason" + }, + "hint": { + "delete-confirm": "Delete Confirmation", + "delete-description": "Are you sure you want to delete this task? Deletion is irreversible, please proceed with caution", + "delete-succeed": "Delete Successful", + "delete-batch-confirm": "Batch Delete", + "delete-batch-description": "Confirm deletion of the following tasks? Deletion is irreversible, please proceed with caution", + "delete": "Delete", + "cancel": "Cancel", + "no-data": "No Data Available", + "empty": "You currently have no tasks", + "select-disabled": "Task {{id}} cannot be selected for deletion", + "check-details": "Check Details", + "creation-failed": "Creation Failed" + } + } +} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/GraphManagementSidebar.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/GraphManagementSidebar.json new file mode 100644 index 000000000..4ffabfc8b --- /dev/null +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/GraphManagementSidebar.json @@ -0,0 +1,5 @@ +{ + "data-import": "Data import", + "import-task": "Import task", + "map-templates": "Mapping template" +} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/addition.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/addition.json new file mode 100644 index 000000000..ebbfa2d81 --- /dev/null +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/addition.json @@ -0,0 +1,348 @@ +{ + "addition": { + "function-parameter": { + "edge-type": "Edge Type", + "vertex-id": "Vertex ID" + }, + "store": { + "required": "Required", + "item-is-required": "This item is required", + "no-match-input-requirements": "Does not match input requirements", + "rule1": "Please enter letters, numbers, or special characters", + "rule2": "Please enter a number in the range of 1-65535", + "rule3": "Username and password must be filled in at the same time", + "rule4": "Must be in Chinese, English, numbers, and underscores", + "illegal-data-format": "Illegal data format", + "incorrect-time-format": "Incorrect time format", + "cannot-be-empty": "This item cannot be empty", + "cannot-be-empty1": "This item cannot be empty", + "same-edge-name-notice": "Same edge name exists, please enter another name", + "same-vertex-name-notice": "Same vertex name exists, please enter another name", + "same-property-name-notice": "Same property name exists, please enter another name", + "same-index-name-notice": "Same property index name exists, please enter another name", + "network-error": "Network anomaly, please try again later" + }, + "constant": { + "primary-key-id": "Primary Key ID", + "automatic-generation": "Automatic Generation", + "custom-string": "Custom String", + "custom-number": "Custom Number", + "custom-uuid": "Custom UUID", + "greater-than": "Greater Than", + "greater-than-or-equal": "Greater Than or Equal", + "less-than": "Less Than", + "less-than-or-equal": "Less Than or Equal", + "equal": "Equal" + }, + "menu": { + "chart": "Chart", + "table": "Table", + "task-id": "Task ID", + "list-mode": "List Mode", + "chart-mode": "Chart Mode", + "secondary-index": "Secondary Index", + "range-index": "Range Index", + "full-text-index": "Full Text Index", + "type-index": "Type Index", + "base-info": "Basic Information", + "select-reuse-item": "Select Reuse Item", + "confirm-reuse-item": "Confirm Reuse Item", + "complete-reuse": "Complete Reuse" + }, + "vertex": { + "type-detail": "Vertex Type Details", + "edit-type": "Edit Vertex Type", + "using-cannot-delete": "The current vertex type is in use and cannot be deleted.", + "using-cannot-delete-confirm": "The vertex type in use cannot be deleted. Are you sure you want to delete the following unused vertex types?", + "del-vertex-confirm": "Confirm deletion of this vertex type?", + "del-vertex-confirm-again": "Confirm deletion of this vertex type? Deletion is irreversible, please proceed with caution", + "vertex-type-name": "Vertex Type Name", + "vertex-style": "Vertex Style", + "vertex-display-content": "Vertex Display Content", + "select-vertex-display-content-placeholder": "Please select vertex display content", + "create-vertex-type": "Create Vertex Type", + "vertex-index": "Vertex Index", + "corresponding-vertex-type": "Corresponding Vertex Type", + "no-vertex-type-desc": "You currently do not have any vertex types, create one now" + }, + "edge": { + "display-content": "Edge Display Content", + "display-content-select-desc": "Please select edge display content", + "index-info": "Index Information", + "index-name": "Index Name", + "index-type": "Index Type", + "edge-index": "Edge Index", + "index-type-select-desc": "Please select index type", + "property-select-desc": "Please select property", + "add-group": "Add a group", + "confirm-del-edge-type": "Confirm deletion of this edge type?", + "confirm-del-edge-type-again": "Confirm deletion of edge type? Deletion is irreversible, please proceed with caution", + "confirm-del-edge-careful-notice": "Deletion is irreversible, please proceed with caution", + "no-edge-desc": "You currently do not have any edge types, create one now", + "create-edge": "Create Edge Type", + "multiplexing-existing-type": "Multiplex Existing Type", + "multiplexing-edge-type": "Multiplex Edge Type", + "multiplexing-edge-type-notice": "The attributes and attribute indexes, start and end types, and associated attributes and attribute indexes of the edge type will be reused together", + "verification-result": "Verification Result", + "be-verified": "To be verified", + "verified-again": "Re-verify" + }, + "message": { + "no-can-delete-vertex-type": "No deletable vertex types", + "no-index-notice": "You currently do not have any indexes", + "property-create-desc": "You currently do not have any properties, create one now", + "del-unused-property-notice": "In-use properties cannot be deleted. Confirm deletion of the following unused properties?", + "please-enter-keywords": "Please enter search keywords", + "no-property-can-delete": "No deletable properties", + "no-metadata-notice": "You currently do not have any metadata", + "no-vertex-or-edge-notice": "You have not set any vertex types or edge types", + "no-adjacency-points": "No adjacent points", + "no-more-points": "No more adjacent points", + "please-enter-number": "Please enter a number", + "please-enter-string": "Please enter a string", + "please-enter": "Please enter", + "no-chart-desc": "No graph results, please view the table or JSON data", + "no-data-desc": "No data results at the moment", + "data-loading": "Data loading", + "submit-async-task": "Submitting asynchronous task", + "submit-success": "Submission successful", + "submit-fail": "Submission failed", + "task-submit-fail": "Task submission failed", + "fail-reason": "Failure reason", + "fail-position": "Failure position", + "selected": "Selected", + "edge-del-confirm": "Confirm deletion of the following edges?", + "long-time-notice": "Deleting metadata may take a long time, details can be viewed in task management", + "index-long-time-notice": "Creating indexes may take a long time, details can be viewed in task management", + "property-del-confirm": "Confirm deletion of this property?", + "property-del-confirm-again": "Confirm deletion of this property? Deletion is irreversible, please proceed with caution", + "index-del-confirm": "After deleting the index, queries based on this property index will not be possible. Proceed with caution.", + "edge-name-rule": "Allowing Chinese, English, numbers, and underscores", + "source-type-select-placeholder": "Please select source type", + "target-type-select-placeholder": "Please select target type", + "select-distinguishing-key-property-placeholder": "Please select distinguishing key property", + "select-association-key-property-placeholder": "Please select associated property", + "index-open-notice": "Enabling indexes may affect performance, enable as needed", + "duplicate-name": "Duplicate name", + "dependency-conflict": "Dependency conflict", + "already-exist": "Already exists", + "pass": "Pass", + "select-reuse-graph-placeholder": "Please select the graph to reuse", + "reuse-complete": "Reuse complete", + "vertex-type-reuse-success": "Vertex type reuse successful", + "property-using-cannot-delete": "The current property data is in use and cannot be deleted.", + "reuse-property-success": "Property reuse successful", + "reuse-vertex-type-notice": "The attributes and attribute indexes associated with the vertex type will be reused together", + "illegal-vertex": "This vertex is an illegal vertex, possibly caused by a dangling edge" + }, + "operate": { + "reuse-vertex-type": "Reuse Vertex Type", + "reuse-existing-property": "Reuse Existing Property", + "reuse-property": "Reuse Property", + "create-property": "Create Property", + "continue-reuse": "Continue Reuse", + "back-to-view": "Back to View", + "complete": "Complete", + "next-step": "Next Step", + "previous-step": "Previous Step", + "rename": "Rename", + "del-ing": "Deleting", + "view-task-management": "View Task Management", + "batch-del": "Batch Delete", + "multiplexing": "Multiplex", + "de-multiplexing": "Cancel Multiplexing", + "open": "Open", + "close": "Close", + "look": "View", + "view-property": "View Property", + "filter": "Filter", + "add-filter-item": "Add Property Filter", + "enlarge": "Enlarge", + "narrow": "Shrink", + "center": "Center", + "download": "Download", + "exit-full-screen": "Exit Full Screen", + "full-screen": "Full Screen", + "load-background": "Load Background", + "load-spinner": "Load Spinner", + "rendering": "Rendering", + "detail": "Detail", + "favorite": "Favorite", + "favorite-success": "Favorite successful", + "load-statement": "Load Statement", + "time": "Time", + "name": "Name", + "favorite-statement": "Favorite Statement", + "favorite-desc": "Please enter favorite name", + "operate": "Operate", + "query": "Query", + "hidden": "Hide", + "modify-name": "Modify Name", + "execution-record": "Execution Record", + "favorite-queries": "Favorite Queries", + "favorite-search-desc": "Search favorite name or statement", + "expand-collapse": "Expand/Collapse", + "expand": "Expand", + "collapse": "Collapse", + "favorite-del-desc": "Are you sure you want to delete this favorite statement?", + "input-query-statement": "Please input query statement", + "query-statement-required": "Query statement cannot be empty", + "execute-query": "Execute Query", + "execute-task": "Execute Task", + "execute-ing": "Executing", + "clean": "Clear", + "modify-success": "Modification successful", + "query-result-desc": "Query mode is suitable for small-scale analysis with results returned within 30 seconds; task mode is suitable for large-scale analysis with longer result return times, task details can be viewed in task management" + }, + "common": { + "in-use": "In Use", + "not-used": "Not Used", + "status": "Status", + "no-result": "No Result", + "cardinal-number": "Cardinal Number", + "allow-null": "Allow Null", + "allow-multiple-connections": "Allow Multiple Connections", + "multiple-connections-notice": "Enabling this allows multiple edges of the same type between two vertices", + "term": "Items", + "in-edge": "In Edge", + "add-in-edge": "Add In Edge", + "out-edge": "Out Edge", + "add-out-edge": "Add Out Edge", + "add": "Add", + "value": "Value", + "null-value": "Null Value", + "id-strategy": "ID Strategy", + "id-value": "ID Value", + "id-input-desc": "Please enter ID value", + "please-input": "Please enter", + "add-success": "Add successful", + "add-fail": "Add failed", + "vertex-type": "Vertex Type", + "selected-vertex-type": "Selected Vertex Type", + "vertex-id": "Vertex ID", + "vertex-name": "Vertex Name", + "illegal-vertex-desc": "This vertex is an illegal vertex, possibly caused by a dangling edge", + "add-vertex": "Add Vertex", + "vertex-type-select-desc": "Please select vertex type", + "edge-type": "Edge Type", + "selected-edge-type": "Selected Edge Type", + "edge-style": "Edge Style", + "modify-edge-type": "Edit Edge Type", + "edge-type-detail": "Edge Type Details", + "edge-type-name": "Edge Type Name", + "edge-direction": "Edge Direction", + "edge-type-select-desc": "Please select edge type", + "edge-id": "Edge ID", + "edge-name": "Edge Name", + "source": "Source", + "source-type": "Source Type", + "target": "Target", + "target-type": "Target Type", + "rule": "Rule", + "property": "Property", + "selected-property": "Selected Property", + "property-name": "Property Name", + "add-property": "Add Property", + "association-property": "Association Property", + "association-property-and-type": "Association Property and Type", + "property-index": "Property Index", + "selected-property-index": "Selected Property Index", + "property-index-name": "Property Index Name", + "property-value": "Property Value", + "required-property": "Required Property", + "nullable-property": "Nullable Property", + "primary-key": "Primary Key", + "primary-key-property": "Primary Key Property", + "select-primary-key-property-placeholder": "Please select primary key property", + "distinguishing-key": "Distinguishing Key", + "distinguishing-key-property": "Distinguishing Key Property", + "property-input-desc": "Please enter property value", + "del-comfirm": "Confirm deletion", + "ask": "?", + "confirm": "Confirm", + "del-success": "Deletion successful", + "save-scuccess": "Save successful", + "save-fail": "Save failed", + "save": "Save", + "cancel": "Cancel", + "more": "More", + "edit": "Edit", + "del": "Delete", + "fold": "Fold", + "open": "Expand", + "close": "Close", + "required": "Required", + "format-error-desc": "Must start with a letter, allow English, numbers, underscore", + "no-matching-results": "No matching results", + "no-data": "No data", + "data-type": "Data Type", + "corresponding-type": "Corresponding Type" + }, + "appbar": { + "graph-manager": "Graph Manager" + }, + "graphManagementHeader": { + "graph-manager": "Graph Manager", + "community": "Community Edition", + "business": "Business Edition", + "limit-desc": "Graph Limit Support", + "limit-desc1": "Graph Disk Limit", + "individual": "Individual", + "input-placeholder": "Search for graph name or ID", + "graph-create": "Create Graph" + }, + "graphManagementList": { + "save-scuccess": "Save successful", + "graph-del": "Delete Graph", + "graph-del-comfirm-msg": "Once deleted, all configurations for this graph cannot be restored", + "graph-edit": "Edit Graph", + "id": "Graph ID", + "id-desc": "Set a unique identifier for the created graph", + "name": "Graph Name", + "name-desc": "Enter the name of the graph to connect to", + "host": "Hostname", + "port": "Port Number", + "port-desc": "Please enter port number", + "username": "Username", + "password": "Password", + "creation-time": "Creation Time", + "visit": "Visit" + }, + "graphManagementEmptyList": { + "graph-create": "Create Graph", + "graph-create-desc": "You currently do not have any graphs, create one now", + "no-matching-results": "No matching results" + }, + "newGraphConfig": { + "graph-create": "Create Graph", + "create": "Create", + "create-scuccess": "Create successful", + "id": "Graph ID", + "id-desc": "Set a unique identifier for the created graph", + "name": "Graph Name", + "name-desc": "Enter the name of the graph to connect to", + "host": "Hostname", + "host-desc": "Please enter hostname", + "port": "Port Number", + "port-desc": "Please enter port number", + "username": "Username", + "password": "Password", + "not-required-desc": "Leave blank if not required" + }, + "graphManagementSidebar": { + "data-analysis": "Data Analysis", + "graph-select": "Select Graph", + "metadata-config": "Metadata Configuration", + "data-import": "Data Import", + "task-management": "Task Management" + }, + "dataAnalyze": { + "cannot-access": "Cannot Access", + "return-home": "Return Home" + }, + "dataAnalyzeInfoDrawer": { + "edit-details": "Edit Details", + "data-details": "Data Details" + } + } +} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/common.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/common.json new file mode 100644 index 000000000..f90df6586 --- /dev/null +++ b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/common.json @@ -0,0 +1,5 @@ +{ + "common": { + "loading-data": "Data loading" + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/data-import/import-tasks/ImportTasks.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/data-import/import-tasks/ImportTasks.json similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/data-import/import-tasks/ImportTasks.json rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/data-import/import-tasks/ImportTasks.json diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/dataAnalyze.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/dataAnalyze.json similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/dataAnalyze.json rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/dataAnalyze.json diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/index.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/index.less similarity index 100% rename from hugegraph-hubble/hubble-fe/src/index.less rename to hugegraph-hubble/hubble-fe-old(legacy)/src/index.less diff --git a/hugegraph-hubble/hubble-fe/src/index.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/index.tsx similarity index 100% rename from hugegraph-hubble/hubble-fe/src/index.tsx rename to hugegraph-hubble/hubble-fe-old(legacy)/src/index.tsx diff --git a/hugegraph-hubble/hubble-fe/src/react-app-env.d.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/react-app-env.d.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/react-app-env.d.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/react-app-env.d.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/asyncTasksStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/asyncTasksStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/asyncTasksStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/asyncTasksStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataAnalyzeStore/algorithmAnalyzerStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataAnalyzeStore/algorithmAnalyzerStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataAnalyzeStore/algorithmAnalyzerStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataAnalyzeStore/algorithmAnalyzerStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataImportStore/ImportManagerStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/ImportManagerStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataImportStore/ImportManagerStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/ImportManagerStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataImportStore/dataImportRootStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/dataImportRootStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataImportStore/dataImportRootStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/dataImportRootStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataImportStore/dataMapStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/dataMapStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataImportStore/dataMapStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/dataMapStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataImportStore/serverDataImportStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/serverDataImportStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/dataImportStore/serverDataImportStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/serverDataImportStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/graphManagementStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/graphManagementStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/graphManagementStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/graphManagementStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/edgeTypeStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/edgeTypeStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/edgeTypeStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/edgeTypeStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/graphViewStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/graphViewStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/graphViewStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/graphViewStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyIndexStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyIndexStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyIndexStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyIndexStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/vertexTypeStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/vertexTypeStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/GraphManagementStore/metadataConfigsStore/vertexTypeStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/vertexTypeStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/appStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/appStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/appStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/appStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/factory/asyncTasksStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/asyncTasksStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/factory/asyncTasksStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/asyncTasksStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/factory/dataAnalyzeStore/algorithmStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataAnalyzeStore/algorithmStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/factory/dataAnalyzeStore/algorithmStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataAnalyzeStore/algorithmStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/factory/dataAnalyzeStore/dataAnalyzeStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataAnalyzeStore/dataAnalyzeStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/factory/dataAnalyzeStore/dataAnalyzeStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataAnalyzeStore/dataAnalyzeStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/factory/dataImportStore/dataImportRootStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/dataImportRootStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/factory/dataImportStore/dataImportRootStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/dataImportRootStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/factory/dataImportStore/dataMapStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/dataMapStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/factory/dataImportStore/dataMapStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/dataMapStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/factory/dataImportStore/importManagmentStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/importManagmentStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/factory/dataImportStore/importManagmentStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/importManagmentStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/factory/dataImportStore/serverDataImportStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/serverDataImportStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/factory/dataImportStore/serverDataImportStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/serverDataImportStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/types/GraphManagementStore/asyncTasksStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/asyncTasksStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/types/GraphManagementStore/asyncTasksStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/asyncTasksStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/types/GraphManagementStore/dataAnalyzeStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/dataAnalyzeStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/types/GraphManagementStore/dataAnalyzeStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/dataAnalyzeStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/types/GraphManagementStore/dataImportStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/dataImportStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/types/GraphManagementStore/dataImportStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/dataImportStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/types/GraphManagementStore/graphManagementStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/graphManagementStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/types/GraphManagementStore/graphManagementStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/graphManagementStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/types/GraphManagementStore/metadataConfigsStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/metadataConfigsStore.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/types/GraphManagementStore/metadataConfigsStore.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/metadataConfigsStore.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/types/common.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/common.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/types/common.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/common.ts diff --git a/hugegraph-hubble/hubble-fe/src/stores/utils/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/utils/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/stores/utils/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/stores/utils/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/third-party.d.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/third-party.d.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/third-party.d.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/third-party.d.ts diff --git a/hugegraph-hubble/hubble-fe/src/utils/calcAlgorithmFormWidth.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/calcAlgorithmFormWidth.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/utils/calcAlgorithmFormWidth.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/utils/calcAlgorithmFormWidth.ts diff --git a/hugegraph-hubble/hubble-fe/src/utils/convertStringToJSON.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/convertStringToJSON.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/utils/convertStringToJSON.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/utils/convertStringToJSON.ts diff --git a/hugegraph-hubble/hubble-fe/src/utils/filterEmptyAlgorightmParams.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/filterEmptyAlgorightmParams.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/utils/filterEmptyAlgorightmParams.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/utils/filterEmptyAlgorightmParams.ts diff --git a/hugegraph-hubble/hubble-fe/src/utils/formatAlgorithmStatement.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/formatAlgorithmStatement.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/utils/formatAlgorithmStatement.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/utils/formatAlgorithmStatement.ts diff --git a/hugegraph-hubble/hubble-fe/src/utils/getUnicodeLength.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/getUnicodeLength.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/utils/getUnicodeLength.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/utils/getUnicodeLength.ts diff --git a/hugegraph-hubble/hubble-fe/src/utils/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/index.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/utils/index.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/utils/index.ts diff --git a/hugegraph-hubble/hubble-fe/src/utils/isDataTypeNumeric.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/isDataTypeNumeric.ts similarity index 100% rename from hugegraph-hubble/hubble-fe/src/utils/isDataTypeNumeric.ts rename to hugegraph-hubble/hubble-fe-old(legacy)/src/utils/isDataTypeNumeric.ts diff --git a/hugegraph-hubble/hubble-fe/tsconfig-extend.json b/hugegraph-hubble/hubble-fe-old(legacy)/tsconfig-extend.json similarity index 100% rename from hugegraph-hubble/hubble-fe/tsconfig-extend.json rename to hugegraph-hubble/hubble-fe-old(legacy)/tsconfig-extend.json diff --git a/hugegraph-hubble/hubble-fe/tsconfig.json b/hugegraph-hubble/hubble-fe-old(legacy)/tsconfig.json similarity index 100% rename from hugegraph-hubble/hubble-fe/tsconfig.json rename to hugegraph-hubble/hubble-fe-old(legacy)/tsconfig.json diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/yarn.lock b/hugegraph-hubble/hubble-fe-old(legacy)/yarn.lock new file mode 100644 index 000000000..712d00e2e --- /dev/null +++ b/hugegraph-hubble/hubble-fe-old(legacy)/yarn.lock @@ -0,0 +1,13380 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ant-design/colors@^6.0.0": + version "6.0.0" + resolved "https://registry.npmmirror.com/@ant-design/colors/download/@ant-design/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298" + integrity sha1-m5NmJXz/zEfbQrnQIDu1ksE8Apg= + dependencies: + "@ctrl/tinycolor" "^3.4.0" + +"@ant-design/icons-svg@^4.2.1": + version "4.2.1" + resolved "https://registry.npmmirror.com/@ant-design/icons-svg/download/@ant-design/icons-svg-4.2.1.tgz?cache=0&sync_timestamp=1632478308697&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40ant-design%2Ficons-svg%2Fdownload%2F%40ant-design%2Ficons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a" + integrity sha1-hjDajrRHGkqr2u19H/apfcss8Fo= + +"@ant-design/icons@^4.7.0": + version "4.7.0" + resolved "https://registry.npmmirror.com/@ant-design/icons/download/@ant-design/icons-4.7.0.tgz?cache=0&sync_timestamp=1632478665145&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40ant-design%2Ficons%2Fdownload%2F%40ant-design%2Ficons-4.7.0.tgz#8c3cbe0a556ba92af5dc7d1e70c0b25b5179af0f" + integrity sha1-jDy+ClVrqSr13H0ecMCyW1F5rw8= + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons-svg" "^4.2.1" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-util "^5.9.4" + +"@ant-design/react-slick@~0.28.1": + version "0.28.4" + resolved "https://registry.npmmirror.com/@ant-design/react-slick/download/@ant-design/react-slick-0.28.4.tgz#8b296b87ad7c7ae877f2a527b81b7eebd9dd29a9" + integrity sha1-iylrh618euh38qUnuBt+69ndKak= + dependencies: + "@babel/runtime" "^7.10.4" + classnames "^2.2.5" + json2mq "^0.2.0" + lodash "^4.17.21" + resize-observer-polyfill "^1.5.0" + +"@babel/code-frame@7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha1-M+JZA9dIEYFTThLsCiXxa2/PQZ4= + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.9.0": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/compat-data/download/@babel/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" + integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== + +"@babel/core@7.9.0": + version "7.9.0" + resolved "https://registry.npmmirror.com/@babel/core/download/@babel/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5": + version "7.16.12" + resolved "https://registry.npmmirror.com/@babel/core/download/@babel/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" + integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.12" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.10" + "@babel/types" "^7.16.8" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.16.8", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/generator/download/@babel/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== + dependencies: + "@babel/types" "^7.16.8" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.8.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.8.3": + version "7.16.10" + resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" + integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-create-regexp-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" + integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/download/@babel/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/download/@babel/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-function-name/download/@babel/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/download/@babel/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-simple-access/download/@babel/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.16.0.tgz?cache=0&sync_timestamp=1635567064131&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-skip-transparent-expression-wrappers%2Fdownload%2F%40babel%2Fhelper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha1-DuM4gHAUfDrgUeSH7KPrsOLouwk= + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-validator-option/download/@babel/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.16.7", "@babel/helpers@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helpers/download/@babel/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/highlight@^7.16.7", "@babel/highlight@^7.8.3": + version "7.16.10" + resolved "https://registry.npmmirror.com/@babel/highlight/download/@babel/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": + version "7.16.12" + resolved "https://registry.npmmirror.com/@babel/parser/download/@babel/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" + integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/download/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/download/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + +"@babel/plugin-proposal-async-generator-functions@^7.16.8", "@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" + integrity sha1-XgZlSvXNBLYIkVqtqbKmeIAERk4= + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-proposal-class-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-class-static-block@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/download/@babel/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" + integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/download/@babel/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" + integrity sha1-IVaGCrZcWr8GjD9nBCGEBBBmVD4= + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-decorators" "^7.8.3" + +"@babel/plugin-proposal-dynamic-import@^7.16.7", "@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.7", "@babel/plugin-proposal-json-strings@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha1-5FciU/3u1lzd7s/as/kor+sv1dI= + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + integrity sha1-XWdpQJaZ7Js7aGhM2BFs7f+Tutg= + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.7", "@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.16.7", "@babel/plugin-proposal-object-rest-spread@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" + integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.7", "@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@7.9.0": + version "7.9.0" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha1-MdsWsVTDnWuKZFKSRyuYOUwpKlg= + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.16.7", "@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.11": + version "7.16.11" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" + integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.10" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/download/@babel/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha1-qYP7Gusuw/btBCohD2QOkOeG/g0= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA= + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/download/@babel/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha1-GV34mxRrS3izv4l/16JXyEZZ1AY= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/download/@babel/plugin-syntax-decorators-7.16.7.tgz#f66a0199f16de7c1ef5192160ccf5d069739e3d3" + integrity sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha1-AolkqbqA28CUyRXEh618TnpmRlo= + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-flow/download/@babel/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" + integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha1-ypHvRjA1MESLkGZSusLp/plB9pk= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha1-YRGiZbz7Ag6579D9/X0mQCue1sE= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/download/@babel/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/download/@babel/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" + integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-arrow-functions@^7.16.7", "@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-async-to-generator@^7.16.8", "@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + +"@babel/plugin-transform-block-scoped-functions@^7.16.7", "@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.16.7", "@babel/plugin-transform-block-scoping@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-classes@^7.16.7", "@babel/plugin-transform-classes@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.7", "@babel/plugin-transform-computed-properties@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-destructuring@^7.16.7", "@babel/plugin-transform-destructuring@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" + integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-duplicate-keys@^7.16.7", "@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-exponentiation-operator@^7.16.7", "@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-flow-strip-types@7.9.0": + version "7.9.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-flow-strip-types/download/@babel/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" + integrity sha1-ijU4qkBDTgALj0Sjxcmscim9I5I= + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-flow" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.16.7", "@babel/plugin-transform-for-of@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-function-name@^7.16.7", "@babel/plugin-transform-function-name@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.16.7", "@babel/plugin-transform-literals@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-member-expression-literals@^7.16.7", "@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-amd@^7.16.7", "@babel/plugin-transform-modules-amd@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.16.8", "@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" + integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.16.7", "@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" + integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== + dependencies: + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.7", "@babel/plugin-transform-modules-umd@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8", "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" + integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + +"@babel/plugin-transform-new-target@^7.16.7", "@babel/plugin-transform-new-target@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-object-super@^7.16.7", "@babel/plugin-transform-object-super@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-parameters@^7.16.7", "@babel/plugin-transform-parameters@^7.8.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-property-literals@^7.16.7", "@babel/plugin-transform-property-literals@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-constant-elements@^7.0.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-constant-elements/download/@babel/plugin-transform-react-constant-elements-7.16.7.tgz#19e9e4c2df2f6c3e6b3aea11778297d81db8df62" + integrity sha512-lF+cfsyTgwWkcw715J88JhMYJ5GpysYNLhLP1PkvkhTRN7B3e74R/1KsDxFxhRpSn0UUD3IWM4GvdBR2PEbbQQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-display-name@7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/download/@babel/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" + integrity sha1-cN7Zh8kWCfeDU9120vsqC7mR6OU= + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-display-name@^7.16.7", "@babel/plugin-transform-react-display-name@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/download/@babel/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx-development@^7.16.7", "@babel/plugin-transform-react-jsx-development@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/download/@babel/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.7" + +"@babel/plugin-transform-react-jsx-self@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/download/@babel/plugin-transform-react-jsx-self-7.16.7.tgz#f432ad0cba14c4a1faf44f0076c69e42a4d4479e" + integrity sha512-oe5VuWs7J9ilH3BCCApGoYjHoSO48vkjX2CbA5bFVhIuO2HKxA3vyF7rleA4o6/4rTDbk6r8hBW7Ul8E+UZrpA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx-source@^7.9.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/download/@babel/plugin-transform-react-jsx-source-7.16.7.tgz#1879c3f23629d287cc6186a6c683154509ec70c0" + integrity sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.9.1": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/download/@babel/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" + integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/plugin-transform-react-pure-annotations@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-pure-annotations/download/@babel/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" + integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-regenerator@^7.16.7", "@babel/plugin-transform-regenerator@^7.8.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" + integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.16.7", "@babel/plugin-transform-reserved-words@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-runtime@7.9.0": + version "7.9.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" + integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.16.7", "@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.16.7", "@babel/plugin-transform-spread@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.7", "@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.16.7", "@babel/plugin-transform-template-literals@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typeof-symbol@^7.16.7", "@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typescript@^7.9.0": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/download/@babel/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" + integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-typescript" "^7.16.7" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.16.7", "@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-env@7.9.0": + version "7.9.0" + resolved "https://registry.npmmirror.com/@babel/preset-env/download/@babel/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" + integrity sha1-pfxCSA6VCuj12fjyu8A/UnIt86g= + dependencies: + "@babel/compat-data" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.0" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.9.0" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.8.7" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.0" + browserslist "^4.9.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-env@^7.4.5": + version "7.16.11" + resolved "https://registry.npmmirror.com/@babel/preset-env/download/@babel/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" + integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== + dependencies: + "@babel/compat-data" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.16.7" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.16.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.11" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.16.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.16.8" + "@babel/plugin-transform-modules-systemjs" "^7.16.7" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.16.7" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.8" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.20.2" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmmirror.com/@babel/preset-modules/download/@babel/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha1-75Odbn8miCfhhBY43G/5VRXhFdk= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@7.9.1": + version "7.9.1" + resolved "https://registry.npmmirror.com/@babel/preset-react/download/@babel/preset-react-7.9.1.tgz#b346403c36d58c3bb544148272a0cefd9c28677a" + integrity sha1-s0ZAPDbVjDu1RBSCcqDO/ZwoZ3o= + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-react-display-name" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.9.1" + "@babel/plugin-transform-react-jsx-development" "^7.9.0" + "@babel/plugin-transform-react-jsx-self" "^7.9.0" + "@babel/plugin-transform-react-jsx-source" "^7.9.0" + +"@babel/preset-react@^7.0.0": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/preset-react/download/@babel/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" + integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-react-display-name" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx-development" "^7.16.7" + "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + +"@babel/preset-typescript@7.9.0": + version "7.9.0" + resolved "https://registry.npmmirror.com/@babel/preset-typescript/download/@babel/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" + integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-typescript" "^7.9.0" + +"@babel/runtime-corejs3@^7.12.1": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/runtime-corejs3/download/@babel/runtime-corejs3-7.16.8.tgz#ea533d96eda6fdc76b1812248e9fbd0c11d4a1a7" + integrity sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg== + dependencies: + core-js-pure "^3.20.2" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.9.0": + version "7.9.0" + resolved "https://registry.npmmirror.com/@babel/runtime/download/@babel/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b" + integrity sha1-M37aZ0AfWwZqbyBaMRPUrBi6SVs= + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/runtime/download/@babel/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.16.7", "@babel/template@^7.4.0", "@babel/template@^7.8.6": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": + version "7.16.10" + resolved "https://registry.npmmirror.com/@babel/traverse/download/@babel/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" + integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.10" + "@babel/types" "^7.16.8" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.9.0": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/types/download/@babel/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.npmmirror.com/@cnakazawa/watch/download/@cnakazawa/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha1-+GSuhQBND8q29QvpFBxNo2jRZWo= + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.npmmirror.com/@csstools/convert-colors/download/@csstools/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha1-rUldxBsS511YjG24uYNPCPoTHrc= + +"@csstools/normalize.css@^10.1.0": + version "10.1.0" + resolved "https://registry.npmmirror.com/@csstools/normalize.css/download/@csstools/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" + integrity sha1-8JULuhiBlRLUL3GX5WxRiqSRzxg= + +"@ctrl/tinycolor@^3.4.0": + version "3.4.0" + resolved "https://registry.npmmirror.com/@ctrl/tinycolor/download/@ctrl/tinycolor-3.4.0.tgz#c3c5ae543c897caa9c2a68630bed355be5f9990f" + integrity sha1-w8WuVDyJfKqcKmhjC+01W+X5mQ8= + +"@emotion/is-prop-valid@^0.8.2": + version "0.8.8" + resolved "https://registry.npmmirror.com/@emotion/is-prop-valid/download/@emotion/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha1-2yixxDaKJZtgqXMR1qlS1P0BrBo= + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.npmmirror.com/@emotion/memoize/download/@emotion/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha1-Gb8PWvGRSREcQNmLsM+CEZ9dnus= + +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.npmmirror.com/@hapi/address/download/@hapi/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha1-XWftQ/P9QaadS5/3tW58DR0KgeU= + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.npmmirror.com/@hapi/bourne/download/@hapi/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha1-CnCVreoGckPOMoPhtWuKj0U7JCo= + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.npmmirror.com/@hapi/hoek/download/@hapi/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha1-/elgZMpEbeyMVajC8TCVewcMbgY= + +"@hapi/joi@^15.0.0": + version "15.1.1" + resolved "https://registry.npmmirror.com/@hapi/joi/download/@hapi/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha1-xnW4pxKW8Cgz+NbSQ7NMV7jOGdc= + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.npmmirror.com/@hapi/topo/download/@hapi/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha1-aNk1+j6uf91asNf5U/MgXYsr/Ck= + dependencies: + "@hapi/hoek" "^8.3.0" + +"@hypnosphi/create-react-context@^0.3.1": + version "0.3.1" + resolved "https://registry.npmmirror.com/@hypnosphi/create-react-context/download/@hypnosphi/create-react-context-0.3.1.tgz#f8bfebdc7665f5d426cba3753e0e9c7d3154d7c6" + integrity sha1-+L/r3HZl9dQmy6N1Pg6cfTFU18Y= + dependencies: + gud "^1.0.0" + warning "^4.0.3" + +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.npmmirror.com/@jest/console/download/@jest/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha1-ebG8Bvt0qM+wHL3t+UVYSxuXB/A= + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.npmmirror.com/@jest/core/download/@jest/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha1-LOzNC5MYH5xIUOdPKprUPTUTacQ= + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.3.0", "@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.npmmirror.com/@jest/environment/download/@jest/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha1-IeOvotZcBYbL1svv4gi6+t5Eqxg= + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.npmmirror.com/@jest/fake-timers/download/@jest/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha1-uj5r8O7NCaY2BJiWQ00wZjZUDJM= + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.npmmirror.com/@jest/reporters/download/@jest/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha1-hmYO/44rlmHQQqjpigKLjWMaW0M= + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.npmmirror.com/@jest/source-map/download/@jest/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha1-DiY6lEML5LQdpoPMwea//ioZFxQ= + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.npmmirror.com/@jest/test-result/download/@jest/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha1-EXluiqnb+I6gJXV7MVJZWtBroMo= + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.npmmirror.com/@jest/test-sequencer/download/@jest/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha1-+PM081tiWk8vNV8v5+YDba0uazE= + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.npmmirror.com/@jest/transform/download/@jest/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha1-SuJ2iyllU/rasJ6ewRlUPJCxbFY= + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.3.0", "@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.npmmirror.com/@jest/types/download/@jest/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha1-Y8smy3UA0Gnlo4lEGnxqtekJ/Fk= + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.npmmirror.com/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4= + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U= + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos= + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.npmmirror.com/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs= + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmmirror.com/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po= + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@react-dnd/asap@^4.0.0": + version "4.0.0" + resolved "https://registry.npmmirror.com/@react-dnd/asap/download/@react-dnd/asap-4.0.0.tgz#b300eeed83e9801f51bd66b0337c9a6f04548651" + integrity sha1-swDu7YPpgB9RvWawM3yabwRUhlE= + +"@react-dnd/invariant@^2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/@react-dnd/invariant/download/@react-dnd/invariant-2.0.0.tgz#09d2e81cd39e0e767d7da62df9325860f24e517e" + integrity sha1-CdLoHNOeDnZ9faYt+TJYYPJOUX4= + +"@react-dnd/shallowequal@^2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/@react-dnd/shallowequal/download/@react-dnd/shallowequal-2.0.0.tgz#a3031eb54129f2c66b2753f8404266ec7bf67f0a" + integrity sha1-owMetUEp8sZrJ1P4QEJm7Hv2fwo= + +"@stylelint/postcss-css-in-js@^0.37.2": + version "0.37.2" + resolved "https://registry.npmmirror.com/@stylelint/postcss-css-in-js/download/@stylelint/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2" + integrity sha1-flqErRgfQjSiSAgDQipHuHSa89I= + dependencies: + "@babel/core" ">=7.9.0" + +"@stylelint/postcss-markdown@^0.36.2": + version "0.36.2" + resolved "https://registry.npmmirror.com/@stylelint/postcss-markdown/download/@stylelint/postcss-markdown-0.36.2.tgz#0a540c4692f8dcdfc13c8e352c17e7bfee2bb391" + integrity sha1-ClQMRpL43N/BPI41LBfnv+4rs5E= + dependencies: + remark "^13.0.0" + unist-util-find-all-after "^3.0.2" + +"@svgr/babel-plugin-add-jsx-attribute@^4.2.0": + version "4.2.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-add-jsx-attribute/download/@svgr/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" + integrity sha1-2ty2IYUDUy1ohLIQ5/PFAsqqRLE= + +"@svgr/babel-plugin-remove-jsx-attribute@^4.2.0": + version "4.2.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-attribute/download/@svgr/babel-plugin-remove-jsx-attribute-4.2.0.tgz#297550b9a8c0c7337bea12bdfc8a80bb66f85abc" + integrity sha1-KXVQuajAxzN76hK9/IqAu2b4Wrw= + +"@svgr/babel-plugin-remove-jsx-empty-expression@^4.2.0": + version "4.2.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-empty-expression/download/@svgr/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz#c196302f3e68eab6a05e98af9ca8570bc13131c7" + integrity sha1-wZYwLz5o6ragXpivnKhXC8ExMcc= + +"@svgr/babel-plugin-replace-jsx-attribute-value@^4.2.0": + version "4.2.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-replace-jsx-attribute-value/download/@svgr/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz#310ec0775de808a6a2e4fd4268c245fd734c1165" + integrity sha1-MQ7Ad13oCKai5P1CaMJF/XNMEWU= + +"@svgr/babel-plugin-svg-dynamic-title@^4.3.3": + version "4.3.3" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-dynamic-title/download/@svgr/babel-plugin-svg-dynamic-title-4.3.3.tgz#2cdedd747e5b1b29ed4c241e46256aac8110dd93" + integrity sha1-LN7ddH5bGyntTCQeRiVqrIEQ3ZM= + +"@svgr/babel-plugin-svg-em-dimensions@^4.2.0": + version "4.2.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-em-dimensions/download/@svgr/babel-plugin-svg-em-dimensions-4.2.0.tgz#9a94791c9a288108d20a9d2cc64cac820f141391" + integrity sha1-mpR5HJoogQjSCp0sxkysgg8UE5E= + +"@svgr/babel-plugin-transform-react-native-svg@^4.2.0": + version "4.2.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-react-native-svg/download/@svgr/babel-plugin-transform-react-native-svg-4.2.0.tgz#151487322843359a1ca86b21a3815fd21a88b717" + integrity sha1-FRSHMihDNZocqGsho4Ff0hqItxc= + +"@svgr/babel-plugin-transform-svg-component@^4.2.0": + version "4.2.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-svg-component/download/@svgr/babel-plugin-transform-svg-component-4.2.0.tgz#5f1e2f886b2c85c67e76da42f0f6be1b1767b697" + integrity sha1-Xx4viGsshcZ+dtpC8Pa+Gxdntpc= + +"@svgr/babel-preset@^4.3.3": + version "4.3.3" + resolved "https://registry.npmmirror.com/@svgr/babel-preset/download/@svgr/babel-preset-4.3.3.tgz#a75d8c2f202ac0e5774e6bfc165d028b39a1316c" + integrity sha1-p12MLyAqwOV3Tmv8Fl0CizmhMWw= + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^4.2.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^4.2.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^4.2.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^4.2.0" + "@svgr/babel-plugin-svg-dynamic-title" "^4.3.3" + "@svgr/babel-plugin-svg-em-dimensions" "^4.2.0" + "@svgr/babel-plugin-transform-react-native-svg" "^4.2.0" + "@svgr/babel-plugin-transform-svg-component" "^4.2.0" + +"@svgr/core@^4.3.3": + version "4.3.3" + resolved "https://registry.npmmirror.com/@svgr/core/download/@svgr/core-4.3.3.tgz#b37b89d5b757dc66e8c74156d00c368338d24293" + integrity sha1-s3uJ1bdX3Gbox0FW0Aw2gzjSQpM= + dependencies: + "@svgr/plugin-jsx" "^4.3.3" + camelcase "^5.3.1" + cosmiconfig "^5.2.1" + +"@svgr/hast-util-to-babel-ast@^4.3.2": + version "4.3.2" + resolved "https://registry.npmmirror.com/@svgr/hast-util-to-babel-ast/download/@svgr/hast-util-to-babel-ast-4.3.2.tgz#1d5a082f7b929ef8f1f578950238f630e14532b8" + integrity sha1-HVoIL3uSnvjx9XiVAjj2MOFFMrg= + dependencies: + "@babel/types" "^7.4.4" + +"@svgr/plugin-jsx@^4.3.3": + version "4.3.3" + resolved "https://registry.npmmirror.com/@svgr/plugin-jsx/download/@svgr/plugin-jsx-4.3.3.tgz#e2ba913dbdfbe85252a34db101abc7ebd50992fa" + integrity sha1-4rqRPb376FJSo02xAavH69UJkvo= + dependencies: + "@babel/core" "^7.4.5" + "@svgr/babel-preset" "^4.3.3" + "@svgr/hast-util-to-babel-ast" "^4.3.2" + svg-parser "^2.0.0" + +"@svgr/plugin-svgo@^4.3.1": + version "4.3.1" + resolved "https://registry.npmmirror.com/@svgr/plugin-svgo/download/@svgr/plugin-svgo-4.3.1.tgz#daac0a3d872e3f55935c6588dd370336865e9e32" + integrity sha1-2qwKPYcuP1WTXGWI3TcDNoZenjI= + dependencies: + cosmiconfig "^5.2.1" + merge-deep "^3.0.2" + svgo "^1.2.2" + +"@svgr/webpack@4.3.3": + version "4.3.3" + resolved "https://registry.npmmirror.com/@svgr/webpack/download/@svgr/webpack-4.3.3.tgz#13cc2423bf3dff2d494f16b17eb7eacb86895017" + integrity sha1-E8wkI789/y1JTxaxfrfqy4aJUBc= + dependencies: + "@babel/core" "^7.4.5" + "@babel/plugin-transform-react-constant-elements" "^7.0.0" + "@babel/preset-env" "^7.4.5" + "@babel/preset-react" "^7.0.0" + "@svgr/core" "^4.3.3" + "@svgr/plugin-jsx" "^4.3.3" + "@svgr/plugin-svgo" "^4.3.1" + loader-utils "^1.2.3" + +"@types/babel__core@^7.1.0": + version "7.1.18" + resolved "https://registry.npmmirror.com/@types/babel__core/download/@types/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" + integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.npmmirror.com/@types/babel__generator/download/@types/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.npmmirror.com/@types/babel__template/download/@types/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha1-PRpI/Z1sDt/Vby/1eNrtSPNsiWk= + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.14.2" + resolved "https://registry.npmmirror.com/@types/babel__traverse/download/@types/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha1-/81HC7s/i/MEgWePtVAieMqDOkM= + dependencies: + "@babel/types" "^7.3.0" + +"@types/classnames@^2.2.10": + version "2.3.1" + resolved "https://registry.npmmirror.com/@types/classnames/download/@types/classnames-2.3.1.tgz#3c2467aa0f1a93f1f021e3b9bcf938bd5dfdc0dd" + integrity sha1-PCRnqg8ak/HwIeO5vPk4vV39wN0= + dependencies: + classnames "*" + +"@types/codemirror@^0.0.96": + version "0.0.96" + resolved "https://registry.npmmirror.com/@types/codemirror/download/@types/codemirror-0.0.96.tgz#73b52e784a246cebef31d544fef45ea764de5bad" + integrity sha1-c7UueEokbOvvMdVE/vRep2TeW60= + dependencies: + "@types/tern" "*" + +"@types/d3-array@^1": + version "1.2.9" + resolved "https://registry.npmmirror.com/@types/d3-array/download/@types/d3-array-1.2.9.tgz#c7dc78992cd8ca5c850243a265fd257ea56df1fa" + integrity sha1-x9x4mSzYylyFAkOiZf0lfqVt8fo= + +"@types/d3-axis@^1": + version "1.0.16" + resolved "https://registry.npmmirror.com/@types/d3-axis/download/@types/d3-axis-1.0.16.tgz#93d7a28795c2f8b0e2fd550fcc4d29b7f174e693" + integrity sha1-k9eih5XC+LDi/VUPzE0pt/F05pM= + dependencies: + "@types/d3-selection" "^1" + +"@types/d3-brush@^1": + version "1.1.5" + resolved "https://registry.npmmirror.com/@types/d3-brush/download/@types/d3-brush-1.1.5.tgz#c7cfb58decbfd53ad3e47f0376345e3640a68186" + integrity sha1-x8+1jey/1TrT5H8DdjReNkCmgYY= + dependencies: + "@types/d3-selection" "^1" + +"@types/d3-chord@^1": + version "1.0.11" + resolved "https://registry.npmmirror.com/@types/d3-chord/download/@types/d3-chord-1.0.11.tgz#5760765db1b1a4b936c0d9355a821dde9dd25da2" + integrity sha1-V2B2XbGxpLk2wNk1WoId3p3SXaI= + +"@types/d3-collection@*": + version "1.0.10" + resolved "https://registry.npmmirror.com/@types/d3-collection/download/@types/d3-collection-1.0.10.tgz#bca161e336156968f267c077f7f2bfa8ff224e58" + integrity sha1-vKFh4zYVaWjyZ8B39/K/qP8iTlg= + +"@types/d3-color@^1": + version "1.4.2" + resolved "https://registry.npmmirror.com/@types/d3-color/download/@types/d3-color-1.4.2.tgz#944f281d04a0f06e134ea96adbb68303515b2784" + integrity sha1-lE8oHQSg8G4TTqlq27aDA1FbJ4Q= + +"@types/d3-contour@^1": + version "1.3.3" + resolved "https://registry.npmmirror.com/@types/d3-contour/download/@types/d3-contour-1.3.3.tgz#44529d498bbc1db78b195d75e1c9bb889edd647a" + integrity sha1-RFKdSYu8HbeLGV114cm7iJ7dZHo= + dependencies: + "@types/d3-array" "^1" + "@types/geojson" "*" + +"@types/d3-dispatch@^1": + version "1.0.9" + resolved "https://registry.npmmirror.com/@types/d3-dispatch/download/@types/d3-dispatch-1.0.9.tgz#c5a180f1e251de853b399cfbfbb6dd7f8bf842ae" + integrity sha1-xaGA8eJR3oU7OZz7+7bdf4v4Qq4= + +"@types/d3-drag@^1": + version "1.2.5" + resolved "https://registry.npmmirror.com/@types/d3-drag/download/@types/d3-drag-1.2.5.tgz#0b1b852cb41577075aa625ae6149379ea6c34dfd" + integrity sha1-CxuFLLQVdwdapiWuYUk3nqbDTf0= + dependencies: + "@types/d3-selection" "^1" + +"@types/d3-dsv@^1": + version "1.2.1" + resolved "https://registry.npmmirror.com/@types/d3-dsv/download/@types/d3-dsv-1.2.1.tgz#1524fee9f19d689c2f76aa0e24e230762bf96994" + integrity sha1-FST+6fGdaJwvdqoOJOIwdiv5aZQ= + +"@types/d3-ease@^1": + version "1.0.11" + resolved "https://registry.npmmirror.com/@types/d3-ease/download/@types/d3-ease-1.0.11.tgz#c4728639f5703dcb75b216dfa0860b2720f26898" + integrity sha512-wUigPL0kleGZ9u3RhzBP07lxxkMcUjL5IODP42mN/05UNL+JJCDnpEPpFbJiPvLcTeRKGIRpBBJyP/1BNwYsVA== + +"@types/d3-fetch@^1": + version "1.2.2" + resolved "https://registry.npmmirror.com/@types/d3-fetch/download/@types/d3-fetch-1.2.2.tgz#b93bfe248b8b761af82f4dac57959c989f67da3e" + integrity sha1-uTv+JIuLdhr4L02sV5WcmJ9n2j4= + dependencies: + "@types/d3-dsv" "^1" + +"@types/d3-force@^1": + version "1.2.4" + resolved "https://registry.npmmirror.com/@types/d3-force/download/@types/d3-force-1.2.4.tgz#6e274c72288c2db08fbdb8f5b87b9aa83e55a9e8" + integrity sha1-bidMciiMLbCPvbj1uHuaqD5Vqeg= + +"@types/d3-format@^1": + version "1.4.2" + resolved "https://registry.npmmirror.com/@types/d3-format/download/@types/d3-format-1.4.2.tgz#ea17bf559b71d9afd569ae9bfe4c544dab863baa" + integrity sha1-6he/VZtx2a/Vaa6b/kxUTauGO6o= + +"@types/d3-geo@^1": + version "1.12.3" + resolved "https://registry.npmmirror.com/@types/d3-geo/download/@types/d3-geo-1.12.3.tgz#512ebe735cb1cdf5f87ad59608416e2e9e868c5a" + integrity sha1-US6+c1yxzfX4etWWCEFuLp6GjFo= + dependencies: + "@types/geojson" "*" + +"@types/d3-hierarchy@^1": + version "1.1.8" + resolved "https://registry.npmmirror.com/@types/d3-hierarchy/download/@types/d3-hierarchy-1.1.8.tgz#50657f420d565a06c0b950a4b82eee0a369f2dea" + integrity sha1-UGV/Qg1WWgbAuVCkuC7uCjafLeo= + +"@types/d3-interpolate@^1": + version "1.4.2" + resolved "https://registry.npmmirror.com/@types/d3-interpolate/download/@types/d3-interpolate-1.4.2.tgz#88902a205f682773a517612299a44699285eed7b" + integrity sha1-iJAqIF9oJ3OlF2EimaRGmShe7Xs= + dependencies: + "@types/d3-color" "^1" + +"@types/d3-path@^1": + version "1.0.9" + resolved "https://registry.npmmirror.com/@types/d3-path/download/@types/d3-path-1.0.9.tgz#73526b150d14cd96e701597cbf346cfd1fd4a58c" + integrity sha1-c1JrFQ0UzZbnAVl8vzRs/R/UpYw= + +"@types/d3-polygon@^1": + version "1.0.8" + resolved "https://registry.npmmirror.com/@types/d3-polygon/download/@types/d3-polygon-1.0.8.tgz#127ee83fccda5bf57384011da90f31367fea1530" + integrity sha1-En7oP8zaW/VzhAEdqQ8xNn/qFTA= + +"@types/d3-quadtree@^1": + version "1.0.9" + resolved "https://registry.npmmirror.com/@types/d3-quadtree/download/@types/d3-quadtree-1.0.9.tgz#c7c3b795b5af06e5b043d1d34e754a434b3bae59" + integrity sha1-x8O3lbWvBuWwQ9HTTnVKQ0s7rlk= + +"@types/d3-random@^1": + version "1.1.3" + resolved "https://registry.npmmirror.com/@types/d3-random/download/@types/d3-random-1.1.3.tgz#8f7fdc23f92d1561e0694eb49567e8ab50537a19" + integrity sha1-j3/cI/ktFWHgaU60lWfoq1BTehk= + +"@types/d3-scale-chromatic@^1": + version "1.5.1" + resolved "https://registry.npmmirror.com/@types/d3-scale-chromatic/download/@types/d3-scale-chromatic-1.5.1.tgz#e2b7c3401e5c13809f831911eb820e444f4fc67a" + integrity sha1-4rfDQB5cE4CfgxkR64IORE9Pxno= + +"@types/d3-scale@^2": + version "2.2.6" + resolved "https://registry.npmmirror.com/@types/d3-scale/download/@types/d3-scale-2.2.6.tgz#28540b4dfc99d978970e873e4138a6bea2ea6ab8" + integrity sha1-KFQLTfyZ2XiXDoc+QTimvqLqarg= + dependencies: + "@types/d3-time" "^1" + +"@types/d3-selection@^1": + version "1.4.3" + resolved "https://registry.npmmirror.com/@types/d3-selection/download/@types/d3-selection-1.4.3.tgz#36928bbe64eb8e0bbcbaa01fb05c21ff6c71fa93" + integrity sha1-NpKLvmTrjgu8uqAfsFwh/2xx+pM= + +"@types/d3-shape@^1": + version "1.3.8" + resolved "https://registry.npmmirror.com/@types/d3-shape/download/@types/d3-shape-1.3.8.tgz#c3c15ec7436b4ce24e38de517586850f1fea8e89" + integrity sha1-w8Fex0NrTOJOON5RdYaFDx/qjok= + dependencies: + "@types/d3-path" "^1" + +"@types/d3-time-format@^2": + version "2.3.1" + resolved "https://registry.npmmirror.com/@types/d3-time-format/download/@types/d3-time-format-2.3.1.tgz#87a30e4513b9d1d53b920327a361f87255bf3372" + integrity sha1-h6MORRO50dU7kgMno2H4clW/M3I= + +"@types/d3-time@^1": + version "1.1.1" + resolved "https://registry.npmmirror.com/@types/d3-time/download/@types/d3-time-1.1.1.tgz#6cf3a4242c3bbac00440dfb8ba7884f16bedfcbf" + integrity sha1-bPOkJCw7usAEQN+4uniE8Wvt/L8= + +"@types/d3-timer@^1": + version "1.0.10" + resolved "https://registry.npmmirror.com/@types/d3-timer/download/@types/d3-timer-1.0.10.tgz#329c51c2c931f44ed0acff78b8c84571acf0ed21" + integrity sha1-MpxRwskx9E7QrP94uMhFcazw7SE= + +"@types/d3-transition@^1": + version "1.3.2" + resolved "https://registry.npmmirror.com/@types/d3-transition/download/@types/d3-transition-1.3.2.tgz#ed59beca7b4d679cfa52f88a6a50e5bbeb7e0a3c" + integrity sha1-7Vm+yntNZ5z6UviKalDlu+t+Cjw= + dependencies: + "@types/d3-selection" "^1" + +"@types/d3-voronoi@*": + version "1.1.9" + resolved "https://registry.npmmirror.com/@types/d3-voronoi/download/@types/d3-voronoi-1.1.9.tgz#7bbc210818a3a5c5e0bafb051420df206617c9e5" + integrity sha1-e7whCBijpcXguvsFFCDfIGYXyeU= + +"@types/d3-zoom@^1": + version "1.8.3" + resolved "https://registry.npmmirror.com/@types/d3-zoom/download/@types/d3-zoom-1.8.3.tgz#00237900c6fdc2bb4fe82679ee4d74eb8fbe7b3c" + integrity sha1-ACN5AMb9wrtP6CZ57k1064++ezw= + dependencies: + "@types/d3-interpolate" "^1" + "@types/d3-selection" "^1" + +"@types/d3@^5.7.2": + version "5.16.4" + resolved "https://registry.npmmirror.com/@types/d3/download/@types/d3-5.16.4.tgz#a7dc24a3dc1c19922eee72ba16144fd5bcea987a" + integrity sha1-p9wko9wcGZIu7nK6FhRP1bzqmHo= + dependencies: + "@types/d3-array" "^1" + "@types/d3-axis" "^1" + "@types/d3-brush" "^1" + "@types/d3-chord" "^1" + "@types/d3-collection" "*" + "@types/d3-color" "^1" + "@types/d3-contour" "^1" + "@types/d3-dispatch" "^1" + "@types/d3-drag" "^1" + "@types/d3-dsv" "^1" + "@types/d3-ease" "^1" + "@types/d3-fetch" "^1" + "@types/d3-force" "^1" + "@types/d3-format" "^1" + "@types/d3-geo" "^1" + "@types/d3-hierarchy" "^1" + "@types/d3-interpolate" "^1" + "@types/d3-path" "^1" + "@types/d3-polygon" "^1" + "@types/d3-quadtree" "^1" + "@types/d3-random" "^1" + "@types/d3-scale" "^2" + "@types/d3-scale-chromatic" "^1" + "@types/d3-selection" "^1" + "@types/d3-shape" "^1" + "@types/d3-time" "^1" + "@types/d3-time-format" "^2" + "@types/d3-timer" "^1" + "@types/d3-transition" "^1" + "@types/d3-voronoi" "*" + "@types/d3-zoom" "^1" + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@types/eslint-visitor-keys/download/@types/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha1-HuMNeVRMqE1o1LPNsK9PIFZj3S0= + +"@types/estree@*": + version "0.0.50" + resolved "https://registry.npmmirror.com/@types/estree/download/@types/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha1-Hgyqk2TT/M0pMcPtlv2+ql1MyoM= + +"@types/file-saver@^2.0.1": + version "2.0.5" + resolved "https://registry.npmmirror.com/@types/file-saver/download/@types/file-saver-2.0.5.tgz#9ee342a5d1314bb0928375424a2f162f97c310c7" + integrity sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ== + +"@types/geojson@*": + version "7946.0.8" + resolved "https://registry.npmmirror.com/@types/geojson/download/@types/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca" + integrity sha1-MHRK/bOF4pReIvOwM/iX92sfEso= + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.npmmirror.com/@types/glob/download/@types/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha1-vBtb86qS8lvV3TnzXFc2G9zlsus= + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.npmmirror.com/@types/hoist-non-react-statics/download/@types/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha1-ESSq/lEYy1kZd66xzqrtEHDrA58= + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.4" + resolved "https://registry.npmmirror.com/@types/istanbul-lib-coverage/download/@types/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmmirror.com/@types/istanbul-lib-report/download/@types/istanbul-lib-report-3.0.0.tgz?cache=0&sync_timestamp=1637266271645&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fistanbul-lib-report%2Fdownload%2F%40types%2Fistanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha1-wUwk8Y6oGQwRjudWK3/5mjZVJoY= + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.npmmirror.com/@types/istanbul-reports/download/@types/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha1-6HXMaJ5HvOVJ7IHz315vbxHPrrI= + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/jest-diff@*": + version "24.3.0" + resolved "https://registry.npmmirror.com/@types/jest-diff/download/@types/jest-diff-24.3.0.tgz#29e237a3d954babfe6e23cc59b57ecd8ca8d858d" + integrity sha1-KeI3o9lUur/m4jzFm1fs2MqNhY0= + dependencies: + jest-diff "*" + +"@types/jest@24.0.15": + version "24.0.15" + resolved "https://registry.npmmirror.com/@types/jest/download/@types/jest-24.0.15.tgz#6c42d5af7fe3b44ffff7cc65de7bf741e8fa427f" + integrity sha1-bELVr3/jtE//98xl3nv3Qej6Qn8= + dependencies: + "@types/jest-diff" "*" + +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": + version "7.0.9" + resolved "https://registry.npmmirror.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha1-l+3JA36gw4WFMgsolk3eOznkZg0= + +"@types/lodash-es@^4.17.3": + version "4.17.5" + resolved "https://registry.npmmirror.com/@types/lodash-es/download/@types/lodash-es-4.17.5.tgz#1c3fdd16849d84aea43890b1c60da379fb501353" + integrity sha1-HD/dFoSdhK6kOJCxxg2jeftQE1M= + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.178" + resolved "https://registry.npmmirror.com/@types/lodash/download/@types/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" + integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== + +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.npmmirror.com/@types/mdast/download/@types/mdast-3.0.10.tgz?cache=0&sync_timestamp=1637267171178&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fmdast%2Fdownload%2F%40types%2Fmdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha1-RyQkSoKkWYiEy76bz9c9/5J+6K8= + dependencies: + "@types/unist" "*" + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.npmmirror.com/@types/minimatch/download/@types/minimatch-3.0.5.tgz?cache=0&sync_timestamp=1637267467935&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fminimatch%2Fdownload%2F%40types%2Fminimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha1-EAHMXmo3BLg8I2An538vWOoBD0A= + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.npmmirror.com/@types/minimist/download/@types/minimist-1.2.2.tgz?cache=0&sync_timestamp=1637267478331&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fminimist%2Fdownload%2F%40types%2Fminimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha1-7nceK6Sz3Fs3KTXVSf2WF780W4w= + +"@types/node@*": + version "17.0.13" + resolved "https://registry.npmmirror.com/@types/node/download/@types/node-17.0.13.tgz#5ed7ed7c662948335fcad6c412bb42d99ea754e3" + integrity sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw== + +"@types/node@14.11.8": + version "14.11.8" + resolved "https://registry.npmmirror.com/@types/node/download/@types/node-14.11.8.tgz#fe2012f2355e4ce08bca44aeb3abbb21cf88d33f" + integrity sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.npmmirror.com/@types/normalize-package-data/download/@types/normalize-package-data-2.4.1.tgz?cache=0&sync_timestamp=1637268963320&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fnormalize-package-data%2Fdownload%2F%40types%2Fnormalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha1-0zV0eaD9/dWQf+Z+F+CoXJBuEwE= + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmmirror.com/@types/parse-json/download/@types/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA= + +"@types/prop-types@*": + version "15.7.4" + resolved "https://registry.npmmirror.com/@types/prop-types/download/@types/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha1-/PcgXCXf95Xuea8eMNosl5CAjxE= + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.npmmirror.com/@types/q/download/@types/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + +"@types/react-dom@16.9.8": + version "16.9.8" + resolved "https://registry.npmmirror.com/@types/react-dom/download/@types/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423" + integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== + dependencies: + "@types/react" "*" + +"@types/react-highlight-words@^0.16.1": + version "0.16.4" + resolved "https://registry.npmmirror.com/@types/react-highlight-words/download/@types/react-highlight-words-0.16.4.tgz#441b6f05c27ce6ab76833803a84bc385f0a1e8f2" + integrity sha512-KITBX3xzheQLu2s3bUgLmRE7ekmhc52zRjRTwkKayQARh30L4fjEGzGm7ULK9TuX2LgxWWavZqyQGDGjAHbL3w== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "17.0.38" + resolved "https://registry.npmmirror.com/@types/react/download/@types/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" + integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@16.9.52": + version "16.9.52" + resolved "https://registry.npmmirror.com/@types/react/download/@types/react-16.9.52.tgz#c46c72d1a1d8d9d666f4dd2066c0e22600ccfde1" + integrity sha512-EHRjmnxiNivwhGdMh9sz1Yw9AUxTSZFxKqdBWAAzyZx3sufWwx6ogqHYh/WB1m/I4ZpjkoZLExF5QTy2ekVi/Q== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmmirror.com/@types/scheduler/download/@types/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha1-GmL4lSVyPd4kuhsBsJK/XfitTTk= + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.npmmirror.com/@types/stack-utils/download/@types/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha1-CoUdO9lkmPolwzq3J47TvWXwbD4= + +"@types/tern@*": + version "0.23.4" + resolved "https://registry.npmmirror.com/@types/tern/download/@types/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb" + integrity sha1-A5JusT2+rzrg05DK9wayZDoBJ/s= + dependencies: + "@types/estree" "*" + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.6" + resolved "https://registry.npmmirror.com/@types/unist/download/@types/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= + +"@types/uuid@^8.3.0": + version "8.3.4" + resolved "https://registry.npmmirror.com/@types/uuid/download/@types/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + +"@types/validator@^13.1.0": + version "13.7.1" + resolved "https://registry.npmmirror.com/@types/validator/download/@types/validator-13.7.1.tgz#cdab1b4779f6b1718a08de89d92d2603b71950cb" + integrity sha512-I6OUIZ5cYRk5lp14xSOAiXjWrfVoMZVjDuevBYgQDYzZIjsf2CAISpEcXOkFAtpAHbmWIDLcZObejqny/9xq5Q== + +"@types/yargs-parser@*": + version "20.2.1" + resolved "https://registry.npmmirror.com/@types/yargs-parser/download/@types/yargs-parser-20.2.1.tgz?cache=0&sync_timestamp=1637271401361&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fyargs-parser%2Fdownload%2F%40types%2Fyargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha1-O5ziSJkZ2eT+pDm3aRarw0st8Sk= + +"@types/yargs@^13.0.0": + version "13.0.12" + resolved "https://registry.npmmirror.com/@types/yargs/download/@types/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + integrity sha1-2JWojHA7eK8EZaneiKqSxhQwsJI= + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^2.10.0": + version "2.34.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/download/@typescript-eslint/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + integrity sha1-b4zopGx96kpvHRcdK7j7rm2sK+k= + dependencies: + "@typescript-eslint/experimental-utils" "2.34.0" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.34.0": + version "2.34.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + integrity sha1-01JLZEzbQO687KZ/jPPkzJyPmA8= + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^2.10.0": + version "2.34.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/parser/download/@typescript-eslint/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + integrity sha1-UCUmMMoxloVCDpo5ygX+GFola8g= + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.34.0": + version "2.34.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + integrity sha1-FK62NTs57wcyzH8bgoUpSTfPN9U= + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/ast/download/@webassemblyjs/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha1-UbHF/mV2o0lTv0slPfnw1JDZ41k= + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha1-G6kmopI2E+3OSW/VsC6M6KX0lyE= + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha1-xJ2tIvZFInxe22EL25aX8aq3Ifc= + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha1-/qk+Qphj3V5DOFVfQikjhaZT8gQ= + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.8.5.tgz?cache=0&sync_timestamp=1625473466896&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-code-frame%2Fdownload%2F%40webassemblyjs%2Fhelper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha1-mnQP9I4/qjAisd/1RCPfmqKTwl4= + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha1-ugt9Oz9+RzPaYFnJMyJ12GBwJFI= + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha1-3vS5knsBAdyMu9jR7bW3ucguskU= + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha1-U3p1Dt31weky83RCBlUckcG5PmE= + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha1-dMpqa8vhnlCjtrRihH5pUD5r/L8= + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha1-cSMp2+8kDza/V70ve4+5v0FUQh4= + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha1-BE7es06mefPgTNT9mCTV41dnrhA= + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha1-qL87XY/+mGx8Hjc8y9wqCRXwztw= + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha1-li2hKqWswcExyBxCMpkcgs5W4Bo= + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha1-VIQHZsLBAC62TtGr5yCt7XFPmLw= + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha1-sk2fa6UDlK8TSfUQr6j/y4pj0mQ= + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha1-IVdvDsiLkUJzV7hTY4NmjvfGa40= + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha1-4Q7s1ULQ5705T2gnxJ899tTu+4w= + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.npmmirror.com/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha1-EUu8SB/RDKDiOzVg+oEnSLC65bw= + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmmirror.com/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A= + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmmirror.com/@xtuc/long/download/@xtuc/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0= + +abab@^2.0.0: + version "2.0.5" + resolved "https://registry.npmmirror.com/abab/download/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha1-wLZ4+zLWD8EhnHhNaoJv44Wut5o= + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^4.1.0, acorn-globals@^4.3.0: + version "4.3.4" + resolved "https://registry.npmmirror.com/acorn-globals/download/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha1-n6GSat3BHJcwjE5m163Q1Awycuc= + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^5.2.0: + version "5.3.2" + resolved "https://registry.npmmirror.com/acorn-jsx/download/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.npmmirror.com/acorn-walk/download/acorn-walk-6.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-walk%2Fdownload%2Facorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha1-Ejy487hMIXHx9/slJhWxx4prGow= + +acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.npmmirror.com/acorn/download/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: + version "6.4.2" + resolved "https://registry.npmmirror.com/acorn/download/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.npmmirror.com/acorn/download/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +address@1.1.2, address@^1.0.1: + version "1.1.2" + resolved "https://registry.npmmirror.com/address/download/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY= + +adjust-sourcemap-loader@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/adjust-sourcemap-loader/download/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4" + integrity sha1-ZHEUOvdewCM0shn1S8eXDFL7KaQ= + dependencies: + assert "1.4.1" + camelcase "5.0.0" + loader-utils "1.2.3" + object-path "0.11.4" + regex-parser "2.2.10" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/aggregate-error/download/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha1-kmcP9Q9TWb23o+DUDQ7DDFc3aHo= + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/ajv-errors/download/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha1-81mGrOuRr63sQQL72FAUlQzvpk0= + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmmirror.com/ajv-keywords/download/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha1-MfKdpatuANHC0yms97WSlhTVAU0= + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.9.0" + resolved "https://registry.npmmirror.com/ajv/download/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" + integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/alphanum-sort/download/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.npmmirror.com/ansi-colors/download/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha1-46PaS/uubIapwoViXeEkojQCb78= + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/ansi-escapes/download/ansi-escapes-3.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-escapes%2Fdownload%2Fansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s= + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmmirror.com/ansi-escapes/download/ansi-escapes-4.3.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-escapes%2Fdownload%2Fansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4= + dependencies: + type-fest "^0.21.3" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.npmmirror.com/ansi-html/download/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/ansi-regex/download/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/ansi-regex/download/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/ansi-regex/download/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/download/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ= + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +antd@^4.18.5: + version "4.18.5" + resolved "https://registry.npmmirror.com/antd/download/antd-4.18.5.tgz#e5ffbe238fd6fdfcd1ed39ba96e4b1bd5f589757" + integrity sha512-5fN3C2lWAzonhOYYlNpzIw2OHl7vxFZ+4cJ7DK/XZrV+75OY61Y+OkanqMJwrFtDDamIez35OM7cAezGko9tew== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons" "^4.7.0" + "@ant-design/react-slick" "~0.28.1" + "@babel/runtime" "^7.12.5" + "@ctrl/tinycolor" "^3.4.0" + classnames "^2.2.6" + copy-to-clipboard "^3.2.0" + lodash "^4.17.21" + memoize-one "^6.0.0" + moment "^2.25.3" + rc-cascader "~3.2.1" + rc-checkbox "~2.3.0" + rc-collapse "~3.1.0" + rc-dialog "~8.6.0" + rc-drawer "~4.4.2" + rc-dropdown "~3.2.0" + rc-field-form "~1.22.0-2" + rc-image "~5.2.5" + rc-input-number "~7.3.0" + rc-mentions "~1.6.1" + rc-menu "~9.2.1" + rc-motion "^2.4.4" + rc-notification "~4.5.7" + rc-pagination "~3.1.9" + rc-picker "~2.5.17" + rc-progress "~3.2.1" + rc-rate "~2.9.0" + rc-resize-observer "^1.2.0" + rc-select "~14.0.0-alpha.15" + rc-slider "~9.7.4" + rc-steps "~4.1.0" + rc-switch "~3.2.0" + rc-table "~7.22.2" + rc-tabs "~11.10.0" + rc-textarea "~0.3.0" + rc-tooltip "~5.1.1" + rc-tree "~5.4.3" + rc-tree-select "~5.1.1" + rc-trigger "^5.2.10" + rc-upload "~4.3.0" + rc-util "^5.14.0" + scroll-into-view-if-needed "^2.2.25" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/anymatch/download/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha1-vLJLTzeTTZqnrBe0ra+J58du8us= + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/anymatch/download/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha1-wFV8CWrzLxBhmPT04qODU343hxY= + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.npmmirror.com/aproba/download/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha1-aALmJk79GMeQobDVF/DyYnvyyUo= + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmmirror.com/argparse/download/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= + dependencies: + sprintf-js "~1.0.2" + +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/aria-query/download/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/arity-n/download/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/arr-diff/download/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/arr-flatten/download/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/arr-union/download/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/array-equal/download/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.npmmirror.com/array-flatten/download/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk= + +array-includes@^3.0.3, array-includes@^3.1.1: + version "3.1.4" + resolved "https://registry.npmmirror.com/array-includes/download/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha1-9bSTFix2DzU5Yx8AW6K7Rqy0W6k= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-tree-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/array-tree-filter/download/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" + integrity sha1-hzrAD+yDdJ8lWsjdCDgUtPYykZA= + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/array-union/download/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/array-union/download/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha1-t5hCCtvrHego2ErNii4j0+/oXo0= + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.npmmirror.com/array-uniq/download/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.npmmirror.com/array-unique/download/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.1: + version "1.2.5" + resolved "https://registry.npmmirror.com/array.prototype.flat/download/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" + integrity sha1-B+CXXYS7x8SM0YedYJ5oJZjTPhM= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/arrify/download/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asap@~2.0.3, asap@~2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/asap/download/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.npmmirror.com/asn1.js/download/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.npmmirror.com/asn1/download/asn1-0.2.6.tgz?cache=0&sync_timestamp=1635986760581&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fasn1%2Fdownload%2Fasn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha1-DTp7tuZOAqkMAwOzHykoaOoJoI0= + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@1.4.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/assert/download/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.npmmirror.com/assert/download/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/assign-symbols/download/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmmirror.com/ast-types-flow/download/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/astral-regex/download/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k= + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/astral-regex/download/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha1-SDFDxWeu7UeFdZwIZXhtx319LjE= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.npmmirror.com/async-each/download/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8= + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/async-limiter/download/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha1-3TeelPDbgxCwgpH51kwyCXZmF/0= + +async-validator@^4.0.2: + version "4.0.7" + resolved "https://registry.npmmirror.com/async-validator/download/async-validator-4.0.7.tgz?cache=0&sync_timestamp=1634529502627&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fasync-validator%2Fdownload%2Fasync-validator-4.0.7.tgz#034a0fd2103a6b2ebf010da75183bec299247afe" + integrity sha1-A0oP0hA6ay6/AQ2nUYO+wpkkev4= + +async@^2.6.2: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/atob/download/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= + +autoprefixer@^9.6.1, autoprefixer@^9.8.6: + version "9.8.8" + resolved "https://registry.npmmirror.com/autoprefixer/download/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + picocolors "^0.2.1" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.npmmirror.com/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.npmmirror.com/aws4/download/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk= + +axios@^0.19.0: + version "0.19.2" + resolved "https://registry.npmmirror.com/axios/download/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== + dependencies: + follow-redirects "1.5.10" + +axobject-query@^2.0.2: + version "2.2.0" + resolved "https://registry.npmmirror.com/axobject-query/download/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha1-lD1H4QwLcEqkInXiDt83ImSJib4= + +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.npmmirror.com/babel-code-frame/download/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-eslint@10.1.0: + version "10.1.0" + resolved "https://registry.npmmirror.com/babel-eslint/download/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha1-aWjlaKkQt4+zd5zdi2rC9HmUMjI= + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-extract-comments@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/babel-extract-comments/download/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + integrity sha1-Cirt+BQX7TkbheGLRhTmk6A1GiE= + dependencies: + babylon "^6.18.0" + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/babel-jest/download/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha1-P8Mny4RnuJ0U17xw4xUQSng8zVQ= + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-loader@8.1.0: + version "8.1.0" + resolved "https://registry.npmmirror.com/babel-loader/download/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha1-hP2hnJduxcbe/vV/lCez3vZuF6M= + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/babel-plugin-istanbul/download/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha1-30reg9iXqS3wacTZolzyZxKTyFQ= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/babel-plugin-jest-hoist/download/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha1-T4NwketAfgFEfIhDy+xUbQAC11Y= + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@2.8.0: + version "2.8.0" + resolved "https://registry.npmmirror.com/babel-plugin-macros/download/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha1-D5WKfMZVax5lNERl2ZERoeXhATg= + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + +babel-plugin-named-asset-import@^0.3.6: + version "0.3.8" + resolved "https://registry.npmmirror.com/babel-plugin-named-asset-import/download/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" + integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.1" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/download/babel-plugin-polyfill-corejs3-0.5.1.tgz#d66183bf10976ea677f4149a7fcc4d8df43d4060" + integrity sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.20.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/download/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.npmmirror.com/babel-plugin-syntax-object-rest-spread/download/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.npmmirror.com/babel-plugin-transform-object-rest-spread/download/babel-plugin-transform-object-rest-spread-6.26.0.tgz?cache=0&sync_timestamp=1624608042865&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-plugin-transform-object-rest-spread%2Fdownload%2Fbabel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-remove-prop-types@0.4.24: + version "0.4.24" + resolved "https://registry.npmmirror.com/babel-plugin-transform-react-remove-prop-types/download/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha1-8u2vm0xqX75cHWeL+1MQeMFVXzo= + +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/babel-preset-jest/download/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha1-GStSHiIX+x0fZ89z9wwzZlCtPNw= + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + +babel-preset-react-app@^9.1.2: + version "9.1.2" + resolved "https://registry.npmmirror.com/babel-preset-react-app/download/babel-preset-react-app-9.1.2.tgz#54775d976588a8a6d1a99201a702befecaf48030" + integrity sha1-VHddl2WIqKbRqZIBpwK+/sr0gDA= + dependencies: + "@babel/core" "7.9.0" + "@babel/plugin-proposal-class-properties" "7.8.3" + "@babel/plugin-proposal-decorators" "7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "7.8.3" + "@babel/plugin-proposal-numeric-separator" "7.8.3" + "@babel/plugin-proposal-optional-chaining" "7.9.0" + "@babel/plugin-transform-flow-strip-types" "7.9.0" + "@babel/plugin-transform-react-display-name" "7.8.3" + "@babel/plugin-transform-runtime" "7.9.0" + "@babel/preset-env" "7.9.0" + "@babel/preset-react" "7.9.1" + "@babel/preset-typescript" "7.9.0" + "@babel/runtime" "7.9.0" + babel-plugin-macros "2.8.0" + babel-plugin-transform-react-remove-prop-types "0.4.24" + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.npmmirror.com/babel-runtime/download/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.npmmirror.com/babylon/download/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha1-ry87iPpvXB5MY00aD46sT1WzleM= + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.npmmirror.com/bail/download/bail-1.0.5.tgz?cache=0&sync_timestamp=1636274807479&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbail%2Fdownload%2Fbail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha1-tvoTNASjksvB+MS/Y/WVM1Hnp3Y= + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/balanced-match/download/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= + +balanced-match@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/balanced-match/download/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" + integrity sha1-3HD5INeNuLhYU1eVhnv0j4IGM9k= + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/base16/download/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.npmmirror.com/base64-js/download/base64-js-1.5.1.tgz?cache=0&sync_timestamp=1624607950711&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbase64-js%2Fdownload%2Fbase64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha1-GxtEAWClv3rUC2UPCVljSBkDkwo= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.npmmirror.com/base/download/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha1-e95c7RRbbVUakNuH+DxVi060io8= + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmmirror.com/batch/download/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmmirror.com/big.js/download/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg= + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.npmmirror.com/binary-extensions/download/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U= + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/binary-extensions/download/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0= + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.npmmirror.com/bindings/download/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha1-EDU8npRTNLwFEabZCzj7x8nFBN8= + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.npmmirror.com/bluebird/download/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28= + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmmirror.com/bn.js/download/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha1-d1s/J477uXGO7HNh9IP7Nvu/6og= + +bn.js@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/bn.js/download/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha1-NYhgZ0OWxpl3canQUfzBtX1K4AI= + +bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.npmmirror.com/bonjour/download/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/boolbase/download/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmmirror.com/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.npmmirror.com/braces/download/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha1-WXn9PxTNUxVl5fot8av/8d+u5yk= + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc= + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/brorand/download/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/browser-process-hrtime/download/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha1-PJtLfXgsgSHlbxAQbYTA0P/JRiY= + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.npmmirror.com/browser-resolve/download/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha1-m3y7PQ9RDky4a9vXlhJNKLWJCvY= + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.npmmirror.com/browserify-aes/download/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha1-Mmc0ZC9APavDADIJhTu3CtQo70g= + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/browserify-cipher/download/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha1-jWR0wbhwv9q807z8wZNKEOlPFfA= + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/browserify-des/download/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw= + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/browserify-rsa/download/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha1-sv0Gtbda4pf3zi3GUfkY9b4VjI0= + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" + integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== + dependencies: + bn.js "^5.2.1" + browserify-rsa "^4.1.0" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.4" + inherits "^2.0.4" + parse-asn1 "^5.1.6" + readable-stream "^3.6.2" + safe-buffer "^5.2.1" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/browserify-zlib/download/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha1-KGlFnZqjviRf6P4sofRuLn9U1z8= + dependencies: + pako "~1.0.5" + +browserslist@4.10.0: + version "4.10.0" + resolved "https://registry.npmmirror.com/browserslist/download/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== + dependencies: + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.378" + node-releases "^1.1.52" + pkg-up "^3.1.0" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.5, browserslist@^4.19.1, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.9.1: + version "4.19.1" + resolved "https://registry.npmmirror.com/browserslist/download/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/bser/download/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha1-5nh9og7OnQeZhTPP2d5vXDj0vAU= + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/buffer-indexof/download/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow= + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/buffer-xor/download/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.npmmirror.com/buffer/download/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/bytes/download/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.npmmirror.com/cacache/download/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw= + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^13.0.1: + version "13.0.1" + resolved "https://registry.npmmirror.com/cacache/download/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha1-qAAMIWlwiQgvhSh6GuxuOCAkpxw= + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/cache-base/download/cache-base-1.0.1.tgz?cache=0&sync_timestamp=1636237308360&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcache-base%2Fdownload%2Fcache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha1-Cn9GQWgxyLZi7jb+TnxZ129marI= + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/call-bind/download/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw= + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/call-me-maybe/download/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/caller-callsite/download/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/caller-path/download/caller-path-2.0.0.tgz?cache=0&sync_timestamp=1633674944097&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcaller-path%2Fdownload%2Fcaller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/callsites/download/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/callsites/download/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M= + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.npmmirror.com/camel-case/download/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha1-lygHKpVPgFIoIlpt7qazhGHhvVo= + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.npmmirror.com/camelcase-keys/download/camelcase-keys-6.2.2.tgz?cache=0&sync_timestamp=1633332938539&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase-keys%2Fdownload%2Fcamelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha1-XnVda6UaoiPsfT1S8ld4IQ+dw8A= + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/camelcase/download/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmmirror.com/camelcase/download/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/caniuse-api/download/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA= + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001286: + version "1.0.30001303" + resolved "https://registry.npmmirror.com/caniuse-lite/download/caniuse-lite-1.0.30001303.tgz#9b168e4f43ccfc372b86f4bc5a551d9b909c95c9" + integrity sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/capture-exit/download/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha1-+5U7+uvreB9iiYI52rtCbQilCaQ= + dependencies: + rsvp "^4.8.4" + +case-sensitive-paths-webpack-plugin@2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + integrity sha1-I6xhPMmoVuT4j/i7c7u16YmCXPc= + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmmirror.com/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmmirror.com/chalk/download/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/download/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.npmmirror.com/character-entities-legacy/download/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha1-lLwYRdznClu50uzHSHJWYSk9j8E= + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.npmmirror.com/character-entities/download/character-entities-1.2.4.tgz?cache=0&sync_timestamp=1635868846406&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcharacter-entities%2Fdownload%2Fcharacter-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha1-4Sw5Obfq9OWxXnrUxeKOHUjFsWs= + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.npmmirror.com/character-reference-invalid/download/character-reference-invalid-1.1.4.tgz?cache=0&sync_timestamp=1636446259053&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcharacter-reference-invalid%2Fdownload%2Fcharacter-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha1-CDMpzaDq4nKrPbvzfpo4LBOvFWA= + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmmirror.com/chardet/download/chardet-0.7.0.tgz?cache=0&sync_timestamp=1634639163489&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fchardet%2Fdownload%2Fchardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.npmmirror.com/chokidar/download/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.3.0, chokidar@^3.4.1: + version "3.5.3" + resolved "https://registry.npmmirror.com/chokidar/download/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1, chownr@^1.1.2: + version "1.1.4" + resolved "https://registry.npmmirror.com/chownr/download/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs= + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/chrome-trace-event/download/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw= + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ci-info/download/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y= + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/cipher-base/download/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.npmmirror.com/class-utils/download/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha1-+TNprouafOAv1B+q0MqDAzGQxGM= + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@*, classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/classnames/download/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +clean-css@^4.2.3: + version "4.2.4" + resolved "https://registry.npmmirror.com/clean-css/download/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" + integrity sha1-czv0brpOYHxokepXwkqYk1aDEXg= + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/clean-stack/download/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha1-7oRy27Ep5yezHooQpCfe6d/kAIs= + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/cli-cursor/download/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha1-JkMFp65JDR0Dvwybp8kl0XU68wc= + dependencies: + restore-cursor "^3.1.0" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.npmmirror.com/cli-width/download/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha1-sEM9C06chH7xiGik7xb9X8gnHEg= + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/cli-width/download/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha1-ovSEN6LKqaIkNueUvwceyeYc7fY= + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/cliui/download/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha1-NIQi2+gtgAswIu709qwQvy5NG0k= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/cliui/download/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U= + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-deep@^0.2.4: + version "0.2.4" + resolved "https://registry.npmmirror.com/clone-deep/download/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" + integrity sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY= + dependencies: + for-own "^0.1.3" + is-plain-object "^2.0.1" + kind-of "^3.0.2" + lazy-cache "^1.0.3" + shallow-clone "^0.1.2" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/clone-deep/download/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c= + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-regexp@^2.1.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/clone-regexp/download/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" + integrity sha1-fWXgCIXNh5ZAXDWnN+eoa3Qp428= + dependencies: + is-regexp "^2.0.0" + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.npmmirror.com/clone/download/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmmirror.com/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/coa/download/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM= + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +codemirror@^5.55.0: + version "5.65.1" + resolved "https://registry.npmmirror.com/codemirror/download/codemirror-5.65.1.tgz#5988a812c974c467f964bcc1a00c944e373de502" + integrity sha512-s6aac+DD+4O2u1aBmdxhB7yz2XU7tG3snOyQ05Kxifahz7hoxnfxIRHxiCSEv3TUC38dIVH8G+lZH9UWSfGQxA== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/collection-visit/download/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.npmmirror.com/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/color-convert/download/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM= + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/download/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI= + +color-string@^1.6.0: + version "1.9.0" + resolved "https://registry.npmmirror.com/color-string/download/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" + integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.2.1" + resolved "https://registry.npmmirror.com/color/download/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.npmmirror.com/combined-stream/download/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= + dependencies: + delayed-stream "~1.0.0" + +commander@^2.11.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmmirror.com/commander/download/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/commander/download/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.npmmirror.com/common-tags/download/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/commondir/download/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.npmmirror.com/component-emitter/download/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= + +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/compose-function/download/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmmirror.com/compressible/download/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o= + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmmirror.com/compression/download/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48= + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-scroll-into-view@^1.0.17: + version "1.0.17" + resolved "https://registry.npmmirror.com/compute-scroll-into-view/download/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" + integrity sha1-aojxis2dQunPS6pr7H4FImB6t6s= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.npmmirror.com/concat-stream/download/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ= + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +confusing-browser-globals@^1.0.9: + version "1.0.11" + resolved "https://registry.npmmirror.com/confusing-browser-globals/download/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.npmmirror.com/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w= + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/console-browserify/download/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha1-ZwY871fOts9Jk6KrOlWECujEkzY= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/constants-browserify/download/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/contains-path/download/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@1.7.0: + version "1.7.0" + resolved "https://registry.npmmirror.com/convert-source-map/download/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI= + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.npmmirror.com/convert-source-map/download/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + +convert-source-map@^1.4.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmmirror.com/convert-source-map/download/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k= + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + +copy-anything@^2.0.1: + version "2.0.6" + resolved "https://registry.npmmirror.com/copy-anything/download/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" + integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== + dependencies: + is-what "^3.14.1" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.npmmirror.com/copy-concurrently/download/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha1-kilzmMrjSTf8r9bsgTnBgFHwteA= + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.npmmirror.com/copy-descriptor/download/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-to-clipboard@^3.2.0: + version "3.3.1" + resolved "https://registry.npmmirror.com/copy-to-clipboard/download/copy-to-clipboard-3.3.1.tgz?cache=0&sync_timestamp=1624607975240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcopy-to-clipboard%2Fdownload%2Fcopy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity sha1-EVqhqZmP+rYZb5MHatbaO5E2Yq4= + dependencies: + toggle-selection "^1.0.6" + +core-js-compat@^3.20.0, core-js-compat@^3.20.2, core-js-compat@^3.6.2: + version "3.20.3" + resolved "https://registry.npmmirror.com/core-js-compat/download/core-js-compat-3.20.3.tgz#d71f85f94eb5e4bea3407412e549daa083d23bd6" + integrity sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw== + dependencies: + browserslist "^4.19.1" + semver "7.0.0" + +core-js-pure@^3.20.2: + version "3.20.3" + resolved "https://registry.npmmirror.com/core-js-pure/download/core-js-pure-3.20.3.tgz#6cc4f36da06c61d95254efc54024fe4797fd5d02" + integrity sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA== + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.npmmirror.com/core-js/download/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-js@^3.5.0: + version "3.20.3" + resolved "https://registry.npmmirror.com/core-js/download/core-js-3.20.3.tgz#c710d0a676e684522f3db4ee84e5e18a9d11d69a" + integrity sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmmirror.com/core-util-is/download/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U= + +cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: + version "5.2.1" + resolved "https://registry.npmmirror.com/cosmiconfig/download/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha1-BA9yaAnFked6F8CjYmykW08Wixo= + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/cosmiconfig/download/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha1-2k/uhTxS9rHmk19BwaL8UL1KmYI= + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.npmmirror.com/cosmiconfig/download/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha1-cU11ZSLKzoZ4Z8y0R0xdAbuuXW0= + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.npmmirror.com/create-ecdh/download/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha1-1uf0v/pmc2CFoHYv06YyaE2rzE4= + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/create-hash/download/create-hash-1.2.0.tgz?cache=0&sync_timestamp=1624607951398&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcreate-hash%2Fdownload%2Fcreate-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY= + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.npmmirror.com/create-hmac/download/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8= + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-fetch@^3.0.4: + version "3.1.5" + resolved "https://registry.npmmirror.com/cross-fetch/download/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/cross-spawn/download/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha1-CrVihuD3wk4VPQTMKqAn5DqaXRQ= + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.npmmirror.com/cross-spawn/download/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q= + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.npmmirror.com/crypto-browserify/download/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha1-OWz58xN/A+S45TLFj2mCVOAPgOw= + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/css-blank-pseudo/download/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha1-3979MlS/ioICeZNnTM81SDv8s8U= + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.npmmirror.com/css-color-names/download/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/css-declaration-sorter/download/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha1-wZiUD2OnbX42wecQGLABchBUyyI= + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.npmmirror.com/css-has-pseudo/download/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha1-PGQqs0yiQsWcQaEl35EFhB9pZu4= + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@3.4.2: + version "3.4.2" + resolved "https://registry.npmmirror.com/css-loader/download/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" + integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.23" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.1.1" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.2" + schema-utils "^2.6.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/css-prefers-color-scheme/download/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha1-b4MKJxQZnU8NDQu4onkW7WXP8fQ= + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/css-select-base-adapter/download/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc= + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/css-select/download/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha1-ajRlM1ZjWTSoG6ymjQJVQyEF2+8= + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.2.1" + resolved "https://registry.npmmirror.com/css-select/download/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" + integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== + dependencies: + boolbase "^1.0.0" + css-what "^5.1.0" + domhandler "^4.3.0" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.npmmirror.com/css-tree/download/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha1-mL69YsTB2flg7DQM+fdSLjBwmiI= + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.npmmirror.com/css-tree/download/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha1-60hw+2/XcHMn7JXC/yqwm16NuR0= + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.npmmirror.com/css-what/download/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha1-6nAm/LAXd+295SEk4h8yfnrpUOQ= + +css-what@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/css-what/download/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity sha1-P3tweq32M7r2LCzrhXm1RbtA9/4= + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.npmmirror.com/css/download/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk= + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.npmmirror.com/cssdb/download/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha1-O/LypowQ9cagir2SN4Mx7oA83bA= + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/cssesc/download/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha1-OxO9G7HLNuG8taTc0n9UxdyzVwM= + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/cssesc/download/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4= + +cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.npmmirror.com/cssnano-preset-default/download/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha1-kgYisfwelaNOiDggPxOXpQTy0/8= + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.3" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/cssnano-util-get-arguments/download/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/cssnano-util-get-match/download/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/cssnano-util-raw-cache/download/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI= + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/cssnano-util-same-parent/download/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M= + +cssnano@^4.1.10: + version "4.1.11" + resolved "https://registry.npmmirror.com/cssnano/download/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.8" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.npmmirror.com/csso/download/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: + version "0.3.8" + resolved "https://registry.npmmirror.com/cssom/download/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha1-nxJ29bK0Y/IRTT8sdSUK+MGjb0o= + +cssstyle@^1.0.0, cssstyle@^1.1.1: + version "1.4.0" + resolved "https://registry.npmmirror.com/cssstyle/download/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha1-nTEyginTxWXGHlhrAgQaKPzNzPE= + dependencies: + cssom "0.3.x" + +csstype@^3.0.2: + version "3.0.10" + resolved "https://registry.npmmirror.com/csstype/download/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== + +customize-cra@^0.9.1: + version "0.9.1" + resolved "https://registry.npmmirror.com/customize-cra/download/customize-cra-0.9.1.tgz#76b42c4f537c16329eccc09cfefd804d04c81550" + integrity sha1-drQsT1N8FjKezMCc/v2ATQTIFVA= + dependencies: + lodash.flow "^3.5.0" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/cyclist/download/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/d/download/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.4: + version "1.0.8" + resolved "https://registry.npmmirror.com/damerau-levenshtein/download/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.npmmirror.com/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0, data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/data-urls/download/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha1-Fe4Fgrql4iu1nHcUDaj5x2lju/4= + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +date-fns@2.x: + version "2.28.0" + resolved "https://registry.npmmirror.com/date-fns/download/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" + integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + +dayjs@1.x: + version "1.10.7" + resolved "https://registry.npmmirror.com/dayjs/download/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" + integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/debug/download/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.1, debug@^3.2.5, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.3" + resolved "https://registry.npmmirror.com/debug/download/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/decamelize-keys/download/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +deep-equal@^1.0.1, deep-equal@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/deep-equal/download/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o= + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.npmmirror.com/deep-is/download/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE= + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/default-gateway/download/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs= + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/define-properties/download/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE= + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.npmmirror.com/define-property/download/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/define-property/download/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/define-property/download/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha1-1Flono1lS6d+AqgX+HENcCyxbp0= + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/del/download/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/des.js/download/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/detect-newline/download/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmmirror.com/detect-node/download/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha1-yccHdaScPQO8LAbZpzvlUPl4+LE= + +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.npmmirror.com/detect-port-alt/download/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha1-JHB96r6TLUo89iEwICfCsmZWgnU= + dependencies: + address "^1.0.1" + debug "^2.6.0" + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/diff-sequences/download/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha1-VxXWJE4qpl9Iu6C8ly2wsLEelbU= + +diff-sequences@^27.4.0: + version "27.4.0" + resolved "https://registry.npmmirror.com/diff-sequences/download/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5" + integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.npmmirror.com/diffie-hellman/download/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha1-QOjumPVaIUlgcUaSHGPhrl89KHU= + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/dir-glob/download/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha1-CyBdK2rvmCOMooZZioIE0p0KADQ= + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/dir-glob/download/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8= + dependencies: + path-type "^4.0.0" + +dnd-core@^11.1.3: + version "11.1.3" + resolved "https://registry.npmmirror.com/dnd-core/download/dnd-core-11.1.3.tgz#f92099ba7245e49729d2433157031a6267afcc98" + integrity sha1-+SCZunJF5Jcp0kMxVwMaYmevzJg= + dependencies: + "@react-dnd/asap" "^4.0.0" + "@react-dnd/invariant" "^2.0.0" + redux "^4.0.4" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/dns-equal/download/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.npmmirror.com/dns-packet/download/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha1-40VQZYJKJQe6iGxVqJljuxB97G8= + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/dns-txt/download/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.npmmirror.com/doctrine/download/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/doctrine/download/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha1-XNAfwQFiG0LEzX9dGmYkNxbT850= + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/doctrine/download/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha1-rd6+rXKmV023g2OdyHoSF3OXOWE= + dependencies: + esutils "^2.0.2" + +dom-align@^1.7.0: + version "1.12.2" + resolved "https://registry.npmmirror.com/dom-align/download/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" + integrity sha1-D4Fk69DJwhsMeQMQSTzYVYkqzUs= + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/dom-converter/download/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g= + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.npmmirror.com/dom-serializer/download/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E= + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.npmmirror.com/dom-serializer/download/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha1-YgZDfTLO767HFhgDIwx6ILwbTZE= + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.npmmirror.com/domain-browser/download/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto= + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.npmmirror.com/domelementtype/download/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8= + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/domelementtype/download/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc= + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/domexception/download/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha1-k3RCZEymoxJh7zbj7Gd/6AVYLJA= + dependencies: + webidl-conversions "^4.0.2" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.npmmirror.com/domhandler/download/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha1-iAUJfpM9ZehVRvcm1g9euItE+AM= + dependencies: + domelementtype "1" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/domhandler/download/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" + integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== + dependencies: + domelementtype "^2.2.0" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.npmmirror.com/domutils/download/domutils-1.7.0.tgz?cache=0&sync_timestamp=1630106606599&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.npmmirror.com/domutils/download/domutils-2.8.0.tgz?cache=0&sync_timestamp=1630106606599&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU= + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/dot-case/download/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha1-mytnDQCkMWZ6inW6Kc0bmICc51E= + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/dot-prop/download/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog= + dependencies: + is-obj "^2.0.0" + +dotenv-expand@5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/dotenv-expand/download/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha1-P7rwIL/XlIhAcuomsel5HUWmKfA= + +dotenv@8.2.0: + version "8.2.0" + resolved "https://registry.npmmirror.com/dotenv/download/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.npmmirror.com/duplexer/download/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.npmmirror.com/duplexify/download/duplexify-3.7.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fduplexify%2Fdownload%2Fduplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk= + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.npmmirror.com/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.3.378, electron-to-chromium@^1.4.17: + version "1.4.56" + resolved "https://registry.npmmirror.com/electron-to-chromium/download/electron-to-chromium-1.4.56.tgz#f660fd2c6739b341d8922fe3a441a5a2804911a1" + integrity sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g== + +elliptic@^6.5.3, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.npmmirror.com/elliptic/download/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha1-2jfOvTHnmhNn6UG1ku0fvr1Yq7s= + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^7.0.1, emoji-regex@^7.0.2: + version "7.0.3" + resolved "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc= + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/emojis-list/download/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/emojis-list/download/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha1-VXBmIEatKeLpFucariYKvf9Pang= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmmirror.com/end-of-stream/download/end-of-stream-1.4.4.tgz?cache=0&sync_timestamp=1624607958717&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fend-of-stream%2Fdownload%2Fend-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha1-WuZKX0UFe682JuwU2gyl5LJDHrA= + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.1.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/enhanced-resolve/download/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha1-Lzz9hNvjtIfxjy2y7x4GSlccpew= + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.npmmirror.com/entities/download/entities-1.1.2.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha1-vfpzUplmTfr9NFKe1PhSKidf6lY= + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU= + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.npmmirror.com/errno/download/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8= + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmmirror.com/error-ex/download/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.npmmirror.com/es-abstract/download/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha1-1IhXlodpFpWd547aoN9FZicRXsM= + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/es-to-primitive/download/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo= + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@~0.10.14: + version "0.10.63" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.63.tgz#9c222a63b6a332ac80b1e373b426af723b895bd6" + integrity sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + esniff "^2.0.1" + next-tick "^1.1.0" + +es6-iterator@2.0.3, es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.npmmirror.com/es6-iterator/download/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.npmmirror.com/es6-symbol/download/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha1-utXTwbzawoJp9MszHkMceKxwXRg= + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/escalade/download/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA= + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/escape-string-regexp/download/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha1-owME6Z2qMuI7L9IPUbq9B8/8o0Q= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.11.0, escodegen@^1.9.1: + version "1.14.3" + resolved "https://registry.npmmirror.com/escodegen/download/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha1-TnuB+6YVgdyXWC7XjKt/Do1j9QM= + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-react-app@^5.2.1: + version "5.2.1" + resolved "https://registry.npmmirror.com/eslint-config-react-app/download/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df" + integrity sha1-aYv3ru4n8M6gE56u8mHHv33WI98= + dependencies: + confusing-browser-globals "^1.0.9" + +eslint-import-resolver-node@^0.3.2: + version "0.3.6" + resolved "https://registry.npmmirror.com/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha1-QEi5WDldqJZoJSAB29nsprg7rL0= + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-loader@3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/eslint-loader/download/eslint-loader-3.0.3.tgz#e018e3d2722381d982b1201adb56819c73b480ca" + integrity sha1-4Bjj0nIjgdmCsSAa21aBnHO0gMo= + dependencies: + fs-extra "^8.1.0" + loader-fs-cache "^1.0.2" + loader-utils "^1.2.3" + object-hash "^2.0.1" + schema-utils "^2.6.1" + +eslint-module-utils@^2.4.1: + version "2.7.3" + resolved "https://registry.npmmirror.com/eslint-module-utils/download/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" + integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + dependencies: + debug "^3.2.7" + find-up "^2.1.0" + +eslint-plugin-flowtype@4.6.0: + version "4.6.0" + resolved "https://registry.npmmirror.com/eslint-plugin-flowtype/download/eslint-plugin-flowtype-4.6.0.tgz#82b2bd6f21770e0e5deede0228e456cb35308451" + integrity sha1-grK9byF3Dg5d7t4CKORWyzUwhFE= + dependencies: + lodash "^4.17.15" + +eslint-plugin-import@2.20.1: + version "2.20.1" + resolved "https://registry.npmmirror.com/eslint-plugin-import/download/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3" + integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.1" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.12.0" + +eslint-plugin-jsx-a11y@6.2.3: + version "6.2.3" + resolved "https://registry.npmmirror.com/eslint-plugin-jsx-a11y/download/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" + integrity sha1-uHKgnV3lGvcKl9se6n3JMwQ3CKo= + dependencies: + "@babel/runtime" "^7.4.5" + aria-query "^3.0.0" + array-includes "^3.0.3" + ast-types-flow "^0.0.7" + axobject-query "^2.0.2" + damerau-levenshtein "^1.0.4" + emoji-regex "^7.0.2" + has "^1.0.3" + jsx-ast-utils "^2.2.1" + +eslint-plugin-react-hooks@^1.6.1: + version "1.7.0" + resolved "https://registry.npmmirror.com/eslint-plugin-react-hooks/download/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04" + integrity sha1-YhC21aNyBfC5KFj4laToJwIKfQQ= + +eslint-plugin-react@7.19.0: + version "7.19.0" + resolved "https://registry.npmmirror.com/eslint-plugin-react/download/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666" + integrity sha1-bQj5ZzYoqmnFVZ0zSJ6FXYNVFmY= + dependencies: + array-includes "^3.1.1" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.2.3" + object.entries "^1.1.1" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.15.1" + semver "^6.3.0" + string.prototype.matchall "^4.0.2" + xregexp "^4.3.0" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/eslint-scope/download/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha1-ygODMxD2iJoyZHgaqC5j65z+eEg= + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0: + version "5.1.1" + resolved "https://registry.npmmirror.com/eslint-scope/download/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw= + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.npmmirror.com/eslint-utils/download/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha1-dP7HxU0Hdrb2fgJRBAtYBlZOmB8= + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/eslint-utils/download/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc= + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha1-MOvR73wv3/AcOk8VEESvJfqwUj4= + +eslint@^6.6.0: + version "6.8.0" + resolved "https://registry.npmmirror.com/eslint/download/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +esniff@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" + integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + event-emitter "^0.3.5" + type "^2.7.2" + +espree@^6.1.2: + version "6.2.1" + resolved "https://registry.npmmirror.com/espree/download/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o= + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/esprima/download/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= + +esquery@^1.0.1: + version "1.4.0" + resolved "https://registry.npmmirror.com/esquery/download/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha1-IUj/w4uC6McFff7UhCWz5h8PJKU= + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/esrecurse/download/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha1-eteWTWeauyi+5yzsY3WLHF0smSE= + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/estraverse/download/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/estraverse/download/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha1-LupSkHAvJquP5TcDcP+GyWXSESM= + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmmirror.com/esutils/download/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmmirror.com/eventemitter3/download/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/events/download/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA= + +eventsource@^1.0.7: + version "1.1.0" + resolved "https://registry.npmmirror.com/eventsource/download/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI= + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.npmmirror.com/exec-sh/download/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha1-/yZPnjJVGaYMteJzaSlDSDzKY7w= + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/execa/download/execa-1.0.0.tgz?cache=0&sync_timestamp=1637147199964&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fexeca%2Fdownload%2Fexeca-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg= + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execall@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/execall/download/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" + integrity sha1-FqBrX+UJnffQC+XZwG7s3tFmO0U= + dependencies: + clone-regexp "^2.1.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/exit/download/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.npmmirror.com/expand-brackets/download/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/expect/download/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha1-t1FltIFwdPpKFXeU9G/p8boVtso= + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +express@^4.17.1: + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.2" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.6.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.6.0" + resolved "https://registry.npmmirror.com/ext/download/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + integrity sha1-OHHVBkHodMwXLitT+RmELRnbTFI= + dependencies: + type "^2.5.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/extend-shallow/download/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/extend-shallow/download/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.npmmirror.com/external-editor/download/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha1-ywP3QL764D6k0oPK7SdBqD8zVJU= + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/extglob/download/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM= + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/extsprintf/download/extsprintf-1.3.0.tgz?cache=0&sync_timestamp=1635889863507&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fextsprintf%2Fdownload%2Fextsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmmirror.com/extsprintf/download/extsprintf-1.4.1.tgz?cache=0&sync_timestamp=1635889863507&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fextsprintf%2Fdownload%2Fextsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha1-jRcsBkhn8jXAyEpZaAbSeb9LzAc= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.npmmirror.com/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU= + +fast-glob@^2.0.2: + version "2.2.7" + resolved "https://registry.npmmirror.com/fast-glob/download/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha1-aVOFfDr6R1//ku5gFdUtpwpM050= + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-glob@^3.2.5, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmmirror.com/fast-glob/download/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.npmmirror.com/fastest-levenshtein/download/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha1-mZD306iMxan/0fF0V0UlFwDUl+I= + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmmirror.com/fastq/download/fastq-1.13.0.tgz?cache=0&sync_timestamp=1631609698424&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffastq%2Fdownload%2Ffastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha1-YWdg+Ip1Jr38WWt8q4wYk4w2uYw= + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.npmmirror.com/faye-websocket/download/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.4" + resolved "https://registry.npmmirror.com/faye-websocket/download/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha1-fw2Sdc/dhqHJY9yLZfzEUe3Lsdo= + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/fb-watchman/download/fb-watchman-2.0.1.tgz?cache=0&sync_timestamp=1624607942135&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffb-watchman%2Fdownload%2Ffb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha1-/IT7OdJwnPP/bXQ3BhV7tXCKioU= + dependencies: + bser "2.1.1" + +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/fbemitter/download/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha1-ALKhr1QRJUqrQWzXX55iib7kv/M= + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/fbjs-css-vars/download/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha1-IWVRE2rgL+JVkyw+yHdfGOLAeLg= + +fbjs@^3.0.0, fbjs@^3.0.1: + version "3.0.2" + resolved "https://registry.npmmirror.com/fbjs/download/fbjs-3.0.2.tgz#dfae08a85c66a58372993ce2caf30863f569ff94" + integrity sha512-qv+boqYndjElAJHNN3NoM8XuwQZ1j2m3kEvTgdle8IDjr6oUbkEpvABWtj/rQl3vq4ew7dnElBxL4YJAwTVqQQ== + dependencies: + cross-fetch "^3.0.4" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.npmmirror.com/figgy-pudding/download/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4= + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/figures/download/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/file-entry-cache/download/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w= + dependencies: + flat-cache "^2.0.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/file-entry-cache/download/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha1-IRst2WWcsDlLBz5zI6w8kz1SICc= + dependencies: + flat-cache "^3.0.4" + +file-loader@4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/file-loader/download/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.0" + +file-saver@^2.0.2: + version "2.0.5" + resolved "https://registry.npmmirror.com/file-saver/download/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90= + +filesize@6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/filesize/download/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" + integrity sha1-+FC1CZCcfIb35FDqGQBsMcLtPS8= + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/fill-range/download/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha1-GRmmp8df44ssfHflGYU12prN2kA= + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/find-cache-dir/download/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/find-cache-dir/download/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc= + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.2.0: + version "3.3.2" + resolved "https://registry.npmmirror.com/find-cache-dir/download/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha1-swxbbv8HMHMa6pu9nb7L2AJW1ks= + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/find-up/download/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/find-up/download/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/find-up/download/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/find-up/download/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha1-SRafHXmTQwZG2mHsxa41XCHJe3M= + dependencies: + locate-path "^3.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/flat-cache/download/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA= + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/flat-cache/download/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE= + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.npmmirror.com/flatted/download/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha1-RXWyHivO50NKqb5mL0t7X5wrUTg= + +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.npmmirror.com/flatted/download/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/flatten/download/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha1-wSg6yfJ7Noq8HjbR/3sEUBowNWs= + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/flush-write-stream/download/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug= + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +flux@^4.0.1: + version "4.0.3" + resolved "https://registry.npmmirror.com/flux/download/flux-4.0.3.tgz#573b504a24982c4768fdfb59d8d2ea5637d72ee7" + integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.1" + +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.npmmirror.com/follow-redirects/download/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio= + dependencies: + debug "=3.1.0" + +follow-redirects@^1.0.0: + version "1.14.7" + resolved "https://registry.npmmirror.com/follow-redirects/download/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" + integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmmirror.com/for-each/download/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha1-abRH6IoKXTLD5whPPxcQA0shN24= + dependencies: + is-callable "^1.1.3" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.npmmirror.com/for-in/download/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/for-in/download/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.3: + version "0.1.5" + resolved "https://registry.npmmirror.com/for-own/download/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.npmmirror.com/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +fork-ts-checker-webpack-plugin@3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/fork-ts-checker-webpack-plugin/download/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + integrity sha1-oWQsDT5l9QwswXQunAqA9EH4axk= + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^3.3.0" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.npmmirror.com/form-data/download/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/fragment-cache/download/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +framer-motion@^2.1.2: + version "2.9.5" + resolved "https://registry.npmmirror.com/framer-motion/download/framer-motion-2.9.5.tgz#bbb185325d531c57f494cf3f6cf7719fc2c225c7" + integrity sha1-u7GFMl1THFf0lM8/bPdxn8LCJcc= + dependencies: + framesync "^4.1.0" + hey-listen "^1.0.8" + popmotion "9.0.0-rc.20" + style-value-types "^3.1.9" + tslib "^1.10.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + +framesync@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/framesync/download/framesync-4.1.0.tgz#69a8db3ca432dc70d6a76ba882684a1497ef068a" + integrity sha1-aajbPKQy3HDWp2uogmhKFJfvBoo= + dependencies: + hey-listen "^1.0.5" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/from2/download/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.npmmirror.com/fs-extra/download/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.npmmirror.com/fs-extra/download/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha1-TxicRKoSO4lfcigE9V6iPq3DSOk= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.npmmirror.com/fs-extra/download/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA= + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/fs-minipass/download/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs= + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.npmmirror.com/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/fsevents/download/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha1-TAofs0vGjlQ7S4Kp7Dkr+9qECAU= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.npmmirror.com/fsevents/download/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg= + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmmirror.com/fsevents/download/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro= + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmmirror.com/gensync/download/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA= + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.npmmirror.com/get-caller-file/download/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o= + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.npmmirror.com/get-caller-file/download/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= + +get-intrinsic@^1.0.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y= + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npmmirror.com/get-own-enumerable-property-symbols/download/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha1-tf3nfyLL4185C04ImSLFC85u9mQ= + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.npmmirror.com/get-stdin/download/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha1-y61qc/63X27rIrqeAfiaooqpelM= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/get-stream/download/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha1-wbJVV189wh1Zv8ec09K0axw6VLU= + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/get-symbol-description/download/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha1-f9uByQAQH71WTdXxowr1qtweWNY= + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/get-value/download/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.npmmirror.com/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/glob-parent/download/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ= + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.npmmirror.com/glob/download/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + 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" + +global-modules@2.0.0, global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/global-modules/download/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha1-mXYFrSNF8n9RU5vqJldEISFcd4A= + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/global-prefix/download/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha1-/IX3MGTfafUEIfR/iD/luRO6m5c= + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmmirror.com/globals/download/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4= + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.npmmirror.com/globals/download/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha1-oYgTV2pBsAokqX5/gVkYwuGZJfg= + dependencies: + type-fest "^0.8.1" + +globby@8.0.2: + version "8.0.2" + resolved "https://registry.npmmirror.com/globby/download/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha1-VpdhnM2VxSdduy1vqkIIfBqUHY0= + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globby@^11.0.3: + version "11.1.0" + resolved "https://registry.npmmirror.com/globby/download/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/globby/download/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/globjoin/download/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= + +gonzales-pe@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/gonzales-pe/download/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha1-/p3sXzxVfurQn/hoxlgmvlTQZ7M= + dependencies: + minimist "^1.2.5" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: + version "4.2.9" + resolved "https://registry.npmmirror.com/graceful-fs/download/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/growly/download/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/gud/download/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha1-pIlYGxfmpwvsqavjrlfeekmYUsA= + +gzip-size@5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/gzip-size/download/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha1-y5vuaS+HwGErIyhAqHOQTkwTUnQ= + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/handle-thing/download/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha1-hX95zjWVgMNA1DCBzGSJcNC7I04= + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.npmmirror.com/har-validator/download/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha1-HwgDufjLIMD6E4It8ezds2veHv0= + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/hard-rejection/download/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha1-HG7aXBaFxjlCdm15u0Cudzzs2IM= + +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.npmmirror.com/harmony-reflect/download/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha1-Mey9MuZIo00DDYattn1NR1R/5xA= + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/has-ansi/download/has-ansi-2.0.0.tgz?cache=0&sync_timestamp=1631558652943&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-ansi%2Fdownload%2Fhas-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/has-bigints/download/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/has-flag/download/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/has-symbols/download/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM= + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU= + dependencies: + has-symbols "^1.0.2" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.npmmirror.com/has-value/download/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-value/download/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/has-values/download/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-values/download/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/hash-base/download/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha1-VcOB2eBuHSmXqIO0o/3f5/DTrzM= + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.npmmirror.com/hash.js/download/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I= + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/he/download/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha1-hK5l+n6vsWX922FWauFLrwVmTw8= + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/hex-color-regex/download/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4= + +hey-listen@^1.0.5, hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/hey-listen/download/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" + integrity sha1-jllWH/ckkI3hqpJO1uzISlapqmg= + +highlight-words-core@^1.2.0: + version "1.2.2" + resolved "https://registry.npmmirror.com/highlight-words-core/download/highlight-words-core-1.2.2.tgz#1eff6d7d9f0a22f155042a00791237791b1eeaaa" + integrity sha1-Hv9tfZ8KIvFVBCoAeRI3eRse6qo= + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/hmac-drbg/download/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.0: + version "3.3.2" + resolved "https://registry.npmmirror.com/hoist-non-react-statics/download/hoist-non-react-statics-3.3.2.tgz?cache=0&sync_timestamp=1627566706387&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhoist-non-react-statics%2Fdownload%2Fhoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha1-7OCsr3HWLClpwuxZ/v9CpLGoW0U= + dependencies: + react-is "^16.7.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmmirror.com/hosted-git-info/download/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k= + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.npmmirror.com/hosted-git-info/download/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmmirror.com/hpack.js/download/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/hsl-regex/download/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/hsla-regex/download/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/html-encoding-sniffer/download/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg= + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@^1.2.1: + version "1.4.0" + resolved "https://registry.npmmirror.com/html-entities/download/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha1-z70bAdKvr5rcobEK59/6uYxx0tw= + +html-escaper@^2.0.0, html-escaper@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/html-escaper/download/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha1-39YAJ9o2o238viNiYsAKWCJoFFM= + +html-minifier-terser@^5.0.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/html-minifier-terser/download/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha1-ki6W8fO7YIMsJjS3mIQJY4mx8FQ= + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/html-parse-stringify/download/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + integrity sha1-38EBc0fOn3fIFBpQfyMwQMWcVdI= + dependencies: + void-elements "3.1.0" + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/html-tags/download/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha1-e15vfmZen7QfMAB+2eDUHpf7IUA= + +html-webpack-plugin@4.0.0-beta.11: + version "4.0.0-beta.11" + resolved "https://registry.npmmirror.com/html-webpack-plugin/download/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715" + integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg== + dependencies: + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@^3.10.0: + version "3.10.1" + resolved "https://registry.npmmirror.com/htmlparser2/download/htmlparser2-3.10.1.tgz?cache=0&sync_timestamp=1636640945377&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha1-vWedw/WYl7ajS7EHSchVu1OpOS8= + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/htmlparser2/download/htmlparser2-6.1.0.tgz?cache=0&sync_timestamp=1636640945377&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha1-xNditsM3GgXb5l6UrkOp+EX7j7c= + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmmirror.com/http-deceiver/download/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmmirror.com/http-errors/download/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.5" + resolved "https://registry.npmmirror.com/http-parser-js/download/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" + integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.npmmirror.com/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.1" + resolved "https://registry.npmmirror.com/http-proxy/download/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk= + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/http-signature/download/http-signature-1.2.0.tgz?cache=0&sync_timestamp=1637178703812&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/https-browserify/download/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +i18next@^19.5.3: + version "19.9.2" + resolved "https://registry.npmmirror.com/i18next/download/i18next-19.9.2.tgz#ea5a124416e3c5ab85fddca2c8e3c3669a8da397" + integrity sha1-6loSRBbjxauF/dyiyOPDZpqNo5c= + dependencies: + "@babel/runtime" "^7.12.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.npmmirror.com/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/icss-utils/download/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha1-IRcLU3ie4nRHwvR91oMIFAP5pGc= + dependencies: + postcss "^7.0.14" + +identity-obj-proxy@3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/identity-obj-proxy/download/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.npmmirror.com/ieee754/download/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I= + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.npmmirror.com/iferr/download/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.npmmirror.com/ignore/download/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.npmmirror.com/ignore/download/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/ignore/download/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.npmmirror.com/image-size/download/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + +immer@1.10.0: + version "1.10.0" + resolved "https://registry.npmmirror.com/immer/download/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" + integrity sha1-utZ2BbqcgQJ12R4cKkfUWC6YKG0= + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/import-cwd/download/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/import-fresh/download/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmmirror.com/import-fresh/download/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha1-NxYsJfy566oublPVtNiM4X2eDCs= + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/import-from/download/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/import-lazy/download/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha1-6OtidIOgpD2jwD8+NVSL5csMwVM= + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/import-local/download/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha1-VQcL44pZk88Y72236WH1vuXFoJ0= + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/imurmurhash/download/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/indent-string/download/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE= + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/indexes-of/download/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/infer-owner/download/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha1-xM78qo5RBRwqQLos6KPScpWvlGc= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmmirror.com/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmmirror.com/inherits/download/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/inherits/download/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmmirror.com/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.npmmirror.com/ini/download/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw= + +inquirer@7.0.4: + version "7.0.4" + resolved "https://registry.npmmirror.com/inquirer/download/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^7.0.0: + version "7.3.3" + resolved "https://registry.npmmirror.com/inquirer/download/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/internal-ip/download/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc= + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/internal-slot/download/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha1-c0fjB97uovqsKsYgXUvH00ln9Zw= + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmmirror.com/invariant/download/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY= + dependencies: + loose-envify "^1.0.0" + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/invert-kv/download/invert-kv-2.0.0.tgz?cache=0&sync_timestamp=1630996775723&other_urls=https%3A%2F%2Fregistry.nlark.com%2Finvert-kv%2Fdownload%2Finvert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI= + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/ip-regex/download/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.9" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396" + integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ== + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.npmmirror.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha1-v/OFQ+64mEglB5/zoqjmy9RngbM= + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-absolute-url/download/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/is-absolute-url/download/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.npmmirror.com/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= + dependencies: + kind-of "^6.0.0" + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-alphabetical/download/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha1-nn1rlJFr4iFTdF0YTCmMv5hqaG0= + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-alphanumerical/download/is-alphanumerical-1.0.4.tgz?cache=0&sync_timestamp=1636009291782&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-alphanumerical%2Fdownload%2Fis-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha1-frmiQx+FX2se8aeOMm31FWlsTb8= + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.npmmirror.com/is-arguments/download/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps= + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmmirror.com/is-arrayish/download/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha1-RXSirlb3qyBolvtDHq7tBm/fjwM= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-bigint/download/is-bigint-1.0.4.tgz?cache=0&sync_timestamp=1628747500062&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-bigint%2Fdownload%2Fis-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM= + dependencies: + has-bigints "^1.0.1" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-binary-path/download/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-binary-path/download/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk= + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/is-boolean-object/download/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk= + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.0.2, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmmirror.com/is-buffer/download/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha1-76ouqdqg16suoTqXsritUf776L4= + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.npmmirror.com/is-buffer/download/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha1-68JS5ADSL/jXf6CYiIIaJKZYwZE= + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.npmmirror.com/is-callable/download/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU= + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/is-ci/download/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha1-a8YzQYGBDgS1wis9WJ/cpVAmQEw= + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/is-color-stop/download/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.npmmirror.com/is-core-module/download/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc= + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmmirror.com/is-date-object/download/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8= + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-decimal/download/is-decimal-1.0.4.tgz?cache=0&sync_timestamp=1636008960795&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-decimal%2Fdownload%2Fis-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha1-ZaOllYocW2OnBuGzM9fNn2MNP6U= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.npmmirror.com/is-descriptor/download/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-descriptor/download/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.npmmirror.com/is-directory/download/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.npmmirror.com/is-docker/download/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/is-extendable/download/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-extendable/download/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ= + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0= + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-generator-fn/download/is-generator-fn-2.1.0.tgz?cache=0&sync_timestamp=1628686122487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-generator-fn%2Fdownload%2Fis-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha1-fRQK3DiarzARqPKipM+m+q3/sRg= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/is-glob/download/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/download/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ= + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-hexadecimal/download/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha1-zDXJdYjaS9Saju3WvECC1E3LI6c= + +is-negative-zero@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/is-negative-zero/download/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.npmmirror.com/is-number-object/download/is-number-object-1.0.6.tgz?cache=0&sync_timestamp=1628221744591&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-number-object%2Fdownload%2Fis-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha1-anqvg4x/BoalC0VT9+VKlklOifA= + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-number/download/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-obj/download/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/is-obj/download/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI= + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/is-path-cwd/download/is-path-cwd-2.2.0.tgz?cache=0&sync_timestamp=1628686723402&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-cwd%2Fdownload%2Fis-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s= + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-path-in-cwd/download/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha1-v+Lcomxp85cmWkAJljYCk1oFOss= + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-path-inside/download/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha1-fJgQWH1lmkDSe8201WFuqwWUlLI= + dependencies: + path-is-inside "^1.0.2" + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/is-plain-obj/download/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-plain-obj/download/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha1-ReQuN/zPH0Dajl927iFRWEDAkoc= + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/is-plain-object/download/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/is-regex/download/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg= + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-regexp/download/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-regexp@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-regexp/download/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" + integrity sha1-zXNKVoZOI7lWv058ZsOWpMCyLC0= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/is-resolvable/download/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg= + +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-root/download/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha1-gJ4YEpzxEpZEMCpPhUQDXVGYSpw= + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-shared-array-buffer/download/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha1-l7DIX72stZycRG/mU7gs8rW3z+Y= + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/is-stream/download/is-stream-1.1.0.tgz?cache=0&sync_timestamp=1628592752355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-stream%2Fdownload%2Fis-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/is-string/download/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0= + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-symbol/download/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha1-ptrJO2NbBjymhyI23oiRClevE5w= + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/is-unicode-supported/download/is-unicode-supported-0.1.0.tgz?cache=0&sync_timestamp=1625294654260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-unicode-supported%2Fdownload%2Fis-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc= + +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-weakref/download/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-what@^3.14.1: + version "3.14.1" + resolved "https://registry.npmmirror.com/is-what/download/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha1-4SIvRt3ahd6tD9HJ3xMXYOd3VcE= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-windows/download/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/is-wsl/download/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.npmmirror.com/is-wsl/download/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE= + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/isobject/download/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/isobject/download/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.npmmirror.com/istanbul-lib-coverage/download/istanbul-lib-coverage-2.0.5.tgz?cache=0&sync_timestamp=1634527209200&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fistanbul-lib-coverage%2Fdownload%2Fistanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha1-Z18KtpUD+tSx2En3NrqsqAM0T0k= + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/istanbul-lib-instrument/download/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha1-pfY9kfC7wMPkee9MXeAnM17G1jA= + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.npmmirror.com/istanbul-lib-report/download/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha1-WoETzXRtQ8SInro2qxDn1QybTzM= + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.npmmirror.com/istanbul-lib-source-maps/download/istanbul-lib-source-maps-3.0.6.tgz?cache=0&sync_timestamp=1634004113980&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fistanbul-lib-source-maps%2Fdownload%2Fistanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha1-KEmXxIIRdS7EhiU9qX44ed77qMg= + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.7" + resolved "https://registry.npmmirror.com/istanbul-reports/download/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity sha1-XZOfYjfXtIOTzAlZ6rQM1P0FaTE= + dependencies: + html-escaper "^2.0.0" + +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-changed-files/download/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha1-CNjBXreaf6P8mCabwUtFHugvgDk= + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-cli/download/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha1-rS3mLQdHLUGcarwwH8QyuYsQ0q8= + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-config/download/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha1-+xu8YMc6Rq8DWQcZ76SCXm5N0bU= + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@*: + version "27.4.6" + resolved "https://registry.npmmirror.com/jest-diff/download/jest-diff-27.4.6.tgz#93815774d2012a2cbb6cf23f84d48c7a2618f98d" + integrity sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.4.0" + jest-get-type "^27.4.0" + pretty-format "^27.4.6" + +jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-diff/download/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha1-kxt9DVd4obr3RSy4FuMl43JAVdo= + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-docblock/download/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha1-eXAgGAK6Vg4cQJLMJcvt9a9ajOI= + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-each/download/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha1-6y2mAuKmEImNvF8fbfO6hrVfiwU= + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom-fourteen@1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/jest-environment-jsdom-fourteen/download/jest-environment-jsdom-fourteen-1.0.1.tgz#4cd0042f58b4ab666950d96532ecb2fc188f96fb" + integrity sha1-TNAEL1i0q2ZpUNllMuyy/BiPlvs= + dependencies: + "@jest/environment" "^24.3.0" + "@jest/fake-timers" "^24.3.0" + "@jest/types" "^24.3.0" + jest-mock "^24.0.0" + jest-util "^24.0.0" + jsdom "^14.1.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-environment-jsdom/download/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha1-SwgGx/yU+V7bNpppzCd47sK3N1s= + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-environment-node/download/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha1-Mz0tJ5b5aH8q7r8HQrUZ8zwcv9M= + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-get-type/download/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha1-FoSgyKUPLkkBtmRK6GH1ee7S7w4= + +jest-get-type@^27.4.0: + version "27.4.0" + resolved "https://registry.npmmirror.com/jest-get-type/download/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5" + integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-haste-map/download/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha1-s4pdZCdJNOIfpBeump++t3zqrH0= + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-jasmine2/download/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha1-H3sb0yQsF3TmKsq7NkbZavw75qA= + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-leak-detector/download/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha1-tmXep8dxAMXE99/LFTtlzwfc+Wo= + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-matcher-utils/download/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha1-9bNmHV5ijf/m3WUlHf2uDofDoHM= + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-message-util/download/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha1-Un9UoeOA9eICqNEUmw7IcvQxGeM= + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.0.0, jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-mock/download/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha1-wig1VB7jebkIZzrVEIeiGFwT8cY= + dependencies: + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.2" + resolved "https://registry.npmmirror.com/jest-pnp-resolver/download/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha1-twSsCuAoqJEIpNBAs/kZ393I4zw= + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-regex-util/download/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha1-wT+zOAveIr9ldUMsST6o/jeWVjY= + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-resolve-dependencies/download/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha1-rQVRmJWcTPuopPBmxnOj8HhlB6s= + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@24.9.0, jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-resolve/download/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha1-3/BMdoevNMTdflJIktnPd+XRcyE= + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-runner/download/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha1-V0+v29VEVcKzS0vfQ2WiOFf830I= + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-runtime/download/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha1-nxRYOvak9zFKap2fAibhp4HI5Kw= + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-serializer/download/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha1-5tfX75bTHouQeacUdUxdXFgojnM= + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-snapshot/download/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha1-7I6cpPLsDFyHro+SXPl0l7DpUbo= + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.0.0, jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-util/download/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha1-c5aBTkhTbS6Fo33j5MQx18sUAWI= + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-validate/download/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha1-B3XFU2DRc82FTkAYB1bU/1Le+Ks= + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watch-typeahead@0.4.2: + version "0.4.2" + resolved "https://registry.npmmirror.com/jest-watch-typeahead/download/jest-watch-typeahead-0.4.2.tgz#e5be959698a7fa2302229a5082c488c3c8780a4a" + integrity sha1-5b6Vlpin+iMCIppQgsSIw8h4Cko= + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.1" + jest-regex-util "^24.9.0" + jest-watcher "^24.3.0" + slash "^3.0.0" + string-length "^3.1.0" + strip-ansi "^5.0.0" + +jest-watcher@^24.3.0, jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-watcher/download/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha1-S1bl0c7/AF9biOUo3Jr8jdTtKzs= + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest-worker/download/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha1-Xb/bWy0yLphWeJgjipaXvM5ns+U= + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest-worker@^25.1.0: + version "25.5.0" + resolved "https://registry.npmmirror.com/jest-worker/download/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha1-JhHQcbec6g9D7lej0RhZOsFUfbE= + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/jest/download/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/js-tokens/download/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk= + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/js-tokens/download/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmmirror.com/js-yaml/download/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.npmmirror.com/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.npmmirror.com/jsdom/download/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsdom@^14.1.0: + version "14.1.0" + resolved "https://registry.npmmirror.com/jsdom/download/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b" + integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== + dependencies: + abab "^2.0.0" + acorn "^6.0.4" + acorn-globals "^4.3.0" + array-equal "^1.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.0" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.1.3" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.5" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^2.5.0" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^6.1.2" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmmirror.com/jsesc/download/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q= + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmmirror.com/jsesc/download/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk= + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmmirror.com/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/json-schema-traverse/download/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha1-rnvLNlard6c7pcSb9lTzjmtoYOI= + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/json-schema/download/json-schema-0.4.0.tgz?cache=0&sync_timestamp=1636423476647&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjson-schema%2Fdownload%2Fjson-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json2mq@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/json2mq/download/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + integrity sha1-tje9O6nqvhIsg+lyBIOusQ0skEo= + dependencies: + string-convert "^0.2.0" + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.npmmirror.com/json3/download/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E= + +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.npmmirror.com/json5/download/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/jsonfile/download/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.npmmirror.com/jsonify/download/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.npmmirror.com/jsprim/download/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: + version "2.4.1" + resolved "https://registry.npmmirror.com/jsx-ast-utils/download/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" + integrity sha1-ERSkwSCUgdsGxpDCtPSIzGZfZX4= + dependencies: + array-includes "^3.1.1" + object.assign "^4.1.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/killable/download/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI= + +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/kind-of/download/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= + dependencies: + is-buffer "^1.0.2" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.npmmirror.com/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/kind-of/download/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/kind-of/download/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha1-cpyR4thXt6QZofmqZWhcTDP1hF0= + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.npmmirror.com/kind-of/download/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/kleur/download/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha1-p5yezIbuHOP6YgbRIWxQHxR/wH4= + +known-css-properties@^0.21.0: + version "0.21.0" + resolved "https://registry.npmmirror.com/known-css-properties/download/known-css-properties-0.21.0.tgz#15fbd0bbb83447f3ce09d8af247ed47c68ede80d" + integrity sha1-FfvQu7g0R/POCdivJH7UfGjt6A0= + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/last-call-webpack-plugin/download/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha1-l0LfDhDjz0blwDgcLekNOnotdVU= + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.npmmirror.com/lazy-cache/download/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/lcid/download/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha1-bvXS32DlL4LrIopMNz6NHzlyU88= + dependencies: + invert-kv "^2.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/left-pad/download/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha1-W4o6d2Xf4AEmHd6RVYnngvjJTR4= + +less-loader@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/less-loader/download/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466" + integrity sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg== + dependencies: + clone "^2.1.1" + loader-utils "^1.1.0" + pify "^4.0.1" + +less@^3.11.3: + version "3.13.1" + resolved "https://registry.npmmirror.com/less/download/less-3.13.1.tgz#0ebc91d2a0e9c0c6735b83d496b0ab0583077909" + integrity sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw== + dependencies: + copy-anything "^2.0.1" + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + native-request "^1.0.5" + source-map "~0.6.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/leven/download/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I= + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/levenary/download/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha1-hCqe6Y0gdap/ru2+MmeekgX0b3c= + dependencies: + leven "^3.1.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/levn/download/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmmirror.com/lines-and-columns/download/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/load-json-file/download/load-json-file-2.0.0.tgz?cache=0&sync_timestamp=1631508607226&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fload-json-file%2Fdownload%2Fload-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/load-json-file/download/load-json-file-4.0.0.tgz?cache=0&sync_timestamp=1631508607226&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fload-json-file%2Fdownload%2Fload-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-fs-cache@^1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/loader-fs-cache/download/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" + integrity sha1-8IZXZG1gcHi+LwoDL4vWndbyd9k= + dependencies: + find-cache-dir "^0.1.1" + mkdirp "^0.5.1" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.npmmirror.com/loader-runner/download/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c= + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.npmmirror.com/loader-utils/download/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc= + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/loader-utils/download/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha1-xXm140yzSxp07cbB+za/o3HVphM= + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/locate-path/download/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/locate-path/download/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4= + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/locate-path/download/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= + dependencies: + p-locate "^4.1.0" + +lodash-es@^4.17.15: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash-es/download/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/lodash.curry/download/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmmirror.com/lodash.debounce/download/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.flow@^3.3.0, lodash.flow@^3.5.0: + version "3.5.0" + resolved "https://registry.npmmirror.com/lodash.flow/download/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/lodash.memoize/download/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmmirror.com/lodash.sortby/download/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash.template@^4.4.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/lodash.template/download/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha1-+XYZXPPzR9DV9SSDVp/oAxzM6Ks= + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/lodash.templatesettings/download/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha1-5IExDwSdPPbUfpEq0JMTsVTw+zM= + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.npmmirror.com/lodash.truncate/download/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/lodash.uniq/download/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash/download/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/log-symbols/download/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha1-P727lbRoOsn8eFER55LlWNSr1QM= + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loglevel@^1.6.6: + version "1.8.0" + resolved "https://registry.npmmirror.com/loglevel/download/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" + integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== + +longest-streak@^2.0.0: + version "2.0.4" + resolved "https://registry.npmmirror.com/longest-streak/download/longest-streak-2.0.4.tgz?cache=0&sync_timestamp=1636446222992&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flongest-streak%2Fdownload%2Flongest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + integrity sha1-uFmZV9pbXatk3uP+MW+ndFl9kOQ= + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/loose-envify/download/loose-envify-1.4.0.tgz?cache=0&sync_timestamp=1627566748051&other_urls=https%3A%2F%2Fregistry.nlark.com%2Floose-envify%2Fdownload%2Floose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8= + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/lower-case/download/lower-case-2.0.2.tgz?cache=0&sync_timestamp=1624607698082&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flower-case%2Fdownload%2Flower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha1-b6I3xj29xKgsoP2ILkci3F5jTig= + dependencies: + tslib "^2.0.3" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/lru-cache/download/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA= + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/lru-cache/download/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ= + dependencies: + yallist "^4.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/make-dir/download/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU= + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/make-dir/download/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8= + dependencies: + semver "^6.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmmirror.com/makeerror/download/makeerror-1.0.12.tgz?cache=0&sync_timestamp=1635238315869&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmakeerror%2Fdownload%2Fmakeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha1-Pl3SB5qC6BLpg8xmEMSiyw6qgBo= + dependencies: + tmpl "1.0.5" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.npmmirror.com/mamacro/download/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha1-rSyVdhl8nxq/MI0Hh4Zb2XWj8+Q= + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.npmmirror.com/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo= + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.npmmirror.com/map-cache/download/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/map-obj/download/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha1-kwT5Buk/qucIgNoQKp8d8OqLsFo= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/map-visit/download/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.npmmirror.com/mathml-tag-names/download/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha1-TdrdZzCOeAzxakdoWHjuJ7c2oKM= + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmmirror.com/md5.js/download/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.npmmirror.com/mdast-util-from-markdown/download/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha1-0e8spCvDd+ywRjqYeRDa6JvZoow= + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-to-markdown@^0.6.0: + version "0.6.5" + resolved "https://registry.npmmirror.com/mdast-util-to-markdown/download/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" + integrity sha1-sz9nyoINaebMUnqT1AOSSbUEvr4= + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/mdast-util-to-string/download/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha1-uM/mpxPhCRy1tyj8SIhaR2f4uXs= + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.npmmirror.com/mdn-data/download/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA= + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/mdn-data/download/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/mem/download/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha1-Rhr0l7xK4JYIzbLmDu+2m/90QXg= + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memoize-one@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/memoize-one/download/memoize-one-4.1.0.tgz#a2387c58c03fff27ca390c31b764a79addf3f906" + integrity sha1-ojh8WMA//yfKOQwxt2Snmt3z+QY= + +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/memoize-one/download/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha1-slkbhx7YKUiu5HJ9xqvO7qyMEEU= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/memory-fs/download/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.npmmirror.com/memory-fs/download/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.npmmirror.com/meow/download/meow-9.0.0.tgz?cache=0&sync_timestamp=1637477490247&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmeow%2Fdownload%2Fmeow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" + integrity sha1-zZUQvFysne59A8c+4fmtlZ9Oo2Q= + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize "^1.2.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-deep@^3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/merge-deep/download/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" + integrity sha1-Gisq6SbaiyrpOgrBXZDNGSJ2YAM= + dependencies: + arr-union "^3.1.0" + clone-deep "^0.2.4" + kind-of "^3.0.2" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/merge-stream/download/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A= + +merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/merge2/download/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4= + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/microevent.ts/download/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha1-cLCbg/Q99RctAgWmMCW84Pc1f6A= + +micromark@~2.11.0: + version "2.11.4" + resolved "https://registry.npmmirror.com/micromark/download/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha1-0TQ2E47qgmOD6CJEnJpcUO5EZlo= + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.npmmirror.com/micromatch/download/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha1-cIWbyVyYQJUvNZoGij/En57PrCM= + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.npmmirror.com/micromatch/download/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k= + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/miller-rabin/download/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha1-8IA1HIZbDcViqEYpZtqlNUPHik0= + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": + version "1.51.0" + resolved "https://registry.npmmirror.com/mime-db/download/mime-db-1.51.0.tgz?cache=0&sync_timestamp=1636426033377&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmime-db%2Fdownload%2Fmime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19: + version "2.1.34" + resolved "https://registry.npmmirror.com/mime-types/download/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.npmmirror.com/mime/download/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= + +mime@^2.4.4: + version "2.6.0" + resolved "https://registry.npmmirror.com/mime/download/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha1-oqaCqVzU0MsdYlfij4PafjWAA2c= + +mimic-fn@^2.0.0, mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/mimic-fn/download/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/min-indent/download/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha1-pj9oFnOzBXH76LwlaGrnRu76mGk= + +mini-css-extract-plugin@0.9.0: + version "0.9.0" + resolved "https://registry.npmmirror.com/mini-css-extract-plugin/download/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" + integrity sha1-R/LPB6oWWrNXM7H8l9TEbAVkM54= + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc= + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= + dependencies: + brace-expansion "^1.1.7" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/minimist-options/download/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha1-wGVXE8U6ii69d/+iR9NCxA8BBhk= + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/minipass-collect/download/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc= + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/minipass-flush/download/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M= + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.npmmirror.com/minipass-pipeline/download/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha1-aEcveXEcCEZXwGfFxq2Tzd6oIUw= + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.6" + resolved "https://registry.npmmirror.com/minipass/download/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" + integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== + dependencies: + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/mississippi/download/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha1-6goykfl+C16HdrNj1fChLZTGcCI= + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.npmmirror.com/mixin-deep/download/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY= + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/mixin-object/download/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.npmmirror.com/mkdirp/download/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8= + dependencies: + minimist "^1.2.5" + +mobx-react-lite@^2.2.0: + version "2.2.2" + resolved "https://registry.npmmirror.com/mobx-react-lite/download/mobx-react-lite-2.2.2.tgz#87c217dc72b4e47b22493daf155daf3759f868a6" + integrity sha1-h8IX3HK05HsiST2vFV2vN1n4aKY= + +mobx-react@^6.2.2: + version "6.3.1" + resolved "https://registry.npmmirror.com/mobx-react/download/mobx-react-6.3.1.tgz#204f9756e42e19d91cb6598837063b7e7de87c52" + integrity sha1-IE+XVuQuGdkctlmINwY7fn3ofFI= + dependencies: + mobx-react-lite "^2.2.0" + +mobx@^5.13.0: + version "5.15.7" + resolved "https://registry.npmmirror.com/mobx/download/mobx-5.15.7.tgz#b9a5f2b6251f5d96980d13c78e9b5d8d4ce22665" + integrity sha1-uaXytiUfXZaYDRPHjptdjUziJmU= + +moment@^2.24.0, moment@^2.25.3: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/move-concurrently/download/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk= + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmmirror.com/ms/download/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha1-V0yBOM4dK1hh8LRFedut1gxmFbI= + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.npmmirror.com/multicast-dns/download/multicast-dns-6.2.3.tgz?cache=0&sync_timestamp=1633354996608&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmulticast-dns%2Fdownload%2Fmulticast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha1-oOx72QVcQoL3kMPIL04o2zsxsik= + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.npmmirror.com/mute-stream/download/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha1-FjDEKyJR/4HiooPelqVJfqkuXg0= + +nan@^2.12.1: + version "2.15.0" + resolved "https://registry.npmmirror.com/nan/download/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha1-PzSkc/8Y4VwbVia2KQO1rW5mX+4= + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.npmmirror.com/nanomatch/download/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk= + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +native-request@^1.0.5: + version "1.1.0" + resolved "https://registry.npmmirror.com/native-request/download/native-request-1.1.0.tgz#acdb30fe2eefa3e1bc8c54b3a6852e9c5c0d3cb0" + integrity sha1-rNsw/i7vo+G8jFSzpoUunFwNPLA= + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/natural-compare/download/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.npmmirror.com/neo-async/download/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8= + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.npmmirror.com/nice-try/download/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y= + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/no-case/download/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0= + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmmirror.com/node-fetch/download/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.npmmirror.com/node-forge/download/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M= + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/node-int64/download/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/node-libs-browser/download/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU= + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-notifier@^5.4.2: + version "5.4.5" + resolved "https://registry.npmmirror.com/node-notifier/download/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef" + integrity sha1-DLwaKw9lhJO0Ald1oTrZOOlgke8= + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-releases@^1.1.52: + version "1.1.77" + resolved "https://registry.npmmirror.com/node-releases/download/node-releases-1.1.77.tgz?cache=0&sync_timestamp=1634807933091&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + integrity sha1-ULDP7ehV3TdOdYW/Io/zTlfBwy4= + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/node-releases/download/node-releases-2.0.1.tgz?cache=0&sync_timestamp=1634807933091&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-releases%2Fdownload%2Fnode-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha1-PR05XyBPHy8ppUNYuftnh2WtL8U= + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.npmmirror.com/normalize-package-data/download/normalize-package-data-2.5.0.tgz?cache=0&sync_timestamp=1629301872905&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.npmmirror.com/normalize-package-data/download/normalize-package-data-3.0.3.tgz?cache=0&sync_timestamp=1629301872905&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha1-28w+LaWVCaCYNCKITNFy7v36Ul4= + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/normalize-path/download/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/normalize-range/download/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-selector@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/normalize-selector/download/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" + integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.npmmirror.com/normalize-url/download/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/normalize-url/download/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha1-suHE3E98bVd0PfczpPWXjRhlBVk= + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.npmmirror.com/npm-run-path/download/npm-run-path-2.0.2.tgz?cache=0&sync_timestamp=1633420566316&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnpm-run-path%2Fdownload%2Fnpm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/nth-check/download/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw= + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/nth-check/download/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I= + dependencies: + boolbase "^1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.npmmirror.com/num2fraction/download/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.0.7, nwsapi@^2.1.3: + version "2.2.0" + resolved "https://registry.npmmirror.com/nwsapi/download/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha1-IEh5qePQaP8qVROcLHcngGgaOLc= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.npmmirror.com/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/object-copy/download/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^2.0.1: + version "2.2.0" + resolved "https://registry.npmmirror.com/object-hash/download/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha1-WtUYWB7vxEO9djRyuP8unCwNVKU= + +object-inspect@^1.11.0: + version "1.12.0" + resolved "https://registry.npmmirror.com/object-inspect/download/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.npmmirror.com/object-is/download/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha1-ud7qpfx/GEag+uzc7sE45XePU6w= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/object-keys/download/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha1-HEfyct8nfzsdrwYWd9nILiMixg4= + +object-path@0.11.4: + version "0.11.4" + resolved "https://registry.npmmirror.com/object-path/download/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" + integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/object-visit/download/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/object.assign/download/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA= + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.0, object.entries@^1.1.1: + version "1.1.5" + resolved "https://registry.npmmirror.com/object.entries/download/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha1-4azdF8TeLNltWghIfPuduE2IGGE= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.2: + version "2.0.5" + resolved "https://registry.npmmirror.com/object.fromentries/download/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha1-ezeyBRCcIedB5gVyf+iwrV+gglE= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0, object.getownpropertydescriptors@^2.1.1: + version "2.1.3" + resolved "https://registry.npmmirror.com/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.1.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fobject.getownpropertydescriptors%2Fdownload%2Fobject.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity sha1-siPPOOF/77l6Y8EMkd9yzLOG354= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/object.pick/download/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.1: + version "1.1.5" + resolved "https://registry.npmmirror.com/object.values/download/object.values-1.1.5.tgz?cache=0&sync_timestamp=1633327208193&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fobject.values%2Fdownload%2Fobject.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha1-lZ9j486e8QhyAzMIITHkpFm3Fqw= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/obuf/download/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4= + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/on-headers/download/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8= + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.npmmirror.com/onetime/download/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4= + dependencies: + mimic-fn "^2.1.0" + +open@^7.0.2: + version "7.4.2" + resolved "https://registry.npmmirror.com/open/download/open-7.4.2.tgz?cache=0&sync_timestamp=1635049636729&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fopen%2Fdownload%2Fopen-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha1-uBR+Jtzz5CYxbHMAif1x7dKcIyE= + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.npmmirror.com/opn/download/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w= + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@5.0.3: + version "5.0.3" + resolved "https://registry.npmmirror.com/optimize-css-assets-webpack-plugin/download/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + integrity sha1-4vHU2UrYwK+JZ+vXzxONyx7xRXI= + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1, optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.npmmirror.com/optionator/download/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/original/download/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8= + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/os-browserify/download/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/os-locale/download/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo= + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/p-defer/download/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/p-each-series/download/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/p-finally/download/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/p-is-promise/download/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/p-limit/download/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg= + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: + version "2.3.0" + resolved "https://registry.npmmirror.com/p-limit/download/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/p-locate/download/p-locate-2.0.0.tgz?cache=0&sync_timestamp=1629892708584&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/p-locate/download/p-locate-3.0.0.tgz?cache=0&sync_timestamp=1629892708584&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ= + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/p-locate/download/p-locate-4.1.0.tgz?cache=0&sync_timestamp=1629892708584&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha1-o0KLtwiLOmApL2aRkni3wpetTwc= + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/p-map/download/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha1-MQko/u+cnsxltosXaTAYpmXOoXU= + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/p-map/download/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha1-1wTZr4orpoTiYA2aIVmD1BQal50= + dependencies: + aggregate-error "^3.0.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/p-reduce/download/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/p-retry/download/p-retry-3.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-retry%2Fdownload%2Fp-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha1-MWtMiJPiyNwc+okfQGxLQivr8yg= + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/p-try/download/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/p-try/download/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.npmmirror.com/pako/download/pako-1.0.11.tgz?cache=0&sync_timestamp=1627560187062&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpako%2Fdownload%2Fpako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8= + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/parallel-transform/download/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw= + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.3: + version "3.0.4" + resolved "https://registry.npmmirror.com/param-case/download/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU= + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/parent-module/download/parent-module-1.0.1.tgz?cache=0&sync_timestamp=1633337488003&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fparent-module%2Fdownload%2Fparent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI= + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.6: + version "5.1.6" + resolved "https://registry.npmmirror.com/parse-asn1/download/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha1-OFCAo+wTy2KmLTlAnLPoiETNrtQ= + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/parse-entities/download/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha1-U8brW5MUofTsmfoP33zgHs2gy+g= + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/parse-json/download/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/parse-json/download/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80= + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/parse5/download/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha1-bXhlbj2o14tOwLkG98CO8d/j9gg= + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/parse5/download/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha1-xZNByXI/QUxFKXVWTHwApo1YrNI= + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/pascal-case/download/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs= + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/pascalcase/download/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/path-browserify/download/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha1-5sTd1+06onxoogzE5Q4aTug7vEo= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/path-dirname/download/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/path-exists/download/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/path-exists/download/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-exists/download/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/path-is-inside/download/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/path-key/download/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/path-key/download/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= + +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/path-parse/download/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU= + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/path-type/download/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/path-type/download/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha1-zvMdyOCho7sNEFwM2Xzzv0f0428= + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-type/download/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs= + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.npmmirror.com/pbkdf2/download/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha1-3YIqoIh1gOUvGgOdw+2hCO+uMHU= + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8= + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/picocolors/download/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw= + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/download/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pify/download/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/pify/download/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE= + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/pinkie-promise/download/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.npmmirror.com/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.5" + resolved "https://registry.npmmirror.com/pirates/download/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-1.0.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-3.0.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM= + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM= + dependencies: + find-up "^4.0.0" + +pkg-up@3.1.0, pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/pkg-up/download/pkg-up-3.1.0.tgz?cache=0&sync_timestamp=1636035118070&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-up%2Fdownload%2Fpkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha1-EA7CNcwVDk/UJRlBJZaihRKg3vU= + dependencies: + find-up "^3.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/pn/download/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha1-4vTO8OIZ9GPBeas3Rj5OHs3Muvs= + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.npmmirror.com/pnp-webpack-plugin/download/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha1-yXEaxNxIpoXauvyG+Lbdn434QUk= + dependencies: + ts-pnp "^1.1.6" + +popmotion@9.0.0-rc.20: + version "9.0.0-rc.20" + resolved "https://registry.npmmirror.com/popmotion/download/popmotion-9.0.0-rc.20.tgz#f3550042ae31957b5416793ae8723200951ad39d" + integrity sha1-81UAQq4xlXtUFnk66HIyAJUa050= + dependencies: + framesync "^4.1.0" + hey-listen "^1.0.8" + style-value-types "^3.1.9" + tslib "^1.10.0" + +popper.js@^1.14.4: + version "1.16.1" + resolved "https://registry.npmmirror.com/popper.js/download/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + +portfinder@^1.0.25: + version "1.0.28" + resolved "https://registry.npmmirror.com/portfinder/download/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g= + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.npmmirror.com/posix-character-classes/download/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-attribute-case-insensitive/download/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha1-2T5GtQRYnpSscnewRjImxoBBqIA= + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-browser-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/postcss-browser-comments/download/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" + integrity sha1-EkjS2TX7cgU8jh9hqEpXKS2fZek= + dependencies: + postcss "^7" + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.npmmirror.com/postcss-calc/download/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha1-+KbpnxLmGcLrwjz2xIb9wVhgkz4= + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/postcss-color-functional-notation/download/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha1-Xv03qI+6vrAKKWbR5T2Yztk/dOA= + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/postcss-color-gray/download/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha1-Uyox65CfjaiYzv/ilv3B+GS+hUc= + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.npmmirror.com/postcss-color-hex-alpha/download/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha1-qNnKTDnUl8lmHjdLnFGJnvD4c4g= + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/postcss-color-mod-function/download/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha1-gWuhRawRzDy2uqkFp1pJ+QPk0x0= + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-color-rebeccapurple/download/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha1-x6ib6HK7dORbHjAiv+V0iCPm3nc= + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/postcss-colormin/download/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha1-rgYLzpPteUrHEmTwgTLVUJVr04E= + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8= + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.npmmirror.com/postcss-custom-media/download/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha1-//0T/+/61zYhvl84cHaiiwApTgw= + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.npmmirror.com/postcss-custom-properties/download/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha1-LWF3LW6S8i9eDVJgLfj65G+jDZc= + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/postcss-custom-selectors/download/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha1-ZIWMbrLs/y+0HQsoyd17PbTef7o= + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/postcss-dir-pseudo-class/download/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha1-bjpBd9Dts6vMhf22+7HCbauuq6I= + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha1-H7q9LCRr/2qq15l7KwkY9NevQDM= + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha1-P+EzzTyCKC5VD8myORdqkge3hOs= + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha1-yMlR6fc+2UKAGUWERKAq2Qu592U= + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha1-ZSrvipZybwKfXj4AFG7npOdV/1c= + dependencies: + postcss "^7.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/postcss-double-position-gradients/download/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha1-/JJ9Uv3ciWyzooEuvF3xR+EQUi4= + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/postcss-env-function/download/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha1-Dz49PFfwlKksK69LYkHwsNpTZdc= + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-flexbugs-fixes@4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/postcss-flexbugs-fixes/download/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20" + integrity sha1-4JSp3xeD4iALexn4ddytOzr/iyA= + dependencies: + postcss "^7.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/postcss-focus-visible/download/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha1-R30QcROt5gJLFBKDF63ivR4XBG4= + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/postcss-focus-within/download/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha1-djuHiFls7puHTJmSAc3egGWe9oA= + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-font-variant/download/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha1-QtTAqzCJT2D5ixdWHrXAMh9QJkE= + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/postcss-gap-properties/download/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha1-QxwZKrPtlqPD0J8v9hWWD5AsFxU= + dependencies: + postcss "^7.0.2" + +postcss-html@^0.36.0: + version "0.36.0" + resolved "https://registry.npmmirror.com/postcss-html/download/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204" + integrity sha1-tAkT+U6qzCRT/TChMnrW7h+IsgQ= + dependencies: + htmlparser2 "^3.10.0" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/postcss-image-set-function/download/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha1-KJIKLymUW+1MMZjX32SW1BDT8og= + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.4" + resolved "https://registry.npmmirror.com/postcss-initial/download/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + integrity sha1-nTIGmhBTH+Lsr6C2rHUO4Lx+/FM= + dependencies: + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/postcss-lab-function/download/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha1-u1GmhWzRIomrSuINseOCHvE9fS4= + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-less@^3.1.4: + version "3.1.4" + resolved "https://registry.npmmirror.com/postcss-less/download/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" + integrity sha1-Np9YZCtZKO+Jj/vBpuk8lYMExa0= + dependencies: + postcss "^7.0.14" + +postcss-load-config@^2.0.0: + version "2.1.2" + resolved "https://registry.npmmirror.com/postcss-load-config/download/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha1-xepQTyxK7zPHNZo03jVzdyrXUCo= + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/postcss-loader/download/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0= + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/postcss-logical/download/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha1-JJXQ+LgunyYnJfdflAGzTntF1bU= + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/postcss-media-minmax/download/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha1-t1u2y8IXyKxJQz4S8iBIgUpPXtU= + dependencies: + postcss "^7.0.2" + +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.npmmirror.com/postcss-media-query-parser/download/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.npmmirror.com/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ= + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha1-NivqT/Wh+Y5AdacTxsslrv75plA= + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY= + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE= + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ= + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g= + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/postcss-modules-extract-imports/download/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha1-gYcZoa4doyX5gyRGsBE27rSTzX4= + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha1-uxTgzHgnnVBNvcv9fgyiiZP/u7A= + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.1.1: + version "2.2.0" + resolved "https://registry.npmmirror.com/postcss-modules-scope/download/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha1-OFyuATzHdD9afXYC0Qc6iequYu4= + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/postcss-modules-values/download/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha1-W1AA1uuuKbQlUwG0o6VFdEI+fxA= + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.npmmirror.com/postcss-nesting/download/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha1-tQrXt/AXPlteOIDDUBNEcD4EwFI= + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha1-izWt067oOhNrBHHg1ZvlilAoXdQ= + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha1-Db4EpM6QY9RmftK+R2u4MMglk1o= + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-positions/download/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8= + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw= + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-string/download/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw= + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha1-jgCcoqOUnNr4rSPmtquZy159KNk= + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-normalize-unicode/download/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs= + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE= + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI= + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize@8.0.1: + version "8.0.1" + resolved "https://registry.npmmirror.com/postcss-normalize/download/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" + integrity sha1-kOgKd2PX/fLaby8Pgr6DLOT2Z3Y= + dependencies: + "@csstools/normalize.css" "^10.1.0" + browserslist "^4.6.2" + postcss "^7.0.17" + postcss-browser-comments "^3.0.0" + sanitize.css "^10.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4= + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/postcss-overflow-shorthand/download/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha1-MezzUOnG9t3CUKePDD4RHzLdTDA= + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/postcss-page-break/download/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha1-rdUtDgpSjKvmr+6LRuKrsnffRr8= + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-place/download/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha1-6fOdM9LcWE5G7h20Wtt3yp0dzGI= + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.npmmirror.com/postcss-preset-env/download/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha1-w03az4+QI4OzWtHgMPF49M3xGKU= + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/postcss-pseudo-class-any-link/download/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha1-LtPu05OzcCh53sSocDKyENrrBNE= + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha1-f9QuvqXpyBRgljniwuhK4nC6SN8= + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha1-F++kBerMbge+NBSlyi0QdGgdTik= + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/postcss-replace-overflow-wrap/download/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha1-YbNg/9rtyoTHyRjSsPDQ6lWasBw= + dependencies: + postcss "^7.0.2" + +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/postcss-resolve-nested-selector/download/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" + integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= + +postcss-safe-parser@4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-safe-parser/download/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea" + integrity sha1-h1bZ5MNv3OLHKwkbvIyhdqsfzeo= + dependencies: + postcss "^7.0.0" + +postcss-safe-parser@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-safe-parser/download/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" + integrity sha1-ptTkjw832ffBGypYG/APi6SHC5Y= + dependencies: + postcss "^7.0.26" + +postcss-sass@^0.4.4: + version "0.4.4" + resolved "https://registry.npmmirror.com/postcss-sass/download/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3" + integrity sha1-kfDzRHtFzjcyJ6mLYfjY8HhShaM= + dependencies: + gonzales-pe "^4.3.0" + postcss "^7.0.21" + +postcss-scss@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/postcss-scss/download/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383" + integrity sha1-7Dp1+imlXgFrkL8yaQJsU8HSs4M= + dependencies: + postcss "^7.0.6" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/postcss-selector-matches/download/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha1-ccgkj5F7osyTA3yWN+4JxkQ2/P8= + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-selector-not/download/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha1-JjAW7vHPIZ4K3pqRN4D8H0ggTL8= + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.npmmirror.com/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA= + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.npmmirror.com/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha1-JJBENWaXsztk8aj3yAki3d7nGVw= + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.5: + version "6.0.9" + resolved "https://registry.npmmirror.com/postcss-selector-parser/download/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" + integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/postcss-svgo/download/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha1-NDos26yVBdQWJD1Jb3JPOIlMlB4= + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-syntax@^0.36.2: + version "0.36.2" + resolved "https://registry.npmmirror.com/postcss-syntax/download/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c" + integrity sha1-8IV4x9lYNFdOVZOoLfv6ivrjtRw= + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w= + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.npmmirror.com/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha1-n/giVH4okyE88cMO+lGsX9G6goE= + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/postcss-value-parser/download/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/postcss-values-parser/download/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha1-2otHLZAdoeIFtHvcmGN7np5VDl8= + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@7.0.21: + version "7.0.21" + resolved "https://registry.npmmirror.com/postcss/download/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.39" + resolved "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/prelude-ls/download/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/prepend-http/download/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prettier@^2.0.5: + version "2.5.1" + resolved "https://registry.npmmirror.com/prettier/download/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== + +pretty-bytes@^5.1.0: + version "5.6.0" + resolved "https://registry.npmmirror.com/pretty-bytes/download/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha1-NWJW9kOAR3PIL2RyP+eMksYr6us= + +pretty-error@^2.1.1: + version "2.1.2" + resolved "https://registry.npmmirror.com/pretty-error/download/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha1-von4LYGxyG7I/fvDhQRYgnJ/k7Y= + dependencies: + lodash "^4.17.20" + renderkid "^2.0.4" + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.npmmirror.com/pretty-format/download/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha1-EvrDGzcBmk7qPBGqmpWet2KKp8k= + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^27.4.6: + version "27.4.6" + resolved "https://registry.npmmirror.com/pretty-format/download/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7" + integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/process-nextick-args/download/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I= + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmmirror.com/process/download/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.npmmirror.com/progress/download/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/promise-inflight/download/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.npmmirror.com/promise/download/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078= + dependencies: + asap "~2.0.3" + +promise@^8.0.3: + version "8.1.0" + resolved "https://registry.npmmirror.com/promise/download/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha1-aXwlw9/nQ13Xn81Yw4oTWIjq8F4= + dependencies: + asap "~2.0.6" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.npmmirror.com/prompts/download/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha1-e1fnOzpIAprRDr1E90sBcipMsGk= + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.npmmirror.com/prop-types/download/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/prr/download/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.npmmirror.com/psl/download/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.npmmirror.com/public-encrypt/download/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA= + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/pump/download/pump-2.0.1.tgz?cache=0&sync_timestamp=1624607960506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpump%2Fdownload%2Fpump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk= + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pump/download/pump-3.0.0.tgz?cache=0&sync_timestamp=1624607960506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpump%2Fdownload%2Fpump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ= + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.npmmirror.com/pumpify/download/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4= + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmmirror.com/punycode/download/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.npmmirror.com/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/punycode/download/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= + +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/pure-color/download/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" + integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.npmmirror.com/q/download/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.npmmirror.com/qs/download/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.npmmirror.com/query-string/download/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q== + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.npmmirror.com/querystring-es3/download/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/querystring/download/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmmirror.com/querystringify/download/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y= + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/queue-microtask/download/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha1-SSkii7xyTfrEPg77BYyve2z7YkM= + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/quick-lru/download/quick-lru-4.0.1.tgz?cache=0&sync_timestamp=1637478663596&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fquick-lru%2Fdownload%2Fquick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha1-W4h48ROlgheEjGSCAmxz4bpXcn8= + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.npmmirror.com/raf/download/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha1-B0LpmkplUvRF1z4+4DKK8P8e3jk= + dependencies: + performance-now "^2.1.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/randombytes/download/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/randomfill/download/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha1-ySGW/IarQr6YPxvzF3giSTHWFFg= + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc-align@^4.0.0: + version "4.0.11" + resolved "https://registry.npmmirror.com/rc-align/download/rc-align-4.0.11.tgz?cache=0&sync_timestamp=1628678366435&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frc-align%2Fdownload%2Frc-align-4.0.11.tgz#8198c62db266bc1b8ef05e56c13275bf72628a5e" + integrity sha1-gZjGLbJmvBuO8F5WwTJ1v3Jiil4= + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + dom-align "^1.7.0" + lodash "^4.17.21" + rc-util "^5.3.0" + resize-observer-polyfill "^1.5.1" + +rc-cascader@~3.2.1: + version "3.2.1" + resolved "https://registry.npmmirror.com/rc-cascader/download/rc-cascader-3.2.1.tgz#fc928d67d96c3d9f358263e4a9127bcf4257cc6b" + integrity sha512-Raxam9tFzBL4TCgHoyVcf7+Q2KSFneUk3FZXi9w1tfxEihLlezSH0oCNMjHJN8hxWwwx9ZbI9UzWTfFImjXc0Q== + dependencies: + "@babel/runtime" "^7.12.5" + array-tree-filter "^2.1.0" + classnames "^2.3.1" + rc-select "~14.0.0-alpha.23" + rc-tree "~5.4.3" + rc-util "^5.6.1" + +rc-checkbox@~2.3.0: + version "2.3.2" + resolved "https://registry.npmmirror.com/rc-checkbox/download/rc-checkbox-2.3.2.tgz#f91b3678c7edb2baa8121c9483c664fa6f0aefc1" + integrity sha1-+Rs2eMftsrqoEhyUg8Zk+m8K78E= + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + +rc-collapse@~3.1.0: + version "3.1.2" + resolved "https://registry.npmmirror.com/rc-collapse/download/rc-collapse-3.1.2.tgz#76028a811b845d03d9460ccc409c7ea8ad09db14" + integrity sha1-dgKKgRuEXQPZRgzMQJx+qK0J2xQ= + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.3.4" + rc-util "^5.2.1" + shallowequal "^1.1.0" + +rc-dialog@~8.6.0: + version "8.6.0" + resolved "https://registry.npmmirror.com/rc-dialog/download/rc-dialog-8.6.0.tgz?cache=0&sync_timestamp=1627272166293&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frc-dialog%2Fdownload%2Frc-dialog-8.6.0.tgz#3b228dac085de5eed8c6237f31162104687442e7" + integrity sha1-OyKNrAhd5e7YxiN/MRYhBGh0Quc= + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-motion "^2.3.0" + rc-util "^5.6.1" + +rc-drawer@~4.4.2: + version "4.4.3" + resolved "https://registry.npmmirror.com/rc-drawer/download/rc-drawer-4.4.3.tgz?cache=0&sync_timestamp=1637134392366&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Frc-drawer%2Fdownload%2Frc-drawer-4.4.3.tgz#2094937a844e55dc9644236a2d9fba79c344e321" + integrity sha512-FYztwRs3uXnFOIf1hLvFxIQP9MiZJA+0w+Os8dfDh/90X7z/HqP/Yg+noLCIeHEbKln1Tqelv8ymCAN24zPcfQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-util "^5.7.0" + +rc-dropdown@^3.2.0, rc-dropdown@~3.2.0: + version "3.2.2" + resolved "https://registry.npmmirror.com/rc-dropdown/download/rc-dropdown-3.2.2.tgz#0fee9a66f100d686ddaa8d09717d090f72e1ce29" + integrity sha512-oA9VYYg+jQaPRdFoYFfBn5EAQk2NlL6H0vR2v6JG/8i4HEfUq8p1TTt6HyQ/dGxLe8lpnK+nM7WCjgZT/cpSRQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-trigger "^5.0.4" + +rc-field-form@~1.22.0-2: + version "1.22.1" + resolved "https://registry.npmmirror.com/rc-field-form/download/rc-field-form-1.22.1.tgz#0bd2f4e730ff2f071529d00bef28e062362890f5" + integrity sha512-LweU7nBeqmC5r3HDUjRprcOXXobHXp/TGIxD7ppBq5FX6Iptt3ibdpRVg4RSyNulBNGHOuknHlRcguuIpvVMVg== + dependencies: + "@babel/runtime" "^7.8.4" + async-validator "^4.0.2" + rc-util "^5.8.0" + +rc-image@~5.2.5: + version "5.2.5" + resolved "https://registry.npmmirror.com/rc-image/download/rc-image-5.2.5.tgz#44e6ffc842626827960e7ab72e1c0d6f3a8ce440" + integrity sha1-ROb/yEJiaCeWDnq3LhwNbzqM5EA= + dependencies: + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-dialog "~8.6.0" + rc-util "^5.0.6" + +rc-input-number@~7.3.0: + version "7.3.4" + resolved "https://registry.npmmirror.com/rc-input-number/download/rc-input-number-7.3.4.tgz#674aea98260250287d36e330a7e065b174486e9d" + integrity sha512-W9uqSzuvJUnz8H8vsVY4kx+yK51SsAxNTwr8SNH4G3XqQNocLVmKIibKFRjocnYX1RDHMND9FFbgj2h7E7nvGA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.9.8" + +rc-mentions@~1.6.1: + version "1.6.1" + resolved "https://registry.npmmirror.com/rc-mentions/download/rc-mentions-1.6.1.tgz#46035027d64aa33ef840ba0fbd411871e34617ae" + integrity sha1-RgNQJ9ZKoz74QLoPvUEYceNGF64= + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-menu "^9.0.0" + rc-textarea "^0.3.0" + rc-trigger "^5.0.4" + rc-util "^5.0.1" + +rc-menu@^9.0.0: + version "9.3.1" + resolved "https://registry.npmmirror.com/rc-menu/download/rc-menu-9.3.1.tgz#a0e502938d2b7467ea8d343ae00c4af6019ba412" + integrity sha512-D9ZHlwtTpch0v15LXt7PRbAl+FCxXNEllly9fl1GhLzz52iTL2NVqzofecV5Yv3ekLUOojg+gkykv4elLNBKWg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.4.3" + rc-overflow "^1.2.0" + rc-trigger "^5.1.2" + rc-util "^5.12.0" + shallowequal "^1.1.0" + +rc-menu@~9.2.1: + version "9.2.1" + resolved "https://registry.npmmirror.com/rc-menu/download/rc-menu-9.2.1.tgz#6fbe47f4846363bb81a5a21f0960026c3ada497a" + integrity sha512-UbEtn3rflJ8zS+etYGTVQuzy7Fm+yWXR5c0Rl6ecNTS/dPknRyWAyhJcbeR0Hu1+RdQT+0VCqrUPrgKnm4iY+w== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.4.3" + rc-overflow "^1.2.0" + rc-trigger "^5.1.2" + rc-util "^5.12.0" + shallowequal "^1.1.0" + +rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4: + version "2.4.4" + resolved "https://registry.npmmirror.com/rc-motion/download/rc-motion-2.4.4.tgz#e995d5fa24fc93065c24f714857cf2677d655bb0" + integrity sha1-6ZXV+iT8kwZcJPcUhXzyZ31lW7A= + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.2.1" + +rc-notification@~4.5.7: + version "4.5.7" + resolved "https://registry.npmmirror.com/rc-notification/download/rc-notification-4.5.7.tgz#265e6e6a0c1a0fac63d6abd4d832eb8ff31522f1" + integrity sha1-Jl5uagwaD6xj1qvU2DLrj/MVIvE= + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.2.0" + rc-util "^5.0.1" + +rc-overflow@^1.0.0, rc-overflow@^1.2.0: + version "1.2.2" + resolved "https://registry.npmmirror.com/rc-overflow/download/rc-overflow-1.2.2.tgz#95b0222016c0cdbdc0db85f569c262e7706a5f22" + integrity sha1-lbAiIBbAzb3A24X1acJi53BqXyI= + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-resize-observer "^1.0.0" + rc-util "^5.5.1" + +rc-pagination@~3.1.9: + version "3.1.15" + resolved "https://registry.npmmirror.com/rc-pagination/download/rc-pagination-3.1.15.tgz#e05eddf4c15717a5858290bed0857e27e2f957ff" + integrity sha512-4L3fot8g4E+PjWEgoVGX0noFCg+8ZFZmeLH4vsnZpB3O2T2zThtakjNxG+YvSaYtyMVT4B+GLayjKrKbXQpdAg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + +rc-picker@~2.5.17: + version "2.5.19" + resolved "https://registry.npmmirror.com/rc-picker/download/rc-picker-2.5.19.tgz#73d07546fac3992f0bfabf2789654acada39e46f" + integrity sha1-c9B1RvrDmS8L+r8niWVKyto55G8= + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + date-fns "2.x" + dayjs "1.x" + moment "^2.24.0" + rc-trigger "^5.0.4" + rc-util "^5.4.0" + shallowequal "^1.1.0" + +rc-progress@~3.2.1: + version "3.2.4" + resolved "https://registry.npmmirror.com/rc-progress/download/rc-progress-3.2.4.tgz#4036acdae2566438545bc4df2203248babaf7549" + integrity sha512-M9WWutRaoVkPUPIrTpRIDpX0SPSrVHzxHdCRCbeoBFrd9UFWTYNWRlHsruJM5FH1AZI+BwB4wOJUNNylg/uFSw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-util "^5.16.1" + +rc-rate@~2.9.0: + version "2.9.1" + resolved "https://registry.npmmirror.com/rc-rate/download/rc-rate-2.9.1.tgz#e43cb95c4eb90a2c1e0b16ec6614d8c43530a731" + integrity sha1-5Dy5XE65CiweCxbsZhTYxDUwpzE= + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.0.1" + +rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/rc-resize-observer/download/rc-resize-observer-1.2.0.tgz#9f46052f81cdf03498be35144cb7c53fd282c4c7" + integrity sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-util "^5.15.0" + resize-observer-polyfill "^1.5.1" + +rc-select@~14.0.0-alpha.15, rc-select@~14.0.0-alpha.23, rc-select@~14.0.0-alpha.8: + version "14.0.0-alpha.25" + resolved "https://registry.npmmirror.com/rc-select/download/rc-select-14.0.0-alpha.25.tgz#9e6ca83b090e020a730fdfdab07c1050549426e4" + integrity sha512-U9AMzXsOCCdtn96YIZdUrYbxk+5u6uWUCaYH2129X3FTjQITqAjEPYHfPcxU/G7+lwiD0pIaU95W0NMkg+26qw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-overflow "^1.0.0" + rc-trigger "^5.0.4" + rc-util "^5.16.1" + rc-virtual-list "^3.2.0" + +rc-slider@~9.7.4: + version "9.7.5" + resolved "https://registry.npmmirror.com/rc-slider/download/rc-slider-9.7.5.tgz#193141c68e99b1dc3b746daeb6bf852946f5b7f4" + integrity sha512-LV/MWcXFjco1epPbdw1JlLXlTgmWpB9/Y/P2yinf8Pg3wElHxA9uajN21lJiWtZjf5SCUekfSP6QMJfDo4t1hg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-tooltip "^5.0.1" + rc-util "^5.16.1" + shallowequal "^1.1.0" + +rc-steps@~4.1.0: + version "4.1.4" + resolved "https://registry.npmmirror.com/rc-steps/download/rc-steps-4.1.4.tgz#0ba82db202d59ca52d0693dc9880dd145b19dc23" + integrity sha1-C6gtsgLVnKUtBpPcmIDdFFsZ3CM= + dependencies: + "@babel/runtime" "^7.10.2" + classnames "^2.2.3" + rc-util "^5.0.1" + +rc-switch@~3.2.0: + version "3.2.2" + resolved "https://registry.npmmirror.com/rc-switch/download/rc-switch-3.2.2.tgz#d001f77f12664d52595b4f6fb425dd9e66fba8e8" + integrity sha1-0AH3fxJmTVJZW09vtCXdnmb7qOg= + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-util "^5.0.1" + +rc-table@~7.22.2: + version "7.22.2" + resolved "https://registry.npmmirror.com/rc-table/download/rc-table-7.22.2.tgz#218f3f53bc91660560a344c8290a91a841a60b0a" + integrity sha512-Ng2gNkGi6ybl6dzneRn2H4Gp8XhIbRa5rXQ7ZhZcgWVmfVMok70UHGPXcf68tXW6O0/qckTf/eOVsoviSvK4sw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-resize-observer "^1.1.0" + rc-util "^5.14.0" + shallowequal "^1.1.0" + +rc-tabs@~11.10.0: + version "11.10.5" + resolved "https://registry.npmmirror.com/rc-tabs/download/rc-tabs-11.10.5.tgz#53bbb642d04b307f8ce86e318ab99d519507b29b" + integrity sha512-DDuUdV6b9zGRYLtjI5hyejWLKoz1QiLWNgMeBzc3aMeQylZFhTYnFGdDc6HRqj5IYearNTsFPVSA+6VIT8g5cg== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "2.x" + rc-dropdown "^3.2.0" + rc-menu "^9.0.0" + rc-resize-observer "^1.0.0" + rc-util "^5.5.0" + +rc-textarea@^0.3.0, rc-textarea@~0.3.0: + version "0.3.7" + resolved "https://registry.npmmirror.com/rc-textarea/download/rc-textarea-0.3.7.tgz#987142891efdedb774883c07e2f51b318fde5a11" + integrity sha512-yCdZ6binKmAQB13hc/oehh0E/QRwoPP1pjF21aHBxlgXO3RzPF6dUu4LG2R4FZ1zx/fQd2L1faktulrXOM/2rw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-resize-observer "^1.0.0" + rc-util "^5.7.0" + shallowequal "^1.1.0" + +rc-tooltip@^5.0.1, rc-tooltip@~5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/rc-tooltip/download/rc-tooltip-5.1.1.tgz#94178ed162d0252bc4993b725f5dc2ac0fccf154" + integrity sha1-lBeO0WLQJSvEmTtyX13CrA/M8VQ= + dependencies: + "@babel/runtime" "^7.11.2" + rc-trigger "^5.0.0" + +rc-tree-select@~5.1.1: + version "5.1.2" + resolved "https://registry.npmmirror.com/rc-tree-select/download/rc-tree-select-5.1.2.tgz#0dfe12f01b9b0dc9ce658b96501692d4421b8366" + integrity sha512-sTulyQZB1SgF2HzAR49i4vjMNvV/tfPxCTc+qNuWOwaAtSm2bwGH6/wfi3k3Dw2/5PPOGpRRpgCMltoP9aG0+w== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-select "~14.0.0-alpha.8" + rc-tree "~5.4.3" + rc-util "^5.16.1" + +rc-tree@~5.4.3: + version "5.4.3" + resolved "https://registry.npmmirror.com/rc-tree/download/rc-tree-5.4.3.tgz#8674644964e17e5ab9b111c5aa18676f673e7bd0" + integrity sha512-WAHV8FkBerulj9J/+61+Qn0TD/Zo37PrDG8/45WomzGTYavxFMur9YguKjQj/J+NxjVJzrJL3lvdSZsumfdbiA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-util "^5.16.1" + rc-virtual-list "^3.4.1" + +rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.10: + version "5.2.10" + resolved "https://registry.npmmirror.com/rc-trigger/download/rc-trigger-5.2.10.tgz#8a0057a940b1b9027eaa33beec8a6ecd85cce2b1" + integrity sha1-igBXqUCxuQJ+qjO+7IpuzYXM4rE= + dependencies: + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-align "^4.0.0" + rc-motion "^2.0.0" + rc-util "^5.5.0" + +rc-upload@~4.3.0: + version "4.3.3" + resolved "https://registry.npmmirror.com/rc-upload/download/rc-upload-4.3.3.tgz#e237aa525e5313fa16f4d04d27f53c2f0e157bb8" + integrity sha512-YoJ0phCRenMj1nzwalXzciKZ9/FAaCrFu84dS5pphwucTC8GUWClcDID/WWNGsLFcM97NqIboDqrV82rVRhW/w== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.2.0" + +rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.0.7, rc-util@^5.12.0, rc-util@^5.14.0, rc-util@^5.15.0, rc-util@^5.16.1, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.5.0, rc-util@^5.5.1, rc-util@^5.6.1, rc-util@^5.7.0, rc-util@^5.8.0, rc-util@^5.9.4, rc-util@^5.9.8: + version "5.17.0" + resolved "https://registry.npmmirror.com/rc-util/download/rc-util-5.17.0.tgz#6b0788038075c3d5c215541539573a4a03827070" + integrity sha512-HWuTIKzBeZQQ7IBqdokE0wMp/xx39/KfUJ0gcquBigoldDCrf3YBcWFHrrQlJG7sI82Wg8mwp1uAKV3zMGfAgg== + dependencies: + "@babel/runtime" "^7.12.5" + react-is "^16.12.0" + shallowequal "^1.1.0" + +rc-virtual-list@^3.2.0, rc-virtual-list@^3.4.1: + version "3.4.2" + resolved "https://registry.npmmirror.com/rc-virtual-list/download/rc-virtual-list-3.4.2.tgz#1078327aa7230b5e456d679ed2ce99f3c036ebd1" + integrity sha1-EHgyeqcjC15FbWee0s6Z88A269E= + dependencies: + classnames "^2.2.6" + rc-resize-observer "^1.0.0" + rc-util "^5.0.7" + +react-app-polyfill@^1.0.6: + version "1.0.6" + resolved "https://registry.npmmirror.com/react-app-polyfill/download/react-app-polyfill-1.0.6.tgz#890f8d7f2842ce6073f030b117de9130a5f385f0" + integrity sha1-iQ+NfyhCzmBz8DCxF96RMKXzhfA= + dependencies: + core-js "^3.5.0" + object-assign "^4.1.1" + promise "^8.0.3" + raf "^3.4.1" + regenerator-runtime "^0.13.3" + whatwg-fetch "^3.0.0" + +react-app-rewired@^2.1.6: + version "2.1.11" + resolved "https://registry.npmmirror.com/react-app-rewired/download/react-app-rewired-2.1.11.tgz#ad5781e3ef5e506be935898bb7642f7f9d50b61a" + integrity sha512-zRIqJUPsCoPnfYtea3xgPbKR42vx0NoH5oo8R8FELXqzkjJHa39V6zD8CAdkLJoYL8V3JScWHAfKMZOzi1Ydmw== + dependencies: + semver "^5.6.0" + +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/react-base16-styling/download/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" + integrity sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw= + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + +react-dev-utils@^10.2.1: + version "10.2.1" + resolved "https://registry.npmmirror.com/react-dev-utils/download/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" + integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== + dependencies: + "@babel/code-frame" "7.8.3" + address "1.1.2" + browserslist "4.10.0" + chalk "2.4.2" + cross-spawn "7.0.1" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.0.1" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "3.1.1" + global-modules "2.0.0" + globby "8.0.2" + gzip-size "5.1.1" + immer "1.10.0" + inquirer "7.0.4" + is-root "2.1.0" + loader-utils "1.2.3" + open "^7.0.2" + pkg-up "3.1.0" + react-error-overlay "^6.0.7" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + +react-dnd-html5-backend@^11.1.3: + version "11.1.3" + resolved "https://registry.npmmirror.com/react-dnd-html5-backend/download/react-dnd-html5-backend-11.1.3.tgz#2749f04f416ec230ea193f5c1fbea2de7dffb8f7" + integrity sha1-J0nwT0FuwjDqGT9cH76i3n3/uPc= + dependencies: + dnd-core "^11.1.3" + +react-dnd@^11.1.3: + version "11.1.3" + resolved "https://registry.npmmirror.com/react-dnd/download/react-dnd-11.1.3.tgz#f9844f5699ccc55dfc81462c2c19f726e670c1af" + integrity sha1-+YRPVpnMxV38gUYsLBn3JuZwwa8= + dependencies: + "@react-dnd/shallowequal" "^2.0.0" + "@types/hoist-non-react-statics" "^3.3.1" + dnd-core "^11.1.3" + hoist-non-react-statics "^3.3.0" + +react-dom@^16.13.1: + version "16.14.0" + resolved "https://registry.npmmirror.com/react-dom/download/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-error-overlay@^6.0.7: + version "6.0.10" + resolved "https://registry.npmmirror.com/react-error-overlay/download/react-error-overlay-6.0.10.tgz#0fe26db4fa85d9dbb8624729580e90e7159a59a6" + integrity sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA== + +react-highlight-words@^0.16.0: + version "0.16.0" + resolved "https://registry.npmmirror.com/react-highlight-words/download/react-highlight-words-0.16.0.tgz#4b4b9824e3d2b98789d3e3b3aedb5e961ae1b7cf" + integrity sha1-S0uYJOPSuYeJ0+Ozrttelhrht88= + dependencies: + highlight-words-core "^1.2.0" + memoize-one "^4.0.0" + prop-types "^15.5.8" + +react-i18next@^11.7.3: + version "11.15.3" + resolved "https://registry.npmmirror.com/react-i18next/download/react-i18next-11.15.3.tgz#7608fb3cacc02ac75a62fc2d68b579f140b198dd" + integrity sha512-RSUEM4So3Tu2JHV0JsZ5Yje+4nz66YViMfPZoywxOy0xyn3L7tE2CHvJ7Y9LUsrTU7vGmZ5bwb8PpjnkatdIxg== + dependencies: + "@babel/runtime" "^7.14.5" + html-escaper "^2.0.2" + html-parse-stringify "^3.0.1" + +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.4: + version "16.13.1" + resolved "https://registry.npmmirror.com/react-is/download/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha1-eJcppNw23imZ3BVt1sHZwYzqVqQ= + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmmirror.com/react-is/download/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha1-5pHUqOnHiTZWVVOas3J2Kw77VPA= + +react-json-view@^1.19.1: + version "1.21.3" + resolved "https://registry.npmmirror.com/react-json-view/download/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + integrity sha1-8YQgnujxvzdPsMQbCBPP9UVJxHU= + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^8.3.2" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/react-lifecycles-compat/download/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha1-TxonOv38jzSIqMUWv9p4+HI1I2I= + +react-popper-tooltip@^2.11.1: + version "2.11.1" + resolved "https://registry.npmmirror.com/react-popper-tooltip/download/react-popper-tooltip-2.11.1.tgz#3c4bdfd8bc10d1c2b9a162e859bab8958f5b2644" + integrity sha1-PEvf2LwQ0cK5oWLoWbq4lY9bJkQ= + dependencies: + "@babel/runtime" "^7.9.2" + react-popper "^1.3.7" + +react-popper@^1.3.7: + version "1.3.11" + resolved "https://registry.npmmirror.com/react-popper/download/react-popper-1.3.11.tgz#a2cc3f0a67b75b66cfa62d2c409f9dd1fcc71ffd" + integrity sha1-osw/Cme3W2bPpi0sQJ+d0fzHH/0= + dependencies: + "@babel/runtime" "^7.1.2" + "@hypnosphi/create-react-context" "^0.3.1" + deep-equal "^1.1.1" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.7" + warning "^4.0.2" + +react-scripts@3.4.1: + version "3.4.1" + resolved "https://registry.npmmirror.com/react-scripts/download/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a" + integrity sha1-9VEpi1xxmFzEkbms88jowK462go= + dependencies: + "@babel/core" "7.9.0" + "@svgr/webpack" "4.3.3" + "@typescript-eslint/eslint-plugin" "^2.10.0" + "@typescript-eslint/parser" "^2.10.0" + babel-eslint "10.1.0" + babel-jest "^24.9.0" + babel-loader "8.1.0" + babel-plugin-named-asset-import "^0.3.6" + babel-preset-react-app "^9.1.2" + camelcase "^5.3.1" + case-sensitive-paths-webpack-plugin "2.3.0" + css-loader "3.4.2" + dotenv "8.2.0" + dotenv-expand "5.1.0" + eslint "^6.6.0" + eslint-config-react-app "^5.2.1" + eslint-loader "3.0.3" + eslint-plugin-flowtype "4.6.0" + eslint-plugin-import "2.20.1" + eslint-plugin-jsx-a11y "6.2.3" + eslint-plugin-react "7.19.0" + eslint-plugin-react-hooks "^1.6.1" + file-loader "4.3.0" + fs-extra "^8.1.0" + html-webpack-plugin "4.0.0-beta.11" + identity-obj-proxy "3.0.0" + jest "24.9.0" + jest-environment-jsdom-fourteen "1.0.1" + jest-resolve "24.9.0" + jest-watch-typeahead "0.4.2" + mini-css-extract-plugin "0.9.0" + optimize-css-assets-webpack-plugin "5.0.3" + pnp-webpack-plugin "1.6.4" + postcss-flexbugs-fixes "4.1.0" + postcss-loader "3.0.0" + postcss-normalize "8.0.1" + postcss-preset-env "6.7.0" + postcss-safe-parser "4.0.1" + react-app-polyfill "^1.0.6" + react-dev-utils "^10.2.1" + resolve "1.15.0" + resolve-url-loader "3.1.1" + sass-loader "8.0.2" + semver "6.3.0" + style-loader "0.23.1" + terser-webpack-plugin "2.3.5" + ts-pnp "1.1.6" + url-loader "2.3.0" + webpack "4.42.0" + webpack-dev-server "3.10.3" + webpack-manifest-plugin "2.2.0" + workbox-webpack-plugin "4.3.1" + optionalDependencies: + fsevents "2.1.2" + +react-textarea-autosize@^8.3.2: + version "8.3.3" + resolved "https://registry.npmmirror.com/react-textarea-autosize/download/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8" + integrity sha1-9wkTlFNp2kU/1VTBaPa6rNH6BNg= + dependencies: + "@babel/runtime" "^7.10.2" + use-composed-ref "^1.0.0" + use-latest "^1.0.0" + +react@^16.13.1: + version "16.14.0" + resolved "https://registry.npmmirror.com/react/download/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/read-pkg-up/download/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/read-pkg-up/download/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha1-GyIcYIi6d5lgHICPkRYcZuWPiXg= + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/read-pkg-up/download/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha1-86YTV1hFlzOuK5VjgFbhhU5+9Qc= + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/read-pkg/download/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/read-pkg/download/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/read-pkg/download/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w= + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.npmmirror.com/readable-stream/download/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readable-stream/download/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha1-M3u9o63AcGvT4CRCaihtS0sskZg= + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/readdirp/download/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha1-DodiKjMlqjPokihcr4tOhGUppSU= + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readdirp/download/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc= + dependencies: + picomatch "^2.2.1" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/realpath-native/download/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha1-IAMpT+oj+wZy8kduviL89Jii1lw= + dependencies: + util.promisify "^1.0.0" + +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.npmmirror.com/recursive-readdir/download/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha1-mUb7MnThYo3m42svZxSVO0hFCU8= + dependencies: + minimatch "3.0.4" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/redent/download/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha1-5Ve3mYMWu1PJ8fVvpiY1LGljBZ8= + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +redux@^4.0.4: + version "4.1.2" + resolved "https://registry.npmmirror.com/redux/download/redux-4.1.2.tgz#140f35426d99bb4729af760afcf79eaaac407104" + integrity sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw== + dependencies: + "@babel/runtime" "^7.9.2" + +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.npmmirror.com/regenerate-unicode-properties/download/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha1-VNCccRXh9T3CMUqXSzLBw0Tv4yY= + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmmirror.com/regenerate/download/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo= + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.npmmirror.com/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.npmmirror.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.npmmirror.com/regenerator-transform/download/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ= + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/regex-not/download/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@2.2.10: + version "2.2.10" + resolved "https://registry.npmmirror.com/regex-parser/download/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" + integrity sha1-nmao9z2JoQdhbmOznU3t3+6RKzc= + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/regexp.prototype.flags/download/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" + integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/regexpp/download/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha1-jRnTHPYySCtYkEn4KB+T28uk0H8= + +regexpp@^3.0.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/regexpp/download/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha1-BCWido2PI7rXDKS5BGH6LxIT4bI= + +regexpu-core@^4.7.1: + version "4.8.0" + resolved "https://registry.npmmirror.com/regexpu-core/download/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha1-5WBbo2G2excYR4UBMnUC9EeamPA= + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.npmmirror.com/regjsgen/download/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM= + +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.npmmirror.com/regjsparser/download/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha1-prZntUyIXhi1JVTLSWDvcRh+mWg= + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.npmmirror.com/relateurl/download/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.npmmirror.com/remark-parse/download/remark-parse-9.0.0.tgz?cache=0&sync_timestamp=1637259966298&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fremark-parse%2Fdownload%2Fremark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha1-TSCimWZYgOT0r12Qt8e4qTWFNkA= + dependencies: + mdast-util-from-markdown "^0.8.0" + +remark-stringify@^9.0.0: + version "9.0.1" + resolved "https://registry.npmmirror.com/remark-stringify/download/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" + integrity sha1-V20G6RBUiwpxkacfJ7M/EhiGKJQ= + dependencies: + mdast-util-to-markdown "^0.6.0" + +remark@^13.0.0: + version "13.0.0" + resolved "https://registry.npmmirror.com/remark/download/remark-13.0.0.tgz?cache=0&sync_timestamp=1637260202521&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fremark%2Fdownload%2Fremark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425" + integrity sha1-0V2b9xpAL0Aofr42Bntm1Uho5CU= + dependencies: + remark-parse "^9.0.0" + remark-stringify "^9.0.0" + unified "^9.1.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.npmmirror.com/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.4: + version "2.0.7" + resolved "https://registry.npmmirror.com/renderkid/download/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + integrity sha1-Rk8namvc7mBvShWZP5sp/HTKhgk= + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.npmmirror.com/repeat-element/download/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek= + +repeat-string@^1.0.0, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.npmmirror.com/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/request-promise-core/download/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha1-Pu3UIjII1BmGe3jOgVFn0QWToi8= + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5: + version "1.0.9" + resolved "https://registry.npmmirror.com/request-promise-native/download/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha1-5AcSBSal79yaObKKVnm/R7nZ3Cg= + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0, request@^2.88.0: + version "2.88.2" + resolved "https://registry.npmmirror.com/request/download/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/require-directory/download/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/require-from-string/download/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/require-main-filename/download/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/require-main-filename/download/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs= + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/resolve-cwd/download/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/resolve-from/download/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/resolve-from/download/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY= + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/resolve-from/download/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha1-w1IlhD3493bfIcV1V7wIfp39/Gk= + +resolve-url-loader@3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/resolve-url-loader/download/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" + integrity sha1-KJMYlfoeq5vgZH07KVjBAK48C/A= + dependencies: + adjust-sourcemap-loader "2.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.npmmirror.com/resolve/download/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@1.15.0: + version "1.15.0" + resolved "https://registry.npmmirror.com/resolve/download/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" + integrity sha1-G3ypYHPrtS50H/15n2s56kYsZ/U= + dependencies: + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: + version "1.22.0" + resolved "https://registry.npmmirror.com/resolve/download/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/restore-cursor/download/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha1-OfZ8VLOnpYzqUjbZXPADQjljH34= + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.npmmirror.com/ret/download/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmmirror.com/retry/download/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/reusify/download/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY= + +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/rework-visit/download/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/rework/download/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/rgb-regex/download/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/rgba-regex/download/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.npmmirror.com/rimraf/download/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha1-stEE/g2Psnz54KHNqCYt04M8bKs= + dependencies: + glob "^7.1.3" + +rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.npmmirror.com/rimraf/download/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w= + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/rimraf/download/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho= + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/ripemd160/download/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw= + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.npmmirror.com/rsvp/download/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha1-yPFVMR0Wf2jyHhaN9x7FsIMRNzQ= + +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.npmmirror.com/run-async/download/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU= + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmmirror.com/run-parallel/download/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4= + dependencies: + queue-microtask "^1.2.2" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/run-queue/download/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.5.3, rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.npmmirror.com/rxjs/download/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmmirror.com/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/safe-regex/download/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.npmmirror.com/sane/download/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha1-7Ygf2SJzOmxGG8GJ3CtsAG8//e0= + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sanitize.css@^10.0.0: + version "10.0.0" + resolved "https://registry.npmmirror.com/sanitize.css/download/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" + integrity sha1-tcslR+lthimmCUdURmUkOx3DZXo= + +sass-loader@8.0.2: + version "8.0.2" + resolved "https://registry.npmmirror.com/sass-loader/download/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.6.1" + semver "^6.3.0" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.npmmirror.com/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk= + +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.npmmirror.com/saxes/download/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha1-1Z0f0zLskq2YouCy7mRHAjhLHFs= + dependencies: + xmlchars "^2.1.1" + +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.npmmirror.com/scheduler/download/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha1-Tz4u0sGn1laB9MhU+oxaHMtA8ZY= + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/schema-utils/download/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A= + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.npmmirror.com/schema-utils/download/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc= + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +scroll-into-view-if-needed@^2.2.25: + version "2.2.28" + resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/download/scroll-into-view-if-needed-2.2.28.tgz#5a15b2f58a52642c88c8eca584644e01703d645a" + integrity sha1-WhWy9YpSZCyIyOylhGROAXA9ZFo= + dependencies: + compute-scroll-into-view "^1.0.17" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/select-hose/download/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.7: + version "1.10.14" + resolved "https://registry.npmmirror.com/selfsigned/download/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" + integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== + dependencies: + node-forge "^0.10.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.2, semver@^7.3.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/serialize-javascript/download/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha1-7OxTsOAxe9yV73arcHS3OEeF+mE= + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/serialize-javascript/download/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao= + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmmirror.com/serve-index/download/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/set-value/download/set-value-2.0.1.tgz?cache=0&sync_timestamp=1631437838608&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fset-value%2Fdownload%2Fset-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha1-oY1AUw5vB95CKMfe/kInr4ytAFs= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/setimmediate/download/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/setprototypeof/download/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY= + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.npmmirror.com/sha.js/download/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/shallow-clone/download/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/shallow-clone/download/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha1-jymBrZJTH1UDWwH7IwdppA4C76M= + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/shallowequal/download/shallowequal-1.1.0.tgz?cache=0&sync_timestamp=1624608058307&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshallowequal%2Fdownload%2Fshallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha1-GI1SHelbkIdAT9TctosT3wrk5/g= + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/shebang-command/download/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/download/shebang-regex-1.0.0.tgz?cache=0&sync_timestamp=1628896660639&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/download/shebang-regex-3.0.0.tgz?cache=0&sync_timestamp=1628896660639&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.npmmirror.com/shell-quote/download/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha1-Z6fQLHbJ2iT5nSCAj8re0ODgS+I= + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/shellwords/download/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha1-1rkYHBpI05cyTISHHvvPxz/AZUs= + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.6" + resolved "https://registry.npmmirror.com/signal-exit/download/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmmirror.com/simple-swizzle/download/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/sisteransi/download/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha1-E01oEpd1ZDfMBcoBNw06elcQde0= + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/slash/download/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/slash/download/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q= + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/slash/download/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ= + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/slice-ansi/download/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY= + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/slice-ansi/download/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms= + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/snapdragon-node/download/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/snapdragon-util/download/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI= + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.npmmirror.com/snapdragon/download/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0= + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/sockjs-client/download/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha1-yfJWjhnI/YFztJl+o0IOC7MGx9U= + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.npmmirror.com/sockjs/download/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/sort-keys/download/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/source-list-map/download/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ= + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.npmmirror.com/source-map-resolve/download/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha1-GQhmvs51U+H48mei7oLGBrVQmho= + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6, source-map-support@~0.5.12: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.npmmirror.com/source-map-url/download/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha1-CvZmBadFpaL5HPG7+KevvCg97FY= + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmmirror.com/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.npmmirror.com/source-map/download/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/spdx-correct/download/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha1-3s6BrJweZxPl99G28X1Gj6U9iak= + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0= + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha1-z3D1BILu/cmOPOCmgz5KU87rpnk= + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.11" + resolved "https://registry.npmmirror.com/spdx-license-ids/download/spdx-license-ids-3.0.11.tgz?cache=0&sync_timestamp=1636978442514&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/spdy-transport/download/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha1-ANSGOmQArXXfkzYaFghgXl3NzzE= + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/spdy/download/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha1-t09GYgOj7aRSwCSSuR+56EonZ3s= + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +specificity@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/specificity/download/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" + integrity sha1-qrXmRQEtsIuhguFRFlc40AiHsBk= + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/split-string/download/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.npmmirror.com/sshpk/download/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.2" + resolved "https://registry.npmmirror.com/ssri/download/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha1-FXk5E08gRk5zAd26PpD/qPdyisU= + dependencies: + figgy-pudding "^3.5.1" + +ssri@^7.0.0: + version "7.1.1" + resolved "https://registry.npmmirror.com/ssri/download/ssri-7.1.1.tgz#33e44f896a967158e3c63468e47ec46613b95b5f" + integrity sha1-M+RPiWqWcVjjxjRo5H7EZhO5W18= + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npmmirror.com/stable/download/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88= + +stack-utils@^1.0.1: + version "1.0.5" + resolved "https://registry.npmmirror.com/stack-utils/download/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha1-oZsLAZR+ACnI5FHV1hpJj1uxRxs= + dependencies: + escape-string-regexp "^2.0.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.npmmirror.com/static-extend/download/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmmirror.com/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/stealthy-require/download/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/stream-browserify/download/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs= + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.npmmirror.com/stream-each/download/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha1-6+J6DDibBPvMIzZClS4Qcxr6m64= + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.npmmirror.com/stream-http/download/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw= + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/stream-shift/download/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha1-1wiCgVWasneEJCebCHfaPDktWj0= + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-convert@^0.2.0: + version "0.2.1" + resolved "https://registry.npmmirror.com/string-convert/download/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + integrity sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/string-length/download/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-length@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/string-length/download/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + integrity sha1-EH74wjRW4Yeoq9SmEWL/SsbiWDc= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^5.2.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/string-width/download/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/string-width/download/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha1-InZ74htirxCBV0MG9prFG2IgOWE= + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA= + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.2: + version "4.0.6" + resolved "https://registry.npmmirror.com/string.prototype.matchall/download/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + integrity sha1-Wrtdq8lMew6iOA9lumELOlRLFfo= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha1-51rpDClCxjUEaGwYsoe0oLGkX4A= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmmirror.com/string_decoder/download/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4= + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/stringify-object/download/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha1-cDBlrvyhkwDTzoivT1s5VtdVZik= + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI= + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk= + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/strip-bom/download/strip-bom-3.0.0.tgz?cache=0&sync_timestamp=1624608094529&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-bom%2Fdownload%2Fstrip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-comments@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/strip-comments/download/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + integrity sha1-grnEXn8FhzvuU/NxaK+TCqNoZ50= + dependencies: + babel-extract-comments "^1.0.0" + babel-plugin-transform-object-rest-spread "^6.26.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/strip-eof/download/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/strip-indent/download/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha1-wy4c7pQLazQyx3G8LFS8znPNMAE= + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.0.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/strip-json-comments/download/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY= + +style-loader@0.23.1: + version "0.23.1" + resolved "https://registry.npmmirror.com/style-loader/download/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/style-search/download/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" + integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= + +style-value-types@^3.1.9: + version "3.2.0" + resolved "https://registry.npmmirror.com/style-value-types/download/style-value-types-3.2.0.tgz#eb89cab1340823fa7876f3e289d29d99c92111bb" + integrity sha1-64nKsTQII/p4dvPiidKdmckhEbs= + dependencies: + hey-listen "^1.0.8" + tslib "^1.10.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.npmmirror.com/stylehacks/download/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU= + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +stylelint-config-recommended@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/stylelint-config-recommended/download/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657" + integrity sha1-4OVHQ0AWxVOf4mUK/VgEmi/R1lc= + +stylelint-config-standard@^20.0.0: + version "20.0.0" + resolved "https://registry.npmmirror.com/stylelint-config-standard/download/stylelint-config-standard-20.0.0.tgz?cache=0&sync_timestamp=1636911768470&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstylelint-config-standard%2Fdownload%2Fstylelint-config-standard-20.0.0.tgz#06135090c9e064befee3d594289f50e295b5e20d" + integrity sha1-BhNQkMngZL7+49WUKJ9Q4pW14g0= + dependencies: + stylelint-config-recommended "^3.0.0" + +stylelint@^13.6.1: + version "13.13.1" + resolved "https://registry.npmmirror.com/stylelint/download/stylelint-13.13.1.tgz#fca9c9f5de7990ab26a00f167b8978f083a18f3c" + integrity sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ== + dependencies: + "@stylelint/postcss-css-in-js" "^0.37.2" + "@stylelint/postcss-markdown" "^0.36.2" + autoprefixer "^9.8.6" + balanced-match "^2.0.0" + chalk "^4.1.1" + cosmiconfig "^7.0.0" + debug "^4.3.1" + execall "^2.0.0" + fast-glob "^3.2.5" + fastest-levenshtein "^1.0.12" + file-entry-cache "^6.0.1" + get-stdin "^8.0.0" + global-modules "^2.0.0" + globby "^11.0.3" + globjoin "^0.1.4" + html-tags "^3.1.0" + ignore "^5.1.8" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + known-css-properties "^0.21.0" + lodash "^4.17.21" + log-symbols "^4.1.0" + mathml-tag-names "^2.1.3" + meow "^9.0.0" + micromatch "^4.0.4" + normalize-selector "^0.2.0" + postcss "^7.0.35" + postcss-html "^0.36.0" + postcss-less "^3.1.4" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^4.0.2" + postcss-sass "^0.4.4" + postcss-scss "^2.1.1" + postcss-selector-parser "^6.0.5" + postcss-syntax "^0.36.2" + postcss-value-parser "^4.1.0" + resolve-from "^5.0.0" + slash "^3.0.0" + specificity "^0.4.1" + string-width "^4.2.2" + strip-ansi "^6.0.0" + style-search "^0.1.0" + sugarss "^2.0.0" + svg-tags "^1.0.0" + table "^6.6.0" + v8-compile-cache "^2.3.0" + write-file-atomic "^3.0.3" + +sugarss@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/sugarss/download/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d" + integrity sha1-3dduASSyl9QL88yjHIsi7LQ7xh0= + dependencies: + postcss "^7.0.2" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/supports-color/download/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmmirror.com/supports-color/download/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/supports-color/download/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha1-B2Srxpxj1ayELdSGfo0CXogN+PM= + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha1-G33NyzK4E4gBs+R4umpRyqiWSNo= + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/download/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.0: + version "2.0.4" + resolved "https://registry.npmmirror.com/svg-parser/download/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha1-/cLinhOVFzYUC3bLEiyO5mMOtrU= + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/svg-tags/download/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= + +svgo@^1.0.0, svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.npmmirror.com/svgo/download/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.npmmirror.com/symbol-tree/download/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha1-QwY30ki6d+B4iDlR+5qg7tfGP6I= + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.npmmirror.com/table/download/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha1-EpLRlQDOP4YFOwXw6Ofko7shB54= + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +table@^6.6.0: + version "6.8.0" + resolved "https://registry.npmmirror.com/table/download/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/tapable/download/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +terser-webpack-plugin@2.3.5: + version "2.3.5" + resolved "https://registry.npmmirror.com/terser-webpack-plugin/download/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81" + integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.2.0" + jest-worker "^25.1.0" + p-limit "^2.2.2" + schema-utils "^2.6.4" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.4.3" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.npmmirror.com/terser-webpack-plugin/download/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2, terser@^4.4.3, terser@^4.6.3: + version "4.8.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" + integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.npmmirror.com/test-exclude/download/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha1-w9Ph4xHrfuQF4JLawQrv0JCR6sA= + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +text-table@0.2.0, text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/text-table/download/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/throat/download/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.npmmirror.com/through2/download/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0= + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.npmmirror.com/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmmirror.com/thunky/download/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30= + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.npmmirror.com/timers-browserify/download/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha1-RKRcEfv0B/NPl7zNFXfGUjYbAO4= + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/timsort/download/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmmirror.com/tmp/download/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/tmpl/download/tmpl-1.0.5.tgz?cache=0&sync_timestamp=1630997304688&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftmpl%2Fdownload%2Ftmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha1-hoPguQK7nCDE9ybjwLafNlGMB8w= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/to-object-path/download/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/to-regex-range/download/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/to-regex/download/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.npmmirror.com/toggle-selection/download/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.npmmirror.com/tough-cookie/download/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha1-zZ+yoKodWhK0c72fuW+j3P9lreI= + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/tr46/download/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmmirror.com/tr46/download/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/trim-newlines/download/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha1-Jgpdli2LdSQlsy86fbDcrNF2wUQ= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.npmmirror.com/trough/download/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha1-uLY5zvrX0LsqvTfUM/+Ck++l9AY= + +ts-pnp@1.1.6: + version "1.1.6" + resolved "https://registry.npmmirror.com/ts-pnp/download/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" + integrity sha1-OJokOW1CWg0xYultK0Y4kA/cKJo= + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.npmmirror.com/ts-pnp/download/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha1-pQCtCEsHmPHDBxrzkeZZEshrypI= + +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.npmmirror.com/tslib/download/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3: + version "2.3.1" + resolved "https://registry.npmmirror.com/tslib/download/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tsutils@^3.17.1: + version "3.21.0" + resolved "https://registry.npmmirror.com/tsutils/download/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM= + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.npmmirror.com/tty-browserify/download/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmmirror.com/tweetnacl/download/tweetnacl-0.14.5.tgz?cache=0&sync_timestamp=1624607953624&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftweetnacl%2Fdownload%2Ftweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npmmirror.com/type-check/download/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha1-20vBUaSiz07r+a3V23VQjbbMhB8= + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc= + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha1-jSojcNPfiG61yQraHFv2GIrPg4s= + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha1-CeJJ696FHTseSNJ8EFREZn8XuD0= + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.npmmirror.com/type/download/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.5.0: + version "2.5.0" + resolved "https://registry.npmmirror.com/type/download/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + +typed-styles@^0.0.7: + version "0.0.7" + resolved "https://registry.npmmirror.com/typed-styles/download/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + integrity sha1-kzkqAIeUxFlRGf9i3eaAnbxAo9k= + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmmirror.com/typedarray-to-buffer/download/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha1-qX7nqf9CaRufeD/xvFES/j/KkIA= + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmmirror.com/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^3.9.6: + version "3.9.10" + resolved "https://registry.npmmirror.com/typescript/download/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== + +ua-parser-js@^0.7.30: + version "0.7.33" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" + integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/unbox-primitive/download/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha1-CF4hViXsMWJXTciFmr7nilmxRHE= + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631615391251&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-canonical-property-names-ecmascript%2Fdownload%2Funicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha1-MBrNxSVjFnDTn2FG4Od/9rvevdw= + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631618607567&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-match-property-ecmascript%2Fdownload%2Funicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha1-VP0W4OyxZ88Ezx91a9zJLrp5dsM= + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631618158421&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-match-property-value-ecmascript%2Fdownload%2Funicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha1-GgGqVyR8FMVouJd1pUk4eIGJpxQ= + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-property-aliases-ecmascript%2Fdownload%2Funicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha1-CjbLmlhcT2q9Ua0d7dsoXBZSl8g= + +unified@^9.1.0: + version "9.2.2" + resolved "https://registry.npmmirror.com/unified/download/unified-9.2.2.tgz?cache=0&sync_timestamp=1637256363650&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Funified%2Fdownload%2Funified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha1-Z2SaGr/Dq4XSlpUCkCd16wMUaXU= + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/union-value/download/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/uniq/download/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/uniqs/download/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/unique-filename/download/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA= + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.npmmirror.com/unique-slug/download/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha1-uqvOkQg/xk6UWw861hPiZPfNTmw= + dependencies: + imurmurhash "^0.1.4" + +unist-util-find-all-after@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/unist-util-find-all-after/download/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6" + integrity sha1-/f7NFMW3rqXp7zjV4NX3dO61YfY= + dependencies: + unist-util-is "^4.0.0" + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/unist-util-is/download/unist-util-is-4.1.0.tgz?cache=0&sync_timestamp=1626875281214&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-is%2Fdownload%2Funist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha1-l25fRip6Xec9lLcGusG5BnG1d5c= + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.npmmirror.com/unist-util-stringify-position/download/unist-util-stringify-position-2.0.3.tgz?cache=0&sync_timestamp=1624607967709&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-stringify-position%2Fdownload%2Funist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha1-zOO/oc34W6c3XR1bF73Eytqb2do= + dependencies: + "@types/unist" "^2.0.2" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmmirror.com/universalify/download/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY= + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/unquote/download/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/unset-value/download/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.npmmirror.com/upath/download/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ= + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmmirror.com/uri-js/download/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34= + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/urix/download/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/url-loader/download/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" + integrity sha1-4OLvZY8APvuMpBsPP/v3a6uIZYs= + dependencies: + loader-utils "^1.2.3" + mime "^2.4.4" + schema-utils "^2.5.0" + +url-parse@^1.4.3: + version "1.5.4" + resolved "https://registry.npmmirror.com/url-parse/download/url-parse-1.5.4.tgz#e4f645a7e2a0852cc8a66b14b292a3e9a11a97fd" + integrity sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.npmmirror.com/url/download/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use-composed-ref@^1.0.0: + version "1.2.1" + resolved "https://registry.npmmirror.com/use-composed-ref/download/use-composed-ref-1.2.1.tgz#9bdcb5ccd894289105da2325e1210079f56bf849" + integrity sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw== + +use-isomorphic-layout-effect@^1.0.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/use-isomorphic-layout-effect/download/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225" + integrity sha1-e7ZYkXDNKYehUgQvkIT57/t1wiU= + +use-latest@^1.0.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/use-latest/download/use-latest-1.2.0.tgz#a44f6572b8288e0972ec411bdd0840ada366f232" + integrity sha1-pE9lcrgojgly7EEb3QhAraNm8jI= + dependencies: + use-isomorphic-layout-effect "^1.0.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/use/download/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/util-deprecate/download/util-deprecate-1.0.2.tgz?cache=0&sync_timestamp=1624607944834&other_urls=https%3A%2F%2Fregistry.nlark.com%2Futil-deprecate%2Fdownload%2Futil-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/util.promisify/download/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA= + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@^1.0.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/util.promisify/download/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha1-d4MvV87SyUeBdBScrpuW6ZGM1Us= + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + for-each "^0.3.3" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.1" + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/util.promisify/download/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha1-a693dLgO6w91INi4HQeYKlmruu4= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.npmmirror.com/util/download/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.npmmirror.com/util/download/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.npmmirror.com/utila/download/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^3.0.1, uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.npmmirror.com/uuid/download/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.1: + version "8.3.2" + resolved "https://registry.npmmirror.com/uuid/download/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4= + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmmirror.com/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validator@^13.1.1: + version "13.7.0" + resolved "https://registry.npmmirror.com/validator/download/validator-13.7.0.tgz?cache=0&sync_timestamp=1635822643143&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fvalidator%2Fdownload%2Fvalidator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" + integrity sha1-T5ZYuhO6jz2C7ogdNRZInqhcCFc= + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/vendors/download/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha1-4rgApT56Kbk1BsPPQRANFsTErY4= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmmirror.com/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.npmmirror.com/vfile-message/download/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha1-W0O4gXHUCerlhHfRPyPdQdUsNxo= + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.npmmirror.com/vfile/download/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha1-A/Hc4o/GJcYlvGUUNQ+9sA+p5iQ= + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vis-network@7.3.5: + version "7.3.5" + resolved "https://registry.npmmirror.com/vis-network/download/vis-network-7.3.5.tgz#367f3a1c19ba1b677dc3dec495f7e0d235e1fd59" + integrity sha1-Nn86HBm6G2d9w97Elffg0jXh/Vk= + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.npmmirror.com/vm-browserify/download/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha1-eGQcSIuObKkadfUR56OzKobl3aA= + +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/void-elements/download/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/w3c-hr-time/download/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha1-ConN9cwVgi35w2BUNnaWPgzDCM0= + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/w3c-xmlserializer/download/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha1-MEhcp9cKb9BSQgo9Ev2Q5jOc55Q= + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.8" + resolved "https://registry.npmmirror.com/walker/download/walker-1.0.8.tgz?cache=0&sync_timestamp=1635238315480&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwalker%2Fdownload%2Fwalker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha1-vUmNtHev5XPcBBhfAR06uKjXZT8= + dependencies: + makeerror "1.0.12" + +warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/warning/download/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha1-Fungd+uKhtavfWSqHgX9hbRnjKM= + dependencies: + loose-envify "^1.0.0" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/watchpack-chokidar2/download/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha1-OFAAcu5uzmbzdpk2lQ6hdxvhyVc= + dependencies: + chokidar "^2.1.8" + +watchpack@^1.6.0: + version "1.7.5" + resolved "https://registry.npmmirror.com/watchpack/download/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha1-EmfmxV4Lm1vkTCAjrtVDeiwmxFM= + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmmirror.com/wbuf/download/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha1-wdjRSTFtPqhShIiVy2oL/oh7h98= + dependencies: + minimalistic-assert "^1.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/webidl-conversions/download/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/webidl-conversions/download/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha1-qFWYCx8LazWbodXZ+zmulB+qY60= + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.npmmirror.com/webpack-dev-middleware/download/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha1-Bjk3KxQyYuK4SrldO5GnWXBhwsU= + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.10.3: + version "3.10.3" + resolved "https://registry.npmmirror.com/webpack-dev-server/download/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" + integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.2.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.6" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.25" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.19" + sockjs-client "1.4.0" + spdy "^4.0.1" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "12.0.5" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/webpack-log/download/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8= + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-manifest-plugin@2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/webpack-manifest-plugin/download/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" + integrity sha1-GcpptDWwuux+KfvpD7QBXeLeTxY= + dependencies: + fs-extra "^7.0.0" + lodash ">=3.5 <5" + object.entries "^1.1.0" + tapable "^1.0.0" + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.npmmirror.com/webpack-sources/download/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha1-7t2OwLko+/HL/plOItLYkPMwqTM= + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.42.0: + version "4.42.0" + resolved "https://registry.npmmirror.com/webpack/download/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.npmmirror.com/websocket-driver/download/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha1-ia1Slbv2S0gKvLox5JU6ynBvV2A= + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmmirror.com/websocket-extensions/download/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha1-f4RzvIOd/YdgituV1+sHUhFXikI= + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/whatwg-encoding/download/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha1-WrrPd3wyFmpR0IXWtPPn0nET3bA= + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.0.0: + version "3.6.2" + resolved "https://registry.npmmirror.com/whatwg-fetch/download/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha1-3O0k838mJO0CgXJdUdDi4/5nf4w= + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/whatwg-mimetype/download/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha1-PUseAxLSB5h5+Cav8Y2+7KWWD78= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/whatwg-url/download/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.npmmirror.com/whatwg-url/download/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha1-8t8Cv/F2/WUHDfdK1cy7WhmZZag= + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.npmmirror.com/whatwg-url/download/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha1-wsSS8eymEpiO/T0iZr4bn8YXDQY= + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY= + dependencies: + 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" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/which-module/download/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.0, which@^1.3.1: + version "1.3.1" + resolved "https://registry.npmmirror.com/which/download/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/which/download/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= + dependencies: + isexe "^2.0.0" + +word-wrap@~1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" + integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== + +workbox-background-sync@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-background-sync/download/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" + integrity sha1-JoIbm/Funjf9HWQCie3dwIr9GVA= + dependencies: + workbox-core "^4.3.1" + +workbox-broadcast-update@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-broadcast-update/download/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b" + integrity sha1-4sAoCxSeOlBJg7dXYGrQQfMyw1s= + dependencies: + workbox-core "^4.3.1" + +workbox-build@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-build/download/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64" + integrity sha1-QU9w+01t5H9lOGCLgOxSQS0jPmQ= + dependencies: + "@babel/runtime" "^7.3.4" + "@hapi/joi" "^15.0.0" + common-tags "^1.8.0" + fs-extra "^4.0.2" + glob "^7.1.3" + lodash.template "^4.4.0" + pretty-bytes "^5.1.0" + stringify-object "^3.3.0" + strip-comments "^1.0.2" + workbox-background-sync "^4.3.1" + workbox-broadcast-update "^4.3.1" + workbox-cacheable-response "^4.3.1" + workbox-core "^4.3.1" + workbox-expiration "^4.3.1" + workbox-google-analytics "^4.3.1" + workbox-navigation-preload "^4.3.1" + workbox-precaching "^4.3.1" + workbox-range-requests "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + workbox-streams "^4.3.1" + workbox-sw "^4.3.1" + workbox-window "^4.3.1" + +workbox-cacheable-response@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-cacheable-response/download/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91" + integrity sha1-9T4HkXnAlaPxnlMTsoSXXJFCjJE= + dependencies: + workbox-core "^4.3.1" + +workbox-core@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-core/download/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6" + integrity sha1-AF0sagahcUN6/WyikEpXJ+zXO+Y= + +workbox-expiration@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-expiration/download/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921" + integrity sha1-15BDNWICnlaDfzQdf1U8Snjr6SE= + dependencies: + workbox-core "^4.3.1" + +workbox-google-analytics@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-google-analytics/download/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a" + integrity sha1-ntoBg7EDiQtcJW5vTqFaHxVIUZo= + dependencies: + workbox-background-sync "^4.3.1" + workbox-core "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + +workbox-navigation-preload@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-navigation-preload/download/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d" + integrity sha1-Kcjk21hDgDs0zZbcFV+evZr6RT0= + dependencies: + workbox-core "^4.3.1" + +workbox-precaching@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-precaching/download/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba" + integrity sha1-n8Re0SLZS74fDqlYT/WUCWB3HLo= + dependencies: + workbox-core "^4.3.1" + +workbox-range-requests@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-range-requests/download/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74" + integrity sha1-+KRwGIkiFFy/DAmpotXjVkUkTnQ= + dependencies: + workbox-core "^4.3.1" + +workbox-routing@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-routing/download/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda" + integrity sha1-pnWEGvYj4LsMZ85O2OckrAvtDNo= + dependencies: + workbox-core "^4.3.1" + +workbox-strategies@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-strategies/download/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646" + integrity sha1-0r4DxO8hTBFeGrKcnHWcn+Pp5kY= + dependencies: + workbox-core "^4.3.1" + +workbox-streams@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-streams/download/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3" + integrity sha1-C1facOmCVy3gnIdC3Qy0Cmt8LMM= + dependencies: + workbox-core "^4.3.1" + +workbox-sw@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-sw/download/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164" + integrity sha1-32njlcR5700USZNyvNhMD14kYWQ= + +workbox-webpack-plugin@4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-webpack-plugin/download/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd" + integrity sha1-R/9eocwHS2xA+1qGEIhjokEg1L0= + dependencies: + "@babel/runtime" "^7.0.0" + json-stable-stringify "^1.0.1" + workbox-build "^4.3.1" + +workbox-window@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/workbox-window/download/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3" + integrity sha1-7mBRvxDwavpUg8m436BTGZTt4PM= + dependencies: + workbox-core "^4.3.1" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.npmmirror.com/worker-farm/download/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag= + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.npmmirror.com/worker-rpc/download/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha1-y1Zb1tcHGo8WZgaGBR6WmtMvVNU= + dependencies: + microevent.ts "~0.1.1" + +wouter@^2.5.1: + version "2.7.5" + resolved "https://registry.npmmirror.com/wouter/download/wouter-2.7.5.tgz#c7466a2630bed3a4ec010aea0cda42a5bae69e5d" + integrity sha1-x0ZqJjC+06TsAQrqDNpCpbrmnl0= + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/wrap-ansi/download/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/wrap-ansi/download/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha1-H9H2cjXVttD+54EFYAG/tpTAOwk= + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmmirror.com/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.npmmirror.com/write-file-atomic/download/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha1-0LBUY8GIroBDlv1asqNwBir4dSk= + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/write-file-atomic/download/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha1-Vr1cWlxwSBzRnFcb05q5ZaXeVug= + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/write/download/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM= + dependencies: + mkdirp "^0.5.1" + +ws@^5.2.0: + version "5.2.3" + resolved "https://registry.npmmirror.com/ws/download/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.1.2, ws@^6.2.1: + version "6.2.2" + resolved "https://registry.npmmirror.com/ws/download/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/xml-name-validator/download/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha1-auc+Bt5NjG5H+fsYH3jWSK1FfGo= + +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.npmmirror.com/xmlchars/download/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha1-Bg/hvLf5x2/ioX24apvDq4lCEMs= + +xregexp@^4.3.0: + version "4.4.1" + resolved "https://registry.npmmirror.com/xregexp/download/xregexp-4.4.1.tgz#c84a88fa79e9ab18ca543959712094492185fe65" + integrity sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag== + dependencies: + "@babel/runtime-corejs3" "^7.12.1" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/xtend/download/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q= + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmmirror.com/y18n/download/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8= + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmmirror.com/yallist/download/yallist-3.1.1.tgz?cache=0&sync_timestamp=1624607893982&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyallist%2Fdownload%2Fyallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha1-27fa+b/YusmrRev2ArjLrQ1dCP0= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/yallist/download/yallist-4.0.0.tgz?cache=0&sync_timestamp=1624607893982&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyallist%2Fdownload%2Fyallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI= + +yaml@^1.10.0, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.npmmirror.com/yaml/download/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha1-h5oIZZc7yp9rq1y987HGfsfTvPQ= + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha1-Ew8JcC667vJlDVTObj5XBvek+zg= + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha1-LrfcOwKJcY/ClfNidThFxBoMlO4= + +yargs@12.0.5: + version "12.0.5" + resolved "https://registry.npmmirror.com/yargs/download/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha1-BfWZe2CWR7ZPZrgeO0sQo2jnrRM= + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.npmmirror.com/yargs/download/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha1-rX/+/sGqWVZayRX4Lcyzipwxot0= + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.npmmirror.com/zwitch/download/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha1-0R1zgf/tFrdC9q97PyI9XNn+mSA= diff --git a/hugegraph-hubble/hubble-fe/.eslintrc.js b/hugegraph-hubble/hubble-fe/.eslintrc.js new file mode 100644 index 000000000..90a5a4dc1 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/.eslintrc.js @@ -0,0 +1,49 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +module.exports = { + 'env': { + 'browser': true, + 'es2021': true, + }, + 'extends': [ + // "eslint:recommended", + // "plugin:react/recommended", + // "plugin:@typescript-eslint/recommended", + + '@ecomfe/eslint-config/baidu/default', // 根据代码库ES版本选择default或es5 + '@ecomfe/eslint-config/baidu/defect', // 根据代码库ES版本选择defect或defect-es5 + '@ecomfe/eslint-config', + '@ecomfe/eslint-config/typescript', + '@ecomfe/eslint-config/react', + ], + 'parser': '@typescript-eslint/parser', + 'parserOptions': { + 'ecmaFeatures': { + 'jsx': true, + }, + 'ecmaVersion': 12, + 'sourceType': 'module', + }, + 'plugins': [ + 'react', + '@typescript-eslint', + ], + 'rules': { + }, +}; diff --git a/hugegraph-hubble/hubble-fe/README.md b/hugegraph-hubble/hubble-fe/README.md index ab02f7df3..58beeaccd 100644 --- a/hugegraph-hubble/hubble-fe/README.md +++ b/hugegraph-hubble/hubble-fe/README.md @@ -1,3 +1,70 @@ -# HugeGraph-Hubble +# Getting Started with Create React App -Front-end implementation of HugeGraph \ No newline at end of file +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in your browser. + +The page will reload when you make changes.\ +You may also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can't go back!** + +If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. + +You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) + +### Analyzing the Bundle Size + +This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) + +### Making a Progressive Web App + +This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) + +### Advanced Configuration + +This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) + +### Deployment + +This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) + +### `npm run build` fails to minify + +This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) diff --git a/hugegraph-hubble/hubble-fe/package-lock.json b/hugegraph-hubble/hubble-fe/package-lock.json new file mode 100644 index 000000000..d5fd46c6f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/package-lock.json @@ -0,0 +1,39632 @@ +{ + "name": "hubble", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "hubble", + "version": "0.1.0", + "dependencies": { + "@ant-design/icons": "^4.7.0", + "@antv/g6": "^4.6.15", + "@antv/graphin": "^2.7.12", + "@antv/graphin-components": "^2.4.0", + "@antv/graphin-icons": "^1.0.0", + "@antv/x6": "^1.34.6", + "@antv/x6-react-components": "^1.1.20", + "@antv/x6-react-shape": "^1.6.3", + "@babel/eslint-plugin": "^7.18.10", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^13.5.0", + "@types/lodash-es": "^4.17.3", + "3d-force-graph": "^1.71.2", + "ajv": "8.17.1", + "antd": "^4.23.1", + "axios": "^0.27.2", + "codemirror": "^6.0.1", + "cron-expression-validator": "^1.0.20", + "date-fns": "^2.29.3", + "echarts": "^5.4.1", + "http-proxy-middleware": "^2.0.6", + "i18next": "^19.5.3", + "install": "^0.13.0", + "json-bigint": "^1.0.0", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "node-gyp": "^9.4.0", + "node-sass": "^9.0.0", + "react": "^18.2.0", + "react-color": "^2.19.3", + "react-dom": "^18.2.0", + "react-highlight-words": "^0.18.0", + "react-i18next": "^11.7.3", + "react-json-view": "^1.21.3", + "react-router-dom": "^6.3.0", + "react-scripts": "5.0.1", + "screenfull": "^6.0.2", + "typescript": "^4.7.4", + "validator": "^13.7.0", + "vis-network": "^9.1.2", + "web-vitals": "^2.1.4" + }, + "devDependencies": { + "@ecomfe/eslint-config": "^7.4.0", + "@ecomfe/stylelint-config": "^1.1.2", + "eslint": "^8.19.0", + "eslint-plugin-react": "^7.30.1", + "resize-observer-polyfill": "^1.5.1" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.3.tgz", + "integrity": "sha512-HGlIQZzrEbAhpJR6+IGdzfbPym94Owr6JZkJ2QCCnOkPVIWMO2xgIVcOKnl8YcpijIo39V7l2qQL5fmtw56cMw==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.3.0", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "lodash": "^4.17.15", + "rc-util": "^5.9.4" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.2.tgz", + "integrity": "sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@antv/algorithm": { + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/@antv/algorithm/-/algorithm-0.1.26.tgz", + "integrity": "sha512-DVhcFSQ8YQnMNW34Mk8BSsfc61iC1sAnmcfYoXTAshYHuU50p/6b7x3QYaGctDNKWGvi1ub7mPcSY0bK+aN0qg==", + "dependencies": { + "@antv/util": "^2.0.13", + "tslib": "^2.0.0" + } + }, + "node_modules/@antv/dom-util": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@antv/dom-util/-/dom-util-2.0.4.tgz", + "integrity": "sha512-2shXUl504fKwt82T3GkuT4Uoc6p9qjCKnJ8gXGLSW4T1W37dqf9AV28aCfoVPHp2BUXpSsB+PAJX2rG/jLHsLQ==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/event-emitter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@antv/event-emitter/-/event-emitter-0.1.3.tgz", + "integrity": "sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==" + }, + "node_modules/@antv/g-base": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@antv/g-base/-/g-base-0.5.16.tgz", + "integrity": "sha512-jP06wggTubDPHXoKwFg3/f1lyxBX9ywwN3E/HG74Nd7DXqOXQis8tsIWW+O6dS/h9vyuXLd1/wDWkMMm3ZzXdg==", + "dependencies": { + "@antv/event-emitter": "^0.1.1", + "@antv/g-math": "^0.1.9", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.13", + "@types/d3-timer": "^2.0.0", + "d3-ease": "^1.0.5", + "d3-interpolate": "^3.0.1", + "d3-timer": "^1.0.9", + "detect-browser": "^5.1.0", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/g-canvas": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@antv/g-canvas/-/g-canvas-0.5.17.tgz", + "integrity": "sha512-sXYJMWTOlb/Ycb6sTKu00LcJqInXJY4t99+kSM40u2OfqrXYmaXDjHR7D2V0roMkbK/QWiWS9UnEidCR1VtMOA==", + "dependencies": { + "@antv/g-base": "^0.5.12", + "@antv/g-math": "^0.1.9", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/g-math": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@antv/g-math/-/g-math-0.1.9.tgz", + "integrity": "sha512-KHMSfPfZ5XHM1PZnG42Q2gxXfOitYveNTA7L61lR6mhZ8Y/aExsYmHqaKBsSarU0z+6WLrl9C07PQJZaw0uljQ==", + "dependencies": { + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0" + } + }, + "node_modules/@antv/g-svg": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@antv/g-svg/-/g-svg-0.5.7.tgz", + "integrity": "sha512-jUbWoPgr4YNsOat2Y/rGAouNQYGpw4R0cvlN0YafwOyacFFYy2zC8RslNd6KkPhhR3XHNSqJOuCYZj/YmLUwYw==", + "dependencies": { + "@antv/g-base": "^0.5.12", + "@antv/g-math": "^0.1.9", + "@antv/util": "~2.0.0", + "detect-browser": "^5.0.0", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/g-webgpu": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu/-/g-webgpu-0.7.2.tgz", + "integrity": "sha512-kw+oYGsdvj5qeUfy5DPb/jztZBV+2fmqBd3Vv8NlKatfBmv8AirYX/CCW74AUSdWm99rEiLyxFB1VdRZ6b/wnQ==", + "dependencies": { + "@antv/g-webgpu-core": "^0.7.2", + "@antv/g-webgpu-engine": "^0.7.2", + "gl-matrix": "^3.1.0", + "gl-vec2": "^1.3.0", + "lodash": "^4.17.15" + } + }, + "node_modules/@antv/g-webgpu-core": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu-core/-/g-webgpu-core-0.7.2.tgz", + "integrity": "sha512-xUMmop7f3Rs34zFYKXLqHhDR1CQTeDl/7vI7Sn3X/73BqJc3X3HIIRvm83Fg2CjVACaOzw4WeLRXNaOCp9fz9w==", + "dependencies": { + "eventemitter3": "^4.0.0", + "gl-matrix": "^3.1.0", + "lodash": "^4.17.15", + "probe.gl": "^3.1.1" + } + }, + "node_modules/@antv/g-webgpu-engine": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu-engine/-/g-webgpu-engine-0.7.2.tgz", + "integrity": "sha512-lx8Y93IW2cnJvdoDRKyMmTdYqSC1pOmF0nyG3PGGyA0NI9vBYVgO0KTF6hkyWjdTWVq7XDZyf/h8CJridLh3lg==", + "dependencies": { + "@antv/g-webgpu-core": "^0.7.2", + "gl-matrix": "^3.1.0", + "lodash": "^4.17.15", + "regl": "^1.3.11" + } + }, + "node_modules/@antv/g6": { + "version": "4.8.25", + "resolved": "https://registry.npmjs.org/@antv/g6/-/g6-4.8.25.tgz", + "integrity": "sha512-8mdTnN9QMVNQZtlXmftL8fvRsa4L+GajK58Zp51wyrGLFyjeop8R0QSkCALW45DWP2TaQeZAPtjhQUU/wf5hIg==", + "dependencies": { + "@antv/g6-pc": "0.8.25" + } + }, + "node_modules/@antv/g6-core": { + "version": "0.8.24", + "resolved": "https://registry.npmjs.org/@antv/g6-core/-/g6-core-0.8.24.tgz", + "integrity": "sha512-rgI3dArAD8uoSz2+skS4ctN4x/Of33ivTIKaEYYvClxgkLZWVz9zvocy+5AWcVPBHZsAXkZcdh9zndIoWY/33A==", + "dependencies": { + "@antv/algorithm": "^0.1.26", + "@antv/dom-util": "^2.0.1", + "@antv/event-emitter": "~0.1.0", + "@antv/g-base": "^0.5.1", + "@antv/g-math": "^0.1.1", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/path-util": "^2.0.3", + "@antv/util": "~2.0.5", + "ml-matrix": "^6.5.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@antv/g6-element": { + "version": "0.8.25", + "resolved": "https://registry.npmjs.org/@antv/g6-element/-/g6-element-0.8.25.tgz", + "integrity": "sha512-bPsI+dS9rdp80O/XyV0iy6QiusyOgO/diCIsGQuLHs6rBqjLtDA5yu9JDo49mPA3JblJV0MYjbgL8Exou7Ecqw==", + "dependencies": { + "@antv/g-base": "^0.5.1", + "@antv/g6-core": "0.8.24", + "@antv/util": "~2.0.5", + "tslib": "^2.6.2" + }, + "peerDependencies": { + "@antv/g6": "4.8.25" + } + }, + "node_modules/@antv/g6-pc": { + "version": "0.8.25", + "resolved": "https://registry.npmjs.org/@antv/g6-pc/-/g6-pc-0.8.25.tgz", + "integrity": "sha512-HZ2QyDbgsUQpQBFqrA8Zcvm/rAKN4n3I7XEeWCODZgyhQ8kz2f3qdzrRXDPmMyclexi0JF9DarCs8a2rzhV5YA==", + "dependencies": { + "@ant-design/colors": "^4.0.5", + "@antv/algorithm": "^0.1.26", + "@antv/dom-util": "^2.0.1", + "@antv/event-emitter": "~0.1.0", + "@antv/g-base": "^0.5.1", + "@antv/g-canvas": "^0.5.2", + "@antv/g-math": "^0.1.1", + "@antv/g-svg": "^0.5.1", + "@antv/g6-core": "0.8.24", + "@antv/g6-element": "0.8.25", + "@antv/g6-plugin": "0.8.25", + "@antv/hierarchy": "^0.6.10", + "@antv/layout": "^0.3.0", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/path-util": "^2.0.3", + "@antv/util": "~2.0.5", + "color": "^3.1.3", + "d3-force": "^2.0.1", + "dagre": "^0.8.5", + "insert-css": "^2.0.0", + "ml-matrix": "^6.5.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@antv/g6-pc/node_modules/@ant-design/colors": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-4.0.5.tgz", + "integrity": "sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q==", + "dependencies": { + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@antv/g6-plugin": { + "version": "0.8.25", + "resolved": "https://registry.npmjs.org/@antv/g6-plugin/-/g6-plugin-0.8.25.tgz", + "integrity": "sha512-TAincRgNzrZNGBt1TvzfQV0Ob6OO3+WCcTrCZb4PzRoOessAiMsNm0S7x+7NFm30DJVC8Ud2M7M2V9DjhVd8Wg==", + "dependencies": { + "@antv/dom-util": "^2.0.2", + "@antv/g-base": "^0.5.1", + "@antv/g-canvas": "^0.5.2", + "@antv/g-svg": "^0.5.2", + "@antv/g6-core": "0.8.24", + "@antv/g6-element": "0.8.25", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/path-util": "^2.0.3", + "@antv/scale": "^0.3.4", + "@antv/util": "^2.0.9", + "insert-css": "^2.0.0" + }, + "peerDependencies": { + "@antv/g6": "4.8.25" + } + }, + "node_modules/@antv/graphin": { + "version": "2.7.27", + "resolved": "https://registry.npmjs.org/@antv/graphin/-/graphin-2.7.27.tgz", + "integrity": "sha512-cqsLl3xpZ5mPgTq5UufcqJDlxzKZSLk9/JWXmoQYpvDC4cpzDjBZeVlaDfhT8iToB5aR15CEIu6j+XsQDMqUsA==", + "dependencies": { + "@antv/g6": "^4.8.19", + "d3-quadtree": "^3.0.1", + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "lodash-es": ">=4.17.21", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@antv/graphin-components": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@antv/graphin-components/-/graphin-components-2.4.1.tgz", + "integrity": "sha512-Vaxhg1Jbv76j0SwrDLS5/VoHEx2mJW9CEbNdJ7HuWCaz24imvOymV4FpKSJND2PUq7BgIrzo48NaF3bpfiWZZA==", + "dependencies": { + "@antv/graphin": "^2.7.18" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@antv/graphin-icons": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@antv/graphin-icons/-/graphin-icons-1.0.0.tgz", + "integrity": "sha512-2nogK6ZrDklnfIOJrqOAgD7iFLjfZIjLbA8pDUbeXN5c9b0Mu84oCfyqg8OmWwvi9Gt80eUzoplo73gKjZECJg==" + }, + "node_modules/@antv/graphlib": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@antv/graphlib/-/graphlib-1.2.0.tgz", + "integrity": "sha512-hhJOMThec51nU4Fe5p/viLlNIL71uDEgYFzKPajWjr2715SFG1HAgiP6AVylIeqBcAZ04u3Lw7usjl/TuI5RuQ==" + }, + "node_modules/@antv/hierarchy": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/@antv/hierarchy/-/hierarchy-0.6.14.tgz", + "integrity": "sha512-V3uknf7bhynOqQDw2sg+9r9DwZ9pc6k/EcqyTFdfXB1+ydr7urisP0MipIuimucvQKN+Qkd+d6w601r1UIroqQ==" + }, + "node_modules/@antv/layout": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@antv/layout/-/layout-0.3.25.tgz", + "integrity": "sha512-d29Aw1PXoAavMRZy7iTB9L5rMBeChFEX0BJ9ELP4TI35ySdCu07YbmPo9ju9OH/6sG2/NB3o85Ayxrre3iwX/g==", + "dependencies": { + "@antv/g-webgpu": "0.7.2", + "@antv/graphlib": "^1.0.0", + "@antv/util": "^3.3.2", + "d3-force": "^2.1.1", + "d3-quadtree": "^2.0.0", + "dagre-compound": "^0.0.11", + "ml-matrix": "6.5.0" + } + }, + "node_modules/@antv/layout/node_modules/@antv/util": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-3.3.11.tgz", + "integrity": "sha512-FII08DFM4ABh2q5rPYdr0hMtKXRgeZazvXaFYCs7J7uTcWDHUhczab2qOCJLNDugoj8jFag1djb7wS9ehaRYBg==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "gl-matrix": "^3.3.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@antv/layout/node_modules/d3-quadtree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", + "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + }, + "node_modules/@antv/layout/node_modules/ml-matrix": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.5.0.tgz", + "integrity": "sha512-sms732Dge+rs5dU4mnjE0oqLWm1WujvR2fr38LgUHRG2cjXjWlO3WJupLYaSz3++2iYr0UrGDK72OAivr3J8dg==", + "dependencies": { + "ml-array-rescale": "^1.3.1" + } + }, + "node_modules/@antv/matrix-util": { + "version": "3.1.0-beta.3", + "resolved": "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.1.0-beta.3.tgz", + "integrity": "sha512-W2R6Za3A6CmG51Y/4jZUM/tFgYSq7vTqJL1VD9dKrvwxS4sE0ZcXINtkp55CdyBwJ6Cwm8pfoRpnD4FnHahN0A==", + "dependencies": { + "@antv/util": "^2.0.9", + "gl-matrix": "^3.4.3", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/path-util": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@antv/path-util/-/path-util-2.0.15.tgz", + "integrity": "sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==", + "dependencies": { + "@antv/matrix-util": "^3.0.4", + "@antv/util": "^2.0.9", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/path-util/node_modules/@antv/matrix-util": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.0.4.tgz", + "integrity": "sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==", + "dependencies": { + "@antv/util": "^2.0.9", + "gl-matrix": "^3.3.0", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/scale": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.3.18.tgz", + "integrity": "sha512-GHwE6Lo7S/Q5fgaLPaCsW+CH+3zl4aXpnN1skOiEY0Ue9/u+s2EySv6aDXYkAqs//i0uilMDD/0/4n8caX9U9w==", + "dependencies": { + "@antv/util": "~2.0.3", + "fecha": "~4.2.0", + "tslib": "^2.0.0" + } + }, + "node_modules/@antv/util": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz", + "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", + "dependencies": { + "csstype": "^3.0.8", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/x6": { + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/@antv/x6/-/x6-1.35.1.tgz", + "integrity": "sha512-XLFSGbcT/MOI883YKql9J/CqHUCPZxgwfel+sNN1eQbHA+JXYsGt0t9+IJ1qieaYAlxjgio5up+S9I0n+8QL/A==", + "dependencies": { + "csstype": "^3.0.3", + "jquery": "^3.5.1", + "jquery-mousewheel": "^3.1.13", + "lodash-es": "^4.17.15", + "mousetrap": "^1.6.5", + "utility-types": "^3.10.0" + } + }, + "node_modules/@antv/x6-react-components": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/@antv/x6-react-components/-/x6-react-components-1.1.20.tgz", + "integrity": "sha512-HpQqjPCUo+jfcbfW2sr9oxuXMCxWnXxWvE8jXKJzvrlMNZ3kgfxNqMCRxwGi2QTCxLB3g/KYi5/n8kze8ui1/Q==", + "dependencies": { + "clamp": "^1.0.1", + "classnames": "^2.2.6", + "rc-dropdown": "^3.0.0-alpha.0", + "rc-util": "^4.15.7", + "react-color": "2.17.1", + "react-resize-detector": "^7.0.0", + "ua-parser-js": "^0.7.20" + }, + "peerDependencies": { + "antd": ">=4.4.2 || >=5.0.0-beta.0", + "react": ">=16.8.6 || >=17.0.0", + "react-dom": ">=16.8.6 || >=17.0.0" + } + }, + "node_modules/@antv/x6-react-components/node_modules/rc-util": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", + "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", + "dependencies": { + "add-dom-event-listener": "^1.1.0", + "prop-types": "^15.5.10", + "react-is": "^16.12.0", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0" + } + }, + "node_modules/@antv/x6-react-components/node_modules/react-color": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.17.1.tgz", + "integrity": "sha512-S+I6TkUKJaqfALLkAIfiCZ/MANQyy7dKkf7g9ZU5GTUy2rf8c2Rx62otyvADAviWR+6HRkzdf2vL1Qvz9goCLQ==", + "dependencies": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.11", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@antv/x6-react-components/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/@antv/x6-react-shape": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@antv/x6-react-shape/-/x6-react-shape-1.6.6.tgz", + "integrity": "sha512-+SIvQWeGhfH9miKDQvJT497iVDs/CcMwcgbNKbPV6qTUaSUeXjz/bZy8knbQ5t9XtkVYeQXZP7swiKK2xMI0UQ==", + "peerDependencies": { + "@antv/x6": "^1.x", + "react": ">=16.8.6 || >=17.0.0", + "react-dom": ">=16.8.6 || >=17.0.0" + } + }, + "node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz", + "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.27.1.tgz", + "integrity": "sha512-vOG/EipZbIAcREK6XI4JRO3B3uZr70/KIhsrNLO9RXcgLMaW0sTsBpNeTpQUyelB0HsbWd45NIsuTgD3mqr/Og==", + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/eslint-parser": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.19.0.tgz", + "integrity": "sha512-61Hfv3cF07XvUxNeC3E7jhG8XNi1Yom1G0lRC936oLnlF+jrbrv8rc/J98XlYzcsAoTVupfsf5fLej1aI8kyIg==", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz", + "integrity": "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.3.tgz", + "integrity": "sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz", + "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.5.11", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.11.tgz", + "integrity": "sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", + "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.38.4", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.4.tgz", + "integrity": "sha512-hduz0suCcUSC/kM8Fq3A9iLwInJDl8fD1xLpTIk+5xkNm8z/FT7UsIa9sOXrkpChh+XXc18RzswE8QqELsVl+g==", + "dependencies": { + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@csstools/normalize.css": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==" + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@ecomfe/eslint-config": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@ecomfe/eslint-config/-/eslint-config-7.5.1.tgz", + "integrity": "sha512-17Qc003QeeP9dZcI838owFLbSPjfCwZofYIu3zbLqpTVxdbxkkijj10fzYnMRGuOW0uGOzSqITzrIaJmLZRHBA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "peerDependencies": { + "@babel/core": "^7.12.10", + "@babel/eslint-parser": "^7.12.1", + "@babel/eslint-plugin": "^7.12.1", + "@typescript-eslint/eslint-plugin": "^4.11.0 || 5.x || 6.x", + "@typescript-eslint/parser": "^4.11.0 || 5.x || 6.x", + "eslint": "^6.2.0 || 7.x || 8.x", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-san": "^1.0.0", + "eslint-plugin-vue": "^7.20.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "@typescript-eslint/parser": { + "optional": true + }, + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-react": { + "optional": true + }, + "eslint-plugin-react-hooks": { + "optional": true + }, + "eslint-plugin-san": { + "optional": true + }, + "eslint-plugin-vue": { + "optional": true + } + } + }, + "node_modules/@ecomfe/stylelint-config": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ecomfe/stylelint-config/-/stylelint-config-1.1.2.tgz", + "integrity": "sha512-rIrZ7EU+zGVnqWWvYrCJWNrV04jyRSOqbLhsH1vl2FgTyUOBbvErRHfPoGqng8S9MfbIunnkzCDaoqpw6G4Tzw==", + "dev": true, + "peerDependencies": { + "stylelint": ">=9" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead" + }, + "node_modules/@icons/material": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", + "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/environment/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/environment/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/fake-timers/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/globals/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/test-result/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@jest/transform/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" + }, + "node_modules/@lezer/common": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", + "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==" + }, + "node_modules/@lezer/highlight": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", + "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", + "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==" + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz", + "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@probe.gl/env": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-3.6.0.tgz", + "integrity": "sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==", + "dependencies": { + "@babel/runtime": "^7.0.0" + } + }, + "node_modules/@probe.gl/log": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-3.6.0.tgz", + "integrity": "sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@probe.gl/env": "3.6.0" + } + }, + "node_modules/@probe.gl/stats": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.6.0.tgz", + "integrity": "sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==", + "dependencies": { + "@babel/runtime": "^7.0.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz", + "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz", + "integrity": "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==" + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/d3-timer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-2.0.3.tgz", + "integrity": "sha512-jhAJzaanK5LqyLQ50jJNIrB8fjL9gwWZTgYjevPvkDLMU+kTAZkYsobI59nYoeSrH1PucuyJEi247Pb90t6XUg==" + }, + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + }, + "node_modules/@types/node": { + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", + "dependencies": { + "undici-types": "~7.12.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==" + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/3d-force-graph": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/3d-force-graph/-/3d-force-graph-1.79.0.tgz", + "integrity": "sha512-0RUNcfiH12f93loY/iS4wShzhXzdLLN4futvFnintF7eP30DjX+nAdLDAGOZwSflhijQyVwnGtpczNjFrDLUzQ==", + "dependencies": { + "accessor-fn": "1", + "kapsule": "^1.16", + "three": ">=0.118 <1", + "three-forcegraph": "1", + "three-render-objects": "^1.35" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accessor-fn": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", + "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-dom-event-listener": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz", + "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==", + "dependencies": { + "object-assign": "4.x" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/antd": { + "version": "4.24.16", + "resolved": "https://registry.npmjs.org/antd/-/antd-4.24.16.tgz", + "integrity": "sha512-zZrK4UYxHtU6tGOOf0uG/kBRx1kTvypfuSB3GqE/SBQxFhZ/TZ+yj7Z1qwI8vGfMtUUJdLeuoCAqGDa1zPsXnQ==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons": "^4.8.2", + "@ant-design/react-slick": "~1.0.2", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.6.1", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "lodash": "^4.17.21", + "moment": "^2.29.2", + "rc-cascader": "~3.7.3", + "rc-checkbox": "~3.0.1", + "rc-collapse": "~3.4.2", + "rc-dialog": "~9.0.2", + "rc-drawer": "~6.3.0", + "rc-dropdown": "~4.0.1", + "rc-field-form": "~1.38.2", + "rc-image": "~5.13.0", + "rc-input": "~0.1.4", + "rc-input-number": "~7.3.11", + "rc-mentions": "~1.13.1", + "rc-menu": "~9.8.4", + "rc-motion": "^2.9.0", + "rc-notification": "~4.6.1", + "rc-pagination": "~3.2.0", + "rc-picker": "~2.7.6", + "rc-progress": "~3.4.2", + "rc-rate": "~2.9.3", + "rc-resize-observer": "^1.3.1", + "rc-segmented": "~2.3.0", + "rc-select": "~14.1.18", + "rc-slider": "~10.0.1", + "rc-steps": "~5.0.0", + "rc-switch": "~3.2.2", + "rc-table": "~7.26.0", + "rc-tabs": "~12.5.10", + "rc-textarea": "~0.4.7", + "rc-tooltip": "~5.2.2", + "rc-tree": "~5.7.12", + "rc-tree-select": "~5.5.5", + "rc-trigger": "^5.3.4", + "rc-upload": "~4.3.6", + "rc-util": "^5.37.0", + "scroll-into-view-if-needed": "^2.2.25" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/antd/node_modules/rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==" + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==", + "engines": { + "node": "*" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-jest/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-loader": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/babel-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz", + "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.9.tgz", + "integrity": "sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA==", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/browserslist": { + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001745", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz", + "integrity": "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==" + }, + "node_modules/clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==" + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "dependencies": { + "browserslist": "^4.25.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz", + "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" + }, + "node_modules/cron-expression-validator": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/cron-expression-validator/-/cron-expression-validator-1.0.20.tgz", + "integrity": "sha512-g0osBTdp+1ryDw2vzlG6UpDPaa4fO94ZChF2R0lEnRurbuUEL74XEVX7xZJ13m4Mq/gb3ni6UQu8+Oqt+eocsw==" + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ] + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-binarytree": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", + "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==" + }, + "node_modules/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==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + }, + "node_modules/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "node_modules/d3-force": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz", + "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-quadtree": "1 - 2", + "d3-timer": "1 - 2" + } + }, + "node_modules/d3-force-3d": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz", + "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==", + "dependencies": { + "d3-binarytree": "1", + "d3-dispatch": "1 - 3", + "d3-octree": "1", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force/node_modules/d3-quadtree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", + "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + }, + "node_modules/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==", + "engines": { + "node": ">=12" + } + }, + "node_modules/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==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-octree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", + "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==" + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/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==", + "dependencies": { + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/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==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/dagre-compound": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/dagre-compound/-/dagre-compound-0.0.11.tgz", + "integrity": "sha512-UrSgRP9LtOZCYb9e5doolZXpc7xayyszgyOs7uakTK4n4KsLegLVTRRtq01GpQd/iZjYw5fWMapx9ed+c80MAQ==", + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "dagre": "^0.8.5" + } + }, + "node_modules/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==" + }, + "node_modules/data-bind-mapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/data-bind-mapper/-/data-bind-mapper-1.0.3.tgz", + "integrity": "sha512-QmU3lyEnbENQPo0M1F9BMu4s6cqNNp8iJA+b/HP2sSb7pf3dxwF3+EP1eO69rwBfH9kFJ1apmzrtogAmVt2/Xw==", + "dependencies": { + "accessor-fn": "1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-browser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", + "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==" + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/echarts": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz", + "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.6.1" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.227", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.227.tgz", + "integrity": "sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA==" + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==" + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/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==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "node_modules/fbjs/node_modules/ua-parser-js": { + "version": "1.0.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", + "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" + }, + "node_modules/float-tooltip": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz", + "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==", + "dependencies": { + "d3-selection": "2 - 3", + "kapsule": "^1.16", + "preact": "10" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/flux": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", + "dependencies": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.1" + }, + "peerDependencies": { + "react": "^15.0.2 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-monkey": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gl-matrix": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", + "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==" + }, + "node_modules/gl-vec2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/gl-vec2/-/gl-vec2-1.3.0.tgz", + "integrity": "sha512-YiqaAuNsheWmUV0Sa8k94kBB0D6RWjwZztyO+trEYS8KzJ6OQB/4686gdrf59wld4hHFIvaxynO3nRxpk1Ij/A==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/globule/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globule/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight-words-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.3.tgz", + "integrity": "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==" + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/i18next": { + "version": "19.9.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-19.9.2.tgz", + "integrity": "sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg==", + "dependencies": { + "@babel/runtime": "^7.12.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/insert-css": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz", + "integrity": "sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA==" + }, + "node_modules/install": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", + "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-any-array": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz", + "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==" + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-changed-files/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-jsdom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-node/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-haste-map/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-haste-map/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-resolve/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" + }, + "node_modules/jquery-mousewheel": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.2.2.tgz", + "integrity": "sha512-JP71xTAg08ZY3hcs9ZbYUZ5i+dkSsz4yRl/zpWkAmtzc+kMs5EfPkpkINSidiLYMaR0MTo3DfFGF9WIezMsFQQ==", + "dependencies": { + "jquery": ">=1.2.6" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/kapsule": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", + "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", + "dependencies": { + "lodash-es": "4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoize-one": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.3.tgz", + "integrity": "sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==" + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ml-array-max": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.4.tgz", + "integrity": "sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==", + "dependencies": { + "is-any-array": "^2.0.0" + } + }, + "node_modules/ml-array-min": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-1.2.3.tgz", + "integrity": "sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==", + "dependencies": { + "is-any-array": "^2.0.0" + } + }, + "node_modules/ml-array-rescale": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-1.3.7.tgz", + "integrity": "sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==", + "dependencies": { + "is-any-array": "^2.0.0", + "ml-array-max": "^1.2.4", + "ml-array-min": "^1.2.3" + } + }, + "node_modules/ml-matrix": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.12.1.tgz", + "integrity": "sha512-TJ+8eOFdp+INvzR4zAuwBQJznDUfktMtOB6g/hUcGh3rcyjxbz4Te57Pgri8Q9bhSQ7Zys4IYOGhFdnlgeB6Lw==", + "dependencies": { + "is-any-array": "^2.0.1", + "ml-array-rescale": "^1.3.7" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/mousetrap": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", + "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/ngraph.events": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.4.0.tgz", + "integrity": "sha512-NeDGI4DSyjBNBRtA86222JoYietsmCXbs8CEB0dZ51Xeh4lhVl1y3wpWLumczvnha8sFQIW4E0vvVWwgmX2mGw==" + }, + "node_modules/ngraph.forcelayout": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ngraph.forcelayout/-/ngraph.forcelayout-3.3.1.tgz", + "integrity": "sha512-MKBuEh1wujyQHFTW57y5vd/uuEOK0XfXYxm3lC7kktjJLRdt/KEKEknyOlc6tjXflqBKEuYBBcu7Ax5VY+S6aw==", + "dependencies": { + "ngraph.events": "^1.0.0", + "ngraph.merge": "^1.0.0", + "ngraph.random": "^1.0.0" + } + }, + "node_modules/ngraph.graph": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/ngraph.graph/-/ngraph.graph-20.1.0.tgz", + "integrity": "sha512-1jorNgIc0Kg0L9bTNN4+RCrVvbZ+4pqGVMrbhX3LLyqYcRdLvAQRRnxddmfj9l5f6Eq59SUTfbYZEm8cktiE7Q==", + "dependencies": { + "ngraph.events": "^1.2.1" + } + }, + "node_modules/ngraph.merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ngraph.merge/-/ngraph.merge-1.0.0.tgz", + "integrity": "sha512-5J8YjGITUJeapsomtTALYsw7rFveYkM+lBj3QiYZ79EymQcuri65Nw3knQtFxQBU1r5iOaVRXrSwMENUPK62Vg==" + }, + "node_modules/ngraph.random": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ngraph.random/-/ngraph.random-1.2.0.tgz", + "integrity": "sha512-4EUeAGbB2HWX9njd6bP6tciN6ByJfoaAvmVL9QTaZSeXrW46eNGA9GajiXiPBbvFqxUWFkEbyo6x5qsACUuVfA==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-releases": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==" + }, + "node_modules/node-sass": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-9.0.0.tgz", + "integrity": "sha512-yltEuuLrfH6M7Pq2gAj5B6Zm7m+gdZoG66wTqG6mIZV/zijq3M2OO2HswtT6oBspPyFhHDcaxWpsBm0fRNDHPg==", + "deprecated": "Node Sass is no longer supported. Please use `sass` or `sass-embedded` instead.", + "hasInstallScript": true, + "dependencies": { + "async-foreach": "^0.1.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "make-fetch-happen": "^10.0.4", + "meow": "^9.0.0", + "nan": "^2.17.0", + "node-gyp": "^8.4.1", + "sass-graph": "^4.0.1", + "stdout-stream": "^1.4.0", + "true-case-path": "^2.2.1" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/node-sass/node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/node-sass/node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-sass/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-sass/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-sass/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/node-sass/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-sass/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-sass/node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/node-sass/node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-sass/node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-sass/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/node-sass/node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-sass/node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-sass/node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/node-sass/node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dependencies": { + "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.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/preact": { + "version": "10.27.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", + "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/probe.gl": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/probe.gl/-/probe.gl-3.6.0.tgz", + "integrity": "sha512-19JydJWI7+DtR4feV+pu4Mn1I5TAc0xojuxVgZdXIyfmTLfUaFnk4OloWK1bKbPtkgGKLr2lnbnCXmpZEcEp9g==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@probe.gl/env": "3.6.0", + "@probe.gl/log": "3.6.0", + "@probe.gl/stats": "3.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc-align": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", + "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-cascader": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.3.tgz", + "integrity": "sha512-KBpT+kzhxDW+hxPiNk4zaKa99+Lie2/8nnI11XF+FIOPl4Bj9VlFZi61GrnWzhLGA7VEN+dTxAkNOjkySDa0dA==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.6.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.0.1.tgz", + "integrity": "sha512-k7nxDWxYF+jDI0ZcCvuvj71xONmWRVe5+1MKcERRR9MRyP3tZ69b+yUCSXXh+sik4/Hc9P5wHr2nnUoGS2zBjA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz", + "integrity": "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.2.1", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.4.tgz", + "integrity": "sha512-pmnPRZKd9CGzGgf4a1ysBvMhxm8Afx5fF6M7AzLtJ0qh8X1bshurDlqnK4MBNAB4hAeAMMbz6Ytb1rkGMvKFbQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.3.0.tgz", + "integrity": "sha512-uBZVb3xTAR+dBV53d/bUhTctCw3pwcwJoM7g5aX+7vgwt2zzVzoJ6aqFjYJpBlZ9zp0dVYN8fV+hykFE7c4lig==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.21.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.6.2.tgz", + "integrity": "sha512-Wsw7GkVbUXADEs8FPL0v8gd+3mWQiydPFXBlr2imMScQaf8hh79pG9KrBc1DwK+nqHmYOpQfK2gn6jG2AQw9Pw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-trigger": "^5.0.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "1.38.2", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.38.2.tgz", + "integrity": "sha512-O83Oi1qPyEv31Sg+Jwvsj6pXc8uQI2BtIAkURr5lvEYHVggXJhdU/nynK8wY1gbw0qR48k731sN5ON4egRCROA==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz", + "integrity": "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.0.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.0.6" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz", + "integrity": "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "7.3.11", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.3.11.tgz", + "integrity": "sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.23.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz", + "integrity": "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-menu": "~9.8.0", + "rc-textarea": "^0.4.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.22.5" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.8.4", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.4.tgz", + "integrity": "sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.8", + "rc-trigger": "^5.1.2", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.6.1.tgz", + "integrity": "sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.2.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.4.1.tgz", + "integrity": "sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", + "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.7.6.tgz", + "integrity": "sha512-H9if/BUJUZBOhPfWcPeT15JUI3/ntrG9muzERrXDkSoWmDj4yzmBvumozpxYrHwjcKnjyDGAke68d+whWwvhHA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "date-fns": "2.x", + "dayjs": "1.x", + "moment": "^2.24.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.37.0", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-progress": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.2.tgz", + "integrity": "sha512-iAGhwWU+tsayP+Jkl9T4+6rHeQTG9kDz8JAHZk4XtQOcYN5fj9H34NXNEdRdZx94VUDHMqCb1yOIvi8eJRh67w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.3.tgz", + "integrity": "sha512-2THssUSnRhtqIouQIIXqsZGzRczvp4WsH4WvGuhiwm+LG2fVpDUJliP9O1zeDOZvYfBE/Bup4SgHun/eCkbjgQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.3.0.tgz", + "integrity": "sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.1.18", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.18.tgz", + "integrity": "sha512-4JgY3oG2Yz68ECMUSCON7mtxuJvCSj+LJpHEg/AONaaVBxIIrmI/ZTuMJkyojall/X50YdBe5oMKqHHPNiPzEg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.2.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz", + "integrity": "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.18.1", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-5.0.0.tgz", + "integrity": "sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz", + "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.0.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz", + "integrity": "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.22.5", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "12.5.10", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.10.tgz", + "integrity": "sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.0.0", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.16.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs/node_modules/rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-textarea": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz", + "integrity": "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.24.4", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz", + "integrity": "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.3.1", + "rc-trigger": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.7.12", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.12.tgz", + "integrity": "sha512-LXA5nY2hG5koIAlHW5sgXgLpOMz+bFRbnZZ+cCg0tQs4Wv1AmY7EDi1SK7iFXhslYockbqUerQan82jljoaItg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz", + "integrity": "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-trigger": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", + "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.19.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-upload": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.6.tgz", + "integrity": "sha512-Bt7ESeG5tT3IY82fZcP+s0tQU2xmo1W6P3S8NboUUliquJLQYLkUcsaExi3IlBVr43GQMCjo30RA2o0i70+NjA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/rc-virtual-list": { + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.19.2.tgz", + "integrity": "sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-app-polyfill/node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", + "dependencies": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "node_modules/react-color": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", + "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", + "dependencies": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-error-overlay": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==" + }, + "node_modules/react-highlight-words": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-highlight-words/-/react-highlight-words-0.18.0.tgz", + "integrity": "sha512-5z+46eLPjB4JWgOhuQ0E+6iUPTD1U3amiy5KKjzZmeJ5zyvHr91hnzBT3UHya/KlySm5KRTKpYpba9vs67oO2A==", + "dependencies": { + "highlight-words-core": "^1.2.0", + "memoize-one": "^4.0.0", + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/react-i18next": { + "version": "11.18.6", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.6.tgz", + "integrity": "sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==", + "dependencies": { + "@babel/runtime": "^7.14.5", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 19.0.0", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "dependencies": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + }, + "peerDependencies": { + "react": "^17.0.0 || ^16.3.0 || ^15.5.4", + "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-resize-detector": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-7.1.2.tgz", + "integrity": "sha512-zXnPJ2m8+6oq9Nn8zsep/orts9vQv3elrpA+R8XTcW7DVVUJ9vwDwMXaBtykAYjMnkCIaOoK9vObyR7ZgFNlOw==", + "dependencies": { + "lodash": "^4.17.21" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-router": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", + "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", + "dependencies": { + "@remix-run/router": "1.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", + "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", + "dependencies": { + "@remix-run/router": "1.23.0", + "react-router": "6.30.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-scripts/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz", + "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "dependencies": { + "lodash": "^4.0.1" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/regl/-/regl-1.7.0.tgz", + "integrity": "sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w==" + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" + }, + "node_modules/sass-graph": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.1.tgz", + "integrity": "sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA==", + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.17.11", + "scss-tokenizer": "^0.4.3", + "yargs": "^17.2.1" + }, + "bin": { + "sassgraph": "bin/sassgraph" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-graph/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-graph/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-graph/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/screenfull": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-6.0.2.tgz", + "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/scss-tokenizer": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz", + "integrity": "sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw==", + "dependencies": { + "js-base64": "^2.4.9", + "source-map": "^0.7.3" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/stdout-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/stdout-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stdout-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/stdout-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/style-mod": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==" + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/svgo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/svgo/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/three": { + "version": "0.180.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.180.0.tgz", + "integrity": "sha512-o+qycAMZrh+TsE01GqWUxUIKR1AL0S8pq7zDkYOQw8GqfX8b8VoCKYUoHbhiX5j+7hr8XsuHDVU6+gkQJQKg9w==" + }, + "node_modules/three-forcegraph": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/three-forcegraph/-/three-forcegraph-1.43.0.tgz", + "integrity": "sha512-1AqLmTCjjjwcuccObG96fCxiRnNJjCLdA5Mozl7XK+ROwTJ6QEJPo2XJ6uxWeuAmPE7ukMhgv4lj28oZSfE4wg==", + "dependencies": { + "accessor-fn": "1", + "d3-array": "1 - 3", + "d3-force-3d": "2 - 3", + "d3-scale": "1 - 4", + "d3-scale-chromatic": "1 - 3", + "data-bind-mapper": "1", + "kapsule": "^1.16", + "ngraph.forcelayout": "3", + "ngraph.graph": "20", + "tinycolor2": "1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "three": ">=0.118.3" + } + }, + "node_modules/three-render-objects": { + "version": "1.40.4", + "resolved": "https://registry.npmjs.org/three-render-objects/-/three-render-objects-1.40.4.tgz", + "integrity": "sha512-Ukpu1pei3L5r809izvjsZxwuRcYLiyn6Uvy3lZ9bpMTdvj3i6PeX6w++/hs2ZS3KnEzGjb6YvTvh4UQuwHTDJg==", + "dependencies": { + "@tweenjs/tween.js": "18 - 25", + "accessor-fn": "1", + "float-tooltip": "^1.7", + "kapsule": "^1.16", + "polished": "4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "three": ">=0.168" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/true-case-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", + "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==" + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", + "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "node_modules/undici-types": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-composed-ref": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz", + "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", + "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz", + "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validator": { + "version": "13.15.15", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", + "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vis-network": { + "version": "9.1.13", + "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.1.13.tgz", + "integrity": "sha512-HLeHd5KZS92qzO1kC59qMh1/FWAZxMUEwUWBwDMoj6RKj/Ajkrgy/heEYo0Zc8SZNQ2J+u6omvK2+a28GX1QuQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/visjs" + }, + "peerDependencies": { + "@egjs/hammerjs": "^2.0.0", + "component-emitter": "^1.3.0 || ^2.0.0", + "keycharm": "^0.2.0 || ^0.3.0 || ^0.4.0", + "uuid": "^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "vis-data": "^6.3.0 || ^7.0.0", + "vis-util": "^5.0.1" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.101.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", + "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "dependencies": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zrender": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz", + "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + }, + "dependencies": { + "@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==" + }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, + "@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "requires": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "@ant-design/icons": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.3.tgz", + "integrity": "sha512-HGlIQZzrEbAhpJR6+IGdzfbPym94Owr6JZkJ2QCCnOkPVIWMO2xgIVcOKnl8YcpijIo39V7l2qQL5fmtw56cMw==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.3.0", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "lodash": "^4.17.15", + "rc-util": "^5.9.4" + } + }, + "@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" + }, + "@ant-design/react-slick": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.2.tgz", + "integrity": "sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==", + "requires": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + } + }, + "@antv/algorithm": { + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/@antv/algorithm/-/algorithm-0.1.26.tgz", + "integrity": "sha512-DVhcFSQ8YQnMNW34Mk8BSsfc61iC1sAnmcfYoXTAshYHuU50p/6b7x3QYaGctDNKWGvi1ub7mPcSY0bK+aN0qg==", + "requires": { + "@antv/util": "^2.0.13", + "tslib": "^2.0.0" + } + }, + "@antv/dom-util": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@antv/dom-util/-/dom-util-2.0.4.tgz", + "integrity": "sha512-2shXUl504fKwt82T3GkuT4Uoc6p9qjCKnJ8gXGLSW4T1W37dqf9AV28aCfoVPHp2BUXpSsB+PAJX2rG/jLHsLQ==", + "requires": { + "tslib": "^2.0.3" + } + }, + "@antv/event-emitter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@antv/event-emitter/-/event-emitter-0.1.3.tgz", + "integrity": "sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==" + }, + "@antv/g-base": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@antv/g-base/-/g-base-0.5.16.tgz", + "integrity": "sha512-jP06wggTubDPHXoKwFg3/f1lyxBX9ywwN3E/HG74Nd7DXqOXQis8tsIWW+O6dS/h9vyuXLd1/wDWkMMm3ZzXdg==", + "requires": { + "@antv/event-emitter": "^0.1.1", + "@antv/g-math": "^0.1.9", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.13", + "@types/d3-timer": "^2.0.0", + "d3-ease": "^1.0.5", + "d3-interpolate": "^3.0.1", + "d3-timer": "^1.0.9", + "detect-browser": "^5.1.0", + "tslib": "^2.0.3" + } + }, + "@antv/g-canvas": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@antv/g-canvas/-/g-canvas-0.5.17.tgz", + "integrity": "sha512-sXYJMWTOlb/Ycb6sTKu00LcJqInXJY4t99+kSM40u2OfqrXYmaXDjHR7D2V0roMkbK/QWiWS9UnEidCR1VtMOA==", + "requires": { + "@antv/g-base": "^0.5.12", + "@antv/g-math": "^0.1.9", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0", + "tslib": "^2.0.3" + } + }, + "@antv/g-math": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@antv/g-math/-/g-math-0.1.9.tgz", + "integrity": "sha512-KHMSfPfZ5XHM1PZnG42Q2gxXfOitYveNTA7L61lR6mhZ8Y/aExsYmHqaKBsSarU0z+6WLrl9C07PQJZaw0uljQ==", + "requires": { + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0" + } + }, + "@antv/g-svg": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@antv/g-svg/-/g-svg-0.5.7.tgz", + "integrity": "sha512-jUbWoPgr4YNsOat2Y/rGAouNQYGpw4R0cvlN0YafwOyacFFYy2zC8RslNd6KkPhhR3XHNSqJOuCYZj/YmLUwYw==", + "requires": { + "@antv/g-base": "^0.5.12", + "@antv/g-math": "^0.1.9", + "@antv/util": "~2.0.0", + "detect-browser": "^5.0.0", + "tslib": "^2.0.3" + } + }, + "@antv/g-webgpu": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu/-/g-webgpu-0.7.2.tgz", + "integrity": "sha512-kw+oYGsdvj5qeUfy5DPb/jztZBV+2fmqBd3Vv8NlKatfBmv8AirYX/CCW74AUSdWm99rEiLyxFB1VdRZ6b/wnQ==", + "requires": { + "@antv/g-webgpu-core": "^0.7.2", + "@antv/g-webgpu-engine": "^0.7.2", + "gl-matrix": "^3.1.0", + "gl-vec2": "^1.3.0", + "lodash": "^4.17.15" + } + }, + "@antv/g-webgpu-core": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu-core/-/g-webgpu-core-0.7.2.tgz", + "integrity": "sha512-xUMmop7f3Rs34zFYKXLqHhDR1CQTeDl/7vI7Sn3X/73BqJc3X3HIIRvm83Fg2CjVACaOzw4WeLRXNaOCp9fz9w==", + "requires": { + "eventemitter3": "^4.0.0", + "gl-matrix": "^3.1.0", + "lodash": "^4.17.15", + "probe.gl": "^3.1.1" + } + }, + "@antv/g-webgpu-engine": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu-engine/-/g-webgpu-engine-0.7.2.tgz", + "integrity": "sha512-lx8Y93IW2cnJvdoDRKyMmTdYqSC1pOmF0nyG3PGGyA0NI9vBYVgO0KTF6hkyWjdTWVq7XDZyf/h8CJridLh3lg==", + "requires": { + "@antv/g-webgpu-core": "^0.7.2", + "gl-matrix": "^3.1.0", + "lodash": "^4.17.15", + "regl": "^1.3.11" + } + }, + "@antv/g6": { + "version": "4.8.25", + "resolved": "https://registry.npmjs.org/@antv/g6/-/g6-4.8.25.tgz", + "integrity": "sha512-8mdTnN9QMVNQZtlXmftL8fvRsa4L+GajK58Zp51wyrGLFyjeop8R0QSkCALW45DWP2TaQeZAPtjhQUU/wf5hIg==", + "requires": { + "@antv/g6-pc": "0.8.25" + } + }, + "@antv/g6-core": { + "version": "0.8.24", + "resolved": "https://registry.npmjs.org/@antv/g6-core/-/g6-core-0.8.24.tgz", + "integrity": "sha512-rgI3dArAD8uoSz2+skS4ctN4x/Of33ivTIKaEYYvClxgkLZWVz9zvocy+5AWcVPBHZsAXkZcdh9zndIoWY/33A==", + "requires": { + "@antv/algorithm": "^0.1.26", + "@antv/dom-util": "^2.0.1", + "@antv/event-emitter": "~0.1.0", + "@antv/g-base": "^0.5.1", + "@antv/g-math": "^0.1.1", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/path-util": "^2.0.3", + "@antv/util": "~2.0.5", + "ml-matrix": "^6.5.0", + "tslib": "^2.6.2" + } + }, + "@antv/g6-element": { + "version": "0.8.25", + "resolved": "https://registry.npmjs.org/@antv/g6-element/-/g6-element-0.8.25.tgz", + "integrity": "sha512-bPsI+dS9rdp80O/XyV0iy6QiusyOgO/diCIsGQuLHs6rBqjLtDA5yu9JDo49mPA3JblJV0MYjbgL8Exou7Ecqw==", + "requires": { + "@antv/g-base": "^0.5.1", + "@antv/g6-core": "0.8.24", + "@antv/util": "~2.0.5", + "tslib": "^2.6.2" + } + }, + "@antv/g6-pc": { + "version": "0.8.25", + "resolved": "https://registry.npmjs.org/@antv/g6-pc/-/g6-pc-0.8.25.tgz", + "integrity": "sha512-HZ2QyDbgsUQpQBFqrA8Zcvm/rAKN4n3I7XEeWCODZgyhQ8kz2f3qdzrRXDPmMyclexi0JF9DarCs8a2rzhV5YA==", + "requires": { + "@ant-design/colors": "^4.0.5", + "@antv/algorithm": "^0.1.26", + "@antv/dom-util": "^2.0.1", + "@antv/event-emitter": "~0.1.0", + "@antv/g-base": "^0.5.1", + "@antv/g-canvas": "^0.5.2", + "@antv/g-math": "^0.1.1", + "@antv/g-svg": "^0.5.1", + "@antv/g6-core": "0.8.24", + "@antv/g6-element": "0.8.25", + "@antv/g6-plugin": "0.8.25", + "@antv/hierarchy": "^0.6.10", + "@antv/layout": "^0.3.0", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/path-util": "^2.0.3", + "@antv/util": "~2.0.5", + "color": "^3.1.3", + "d3-force": "^2.0.1", + "dagre": "^0.8.5", + "insert-css": "^2.0.0", + "ml-matrix": "^6.5.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@ant-design/colors": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-4.0.5.tgz", + "integrity": "sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q==", + "requires": { + "tinycolor2": "^1.4.1" + } + } + } + }, + "@antv/g6-plugin": { + "version": "0.8.25", + "resolved": "https://registry.npmjs.org/@antv/g6-plugin/-/g6-plugin-0.8.25.tgz", + "integrity": "sha512-TAincRgNzrZNGBt1TvzfQV0Ob6OO3+WCcTrCZb4PzRoOessAiMsNm0S7x+7NFm30DJVC8Ud2M7M2V9DjhVd8Wg==", + "requires": { + "@antv/dom-util": "^2.0.2", + "@antv/g-base": "^0.5.1", + "@antv/g-canvas": "^0.5.2", + "@antv/g-svg": "^0.5.2", + "@antv/g6-core": "0.8.24", + "@antv/g6-element": "0.8.25", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/path-util": "^2.0.3", + "@antv/scale": "^0.3.4", + "@antv/util": "^2.0.9", + "insert-css": "^2.0.0" + } + }, + "@antv/graphin": { + "version": "2.7.27", + "resolved": "https://registry.npmjs.org/@antv/graphin/-/graphin-2.7.27.tgz", + "integrity": "sha512-cqsLl3xpZ5mPgTq5UufcqJDlxzKZSLk9/JWXmoQYpvDC4cpzDjBZeVlaDfhT8iToB5aR15CEIu6j+XsQDMqUsA==", + "requires": { + "@antv/g6": "^4.8.19", + "d3-quadtree": "^3.0.1", + "lodash-es": "^4.17.21" + } + }, + "@antv/graphin-components": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@antv/graphin-components/-/graphin-components-2.4.1.tgz", + "integrity": "sha512-Vaxhg1Jbv76j0SwrDLS5/VoHEx2mJW9CEbNdJ7HuWCaz24imvOymV4FpKSJND2PUq7BgIrzo48NaF3bpfiWZZA==", + "requires": { + "@antv/graphin": "^2.7.18" + } + }, + "@antv/graphin-icons": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@antv/graphin-icons/-/graphin-icons-1.0.0.tgz", + "integrity": "sha512-2nogK6ZrDklnfIOJrqOAgD7iFLjfZIjLbA8pDUbeXN5c9b0Mu84oCfyqg8OmWwvi9Gt80eUzoplo73gKjZECJg==" + }, + "@antv/graphlib": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@antv/graphlib/-/graphlib-1.2.0.tgz", + "integrity": "sha512-hhJOMThec51nU4Fe5p/viLlNIL71uDEgYFzKPajWjr2715SFG1HAgiP6AVylIeqBcAZ04u3Lw7usjl/TuI5RuQ==" + }, + "@antv/hierarchy": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/@antv/hierarchy/-/hierarchy-0.6.14.tgz", + "integrity": "sha512-V3uknf7bhynOqQDw2sg+9r9DwZ9pc6k/EcqyTFdfXB1+ydr7urisP0MipIuimucvQKN+Qkd+d6w601r1UIroqQ==" + }, + "@antv/layout": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@antv/layout/-/layout-0.3.25.tgz", + "integrity": "sha512-d29Aw1PXoAavMRZy7iTB9L5rMBeChFEX0BJ9ELP4TI35ySdCu07YbmPo9ju9OH/6sG2/NB3o85Ayxrre3iwX/g==", + "requires": { + "@antv/g-webgpu": "0.7.2", + "@antv/graphlib": "^1.0.0", + "@antv/util": "^3.3.2", + "d3-force": "^2.1.1", + "d3-quadtree": "^2.0.0", + "dagre-compound": "^0.0.11", + "ml-matrix": "6.5.0" + }, + "dependencies": { + "@antv/util": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-3.3.11.tgz", + "integrity": "sha512-FII08DFM4ABh2q5rPYdr0hMtKXRgeZazvXaFYCs7J7uTcWDHUhczab2qOCJLNDugoj8jFag1djb7wS9ehaRYBg==", + "requires": { + "fast-deep-equal": "^3.1.3", + "gl-matrix": "^3.3.0", + "tslib": "^2.3.1" + } + }, + "d3-quadtree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", + "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + }, + "ml-matrix": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.5.0.tgz", + "integrity": "sha512-sms732Dge+rs5dU4mnjE0oqLWm1WujvR2fr38LgUHRG2cjXjWlO3WJupLYaSz3++2iYr0UrGDK72OAivr3J8dg==", + "requires": { + "ml-array-rescale": "^1.3.1" + } + } + } + }, + "@antv/matrix-util": { + "version": "3.1.0-beta.3", + "resolved": "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.1.0-beta.3.tgz", + "integrity": "sha512-W2R6Za3A6CmG51Y/4jZUM/tFgYSq7vTqJL1VD9dKrvwxS4sE0ZcXINtkp55CdyBwJ6Cwm8pfoRpnD4FnHahN0A==", + "requires": { + "@antv/util": "^2.0.9", + "gl-matrix": "^3.4.3", + "tslib": "^2.0.3" + } + }, + "@antv/path-util": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@antv/path-util/-/path-util-2.0.15.tgz", + "integrity": "sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==", + "requires": { + "@antv/matrix-util": "^3.0.4", + "@antv/util": "^2.0.9", + "tslib": "^2.0.3" + }, + "dependencies": { + "@antv/matrix-util": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.0.4.tgz", + "integrity": "sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==", + "requires": { + "@antv/util": "^2.0.9", + "gl-matrix": "^3.3.0", + "tslib": "^2.0.3" + } + } + } + }, + "@antv/scale": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.3.18.tgz", + "integrity": "sha512-GHwE6Lo7S/Q5fgaLPaCsW+CH+3zl4aXpnN1skOiEY0Ue9/u+s2EySv6aDXYkAqs//i0uilMDD/0/4n8caX9U9w==", + "requires": { + "@antv/util": "~2.0.3", + "fecha": "~4.2.0", + "tslib": "^2.0.0" + } + }, + "@antv/util": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz", + "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", + "requires": { + "csstype": "^3.0.8", + "tslib": "^2.0.3" + } + }, + "@antv/x6": { + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/@antv/x6/-/x6-1.35.1.tgz", + "integrity": "sha512-XLFSGbcT/MOI883YKql9J/CqHUCPZxgwfel+sNN1eQbHA+JXYsGt0t9+IJ1qieaYAlxjgio5up+S9I0n+8QL/A==", + "requires": { + "csstype": "^3.0.3", + "jquery": "^3.5.1", + "jquery-mousewheel": "^3.1.13", + "lodash-es": "^4.17.15", + "mousetrap": "^1.6.5", + "utility-types": "^3.10.0" + } + }, + "@antv/x6-react-components": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/@antv/x6-react-components/-/x6-react-components-1.1.20.tgz", + "integrity": "sha512-HpQqjPCUo+jfcbfW2sr9oxuXMCxWnXxWvE8jXKJzvrlMNZ3kgfxNqMCRxwGi2QTCxLB3g/KYi5/n8kze8ui1/Q==", + "requires": { + "clamp": "^1.0.1", + "classnames": "^2.2.6", + "rc-dropdown": "^3.0.0-alpha.0", + "rc-util": "^4.15.7", + "react-color": "2.17.1", + "react-resize-detector": "^7.0.0", + "ua-parser-js": "^0.7.20" + }, + "dependencies": { + "rc-util": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", + "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", + "requires": { + "add-dom-event-listener": "^1.1.0", + "prop-types": "^15.5.10", + "react-is": "^16.12.0", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0" + } + }, + "react-color": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.17.1.tgz", + "integrity": "sha512-S+I6TkUKJaqfALLkAIfiCZ/MANQyy7dKkf7g9ZU5GTUy2rf8c2Rx62otyvADAviWR+6HRkzdf2vL1Qvz9goCLQ==", + "requires": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.11", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + } + }, + "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==" + } + } + }, + "@antv/x6-react-shape": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@antv/x6-react-shape/-/x6-react-shape-1.6.6.tgz", + "integrity": "sha512-+SIvQWeGhfH9miKDQvJT497iVDs/CcMwcgbNKbPV6qTUaSUeXjz/bZy8knbQ5t9XtkVYeQXZP7swiKK2xMI0UQ==" + }, + "@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "requires": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + } + }, + "@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "requires": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + } + }, + "@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==" + }, + "@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/eslint-parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz", + "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==", + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/eslint-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.27.1.tgz", + "integrity": "sha512-vOG/EipZbIAcREK6XI4JRO3B3uZr70/KIhsrNLO9RXcgLMaW0sTsBpNeTpQUyelB0HsbWd45NIsuTgD3mqr/Og==", + "requires": { + "eslint-rule-composer": "^0.3.0" + } + }, + "@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "requires": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "requires": { + "@babel/types": "^7.27.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "requires": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "requires": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "dependencies": { + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "requires": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "requires": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "requires": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "requires": { + "@babel/types": "^7.27.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "requires": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + } + }, + "@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" + }, + "@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + }, + "@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" + }, + "@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "requires": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + } + }, + "@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "requires": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + } + }, + "@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "requires": { + "@babel/types": "^7.28.4" + } + }, + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + } + }, + "@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + } + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==" + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "requires": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "requires": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "requires": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "requires": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "requires": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "requires": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "requires": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "requires": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "requires": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + } + }, + "@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + } + }, + "@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==" + }, + "@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + } + }, + "@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + } + }, + "@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@codemirror/autocomplete": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.19.0.tgz", + "integrity": "sha512-61Hfv3cF07XvUxNeC3E7jhG8XNi1Yom1G0lRC936oLnlF+jrbrv8rc/J98XlYzcsAoTVupfsf5fLej1aI8kyIg==", + "requires": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "@codemirror/commands": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz", + "integrity": "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==", + "requires": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "@codemirror/language": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.3.tgz", + "integrity": "sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==", + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "@codemirror/lint": { + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz", + "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==", + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "@codemirror/search": { + "version": "6.5.11", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.11.tgz", + "integrity": "sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==", + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "@codemirror/state": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", + "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", + "requires": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "@codemirror/view": { + "version": "6.38.4", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.4.tgz", + "integrity": "sha512-hduz0suCcUSC/kM8Fq3A9iLwInJDl8fD1xLpTIk+5xkNm8z/FT7UsIa9sOXrkpChh+XXc18RzswE8QqELsVl+g==", + "requires": { + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "@csstools/normalize.css": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==" + }, + "@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "requires": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==" + }, + "@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==" + }, + "@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==" + }, + "@ecomfe/eslint-config": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@ecomfe/eslint-config/-/eslint-config-7.5.1.tgz", + "integrity": "sha512-17Qc003QeeP9dZcI838owFLbSPjfCwZofYIu3zbLqpTVxdbxkkijj10fzYnMRGuOW0uGOzSqITzrIaJmLZRHBA==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "@ecomfe/stylelint-config": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ecomfe/stylelint-config/-/stylelint-config-1.1.2.tgz", + "integrity": "sha512-rIrZ7EU+zGVnqWWvYrCJWNrV04jyRSOqbLhsH1vl2FgTyUOBbvErRHfPoGqng8S9MfbIunnkzCDaoqpw6G4Tzw==", + "dev": true + }, + "@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "requires": { + "eslint-visitor-keys": "^3.4.3" + } + }, + "@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==" + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + } + }, + "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==" + } + } + }, + "@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==" + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, + "@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "requires": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.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==" + }, + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" + }, + "@icons/material": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", + "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==" + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" + }, + "ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==" + }, + "@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "requires": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + } + } + }, + "@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "requires": { + "@jest/get-type": "30.1.0" + } + }, + "@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "requires": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==" + }, + "@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + } + } + }, + "@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "requires": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + } + }, + "@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "requires": { + "@sinclair/typebox": "^0.34.0" + } + }, + "@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + } + } + }, + "@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "requires": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + } + }, + "@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "requires": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "dependencies": { + "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" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + }, + "@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" + }, + "@lezer/common": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", + "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==" + }, + "@lezer/highlight": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", + "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@lezer/lr": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", + "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==" + }, + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "requires": { + "eslint-scope": "5.1.1" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "@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==", + "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==" + }, + "@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==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz", + "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==", + "requires": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + } + }, + "@probe.gl/env": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-3.6.0.tgz", + "integrity": "sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==", + "requires": { + "@babel/runtime": "^7.0.0" + } + }, + "@probe.gl/log": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-3.6.0.tgz", + "integrity": "sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==", + "requires": { + "@babel/runtime": "^7.0.0", + "@probe.gl/env": "3.6.0" + } + }, + "@probe.gl/stats": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.6.0.tgz", + "integrity": "sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==", + "requires": { + "@babel/runtime": "^7.0.0" + } + }, + "@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "requires": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + } + }, + "@remix-run/router": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==" + }, + "@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "dependencies": { + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" + }, + "@rushstack/eslint-patch": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz", + "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==" + }, + "@sinclair/typebox": { + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==" + }, + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "requires": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + } + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, + "@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "dependencies": { + "aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "requires": { + "deep-equal": "^2.0.5" + } + }, + "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" + } + } + } + }, + "@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "requires": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + } + }, + "@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + } + }, + "@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + }, + "@tweenjs/tween.js": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz", + "integrity": "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==" + }, + "@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" + }, + "@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "requires": { + "@babel/types": "^7.28.2" + } + }, + "@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/d3-timer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-2.0.3.tgz", + "integrity": "sha512-jhAJzaanK5LqyLQ50jJNIrB8fjL9gwWZTgYjevPvkDLMU+kTAZkYsobI59nYoeSrH1PucuyJEi247Pb90t6XUg==" + }, + "@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + }, + "@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + }, + "dependencies": { + "@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + } + } + }, + "@types/express-serve-static-core": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==" + }, + "@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "requires": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "requires": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + } + }, + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + } + } + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==" + }, + "@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "requires": { + "@types/lodash": "*" + } + }, + "@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + }, + "@types/node": { + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", + "requires": { + "undici-types": "~7.12.0" + } + }, + "@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "requires": { + "@types/node": "*" + } + }, + "@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" + }, + "@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==" + }, + "@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==" + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "requires": { + "@types/node": "*" + } + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==" + }, + "@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "requires": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "requires": { + "@types/jest": "*" + } + }, + "@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, + "@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "requires": { + "@typescript-eslint/utils": "5.62.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "requires": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "requires": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" + }, + "@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "requires": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "3d-force-graph": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/3d-force-graph/-/3d-force-graph-1.79.0.tgz", + "integrity": "sha512-0RUNcfiH12f93loY/iS4wShzhXzdLLN4futvFnintF7eP30DjX+nAdLDAGOZwSflhijQyVwnGtpczNjFrDLUzQ==", + "requires": { + "accessor-fn": "1", + "kapsule": "^1.16", + "three": ">=0.118 <1", + "three-forcegraph": "1", + "three-render-objects": "^1.35" + } + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "dependencies": { + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + } + } + }, + "accessor-fn": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", + "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==" + }, + "acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==" + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "add-dom-event-listener": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz", + "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==", + "requires": { + "object-assign": "4.x" + } + }, + "address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==" + }, + "adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, + "ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==" + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "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" + } + }, + "antd": { + "version": "4.24.16", + "resolved": "https://registry.npmjs.org/antd/-/antd-4.24.16.tgz", + "integrity": "sha512-zZrK4UYxHtU6tGOOf0uG/kBRx1kTvypfuSB3GqE/SBQxFhZ/TZ+yj7Z1qwI8vGfMtUUJdLeuoCAqGDa1zPsXnQ==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons": "^4.8.2", + "@ant-design/react-slick": "~1.0.2", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.6.1", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "lodash": "^4.17.21", + "moment": "^2.29.2", + "rc-cascader": "~3.7.3", + "rc-checkbox": "~3.0.1", + "rc-collapse": "~3.4.2", + "rc-dialog": "~9.0.2", + "rc-drawer": "~6.3.0", + "rc-dropdown": "~4.0.1", + "rc-field-form": "~1.38.2", + "rc-image": "~5.13.0", + "rc-input": "~0.1.4", + "rc-input-number": "~7.3.11", + "rc-mentions": "~1.13.1", + "rc-menu": "~9.8.4", + "rc-motion": "^2.9.0", + "rc-notification": "~4.6.1", + "rc-pagination": "~3.2.0", + "rc-picker": "~2.7.6", + "rc-progress": "~3.4.2", + "rc-rate": "~2.9.3", + "rc-resize-observer": "^1.3.1", + "rc-segmented": "~2.3.0", + "rc-select": "~14.1.18", + "rc-slider": "~10.0.1", + "rc-steps": "~5.0.0", + "rc-switch": "~3.2.2", + "rc-table": "~7.26.0", + "rc-tabs": "~12.5.10", + "rc-textarea": "~0.4.7", + "rc-tooltip": "~5.2.2", + "rc-tree": "~5.7.12", + "rc-tree-select": "~5.5.5", + "rc-trigger": "^5.3.4", + "rc-upload": "~4.3.6", + "rc-util": "^5.37.0", + "scroll-into-view-if-needed": "^2.2.25" + }, + "dependencies": { + "rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" + } + } + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "dependencies": { + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==" + }, + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==" + }, + "array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "requires": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + } + }, + "array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "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==" + }, + "array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + } + }, + "array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "requires": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "requires": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.reduce": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + } + }, + "array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" + }, + "async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==" + }, + "async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==" + }, + "async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "requires": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + } + }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==" + }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==" + }, + "babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "requires": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + } + } + }, + "babel-loader": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "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==" + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "dependencies": { + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "requires": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + } + }, + "babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "requires": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-preset-react-app": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz", + "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==", + "requires": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + }, + "dependencies": { + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + }, + "baseline-browser-mapping": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.9.tgz", + "integrity": "sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "requires": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==" + }, + "binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "requires": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "requires": { + "fill-range": "^7.1.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browserslist": { + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "requires": { + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==" + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "requires": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + } + }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001745", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz", + "integrity": "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==" + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, + "check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" + }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "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==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==" + }, + "ci-info": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==" + }, + "cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==" + }, + "clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==" + }, + "classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "requires": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + } + } + }, + "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==" + }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "requires": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, + "core-js": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==" + }, + "core-js-compat": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "requires": { + "browserslist": "^4.25.3" + } + }, + "core-js-pure": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz", + "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" + }, + "cron-expression-validator": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/cron-expression-validator/-/cron-expression-validator-1.0.20.tgz", + "integrity": "sha512-g0osBTdp+1ryDw2vzlG6UpDPaa4fO94ZChF2R0lEnRurbuUEL74XEVX7xZJ13m4Mq/gb3ni6UQu8+Oqt+eocsw==" + }, + "cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "requires": { + "node-fetch": "^2.7.0" + } + }, + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==" + }, + "css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + } + }, + "css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "requires": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==" + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==" + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "requires": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "requires": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "requires": { + "internmap": "1 - 2" + } + }, + "d3-binarytree": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", + "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==" + }, + "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-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "d3-force": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz", + "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", + "requires": { + "d3-dispatch": "1 - 2", + "d3-quadtree": "1 - 2", + "d3-timer": "1 - 2" + }, + "dependencies": { + "d3-quadtree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", + "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + } + } + }, + "d3-force-3d": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz", + "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==", + "requires": { + "d3-binarytree": "1", + "d3-dispatch": "1 - 3", + "d3-octree": "1", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "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-octree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", + "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==" + }, + "d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" + }, + "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-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "requires": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + } + }, + "d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + }, + "d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "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": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "requires": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "dagre-compound": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/dagre-compound/-/dagre-compound-0.0.11.tgz", + "integrity": "sha512-UrSgRP9LtOZCYb9e5doolZXpc7xayyszgyOs7uakTK4n4KsLegLVTRRtq01GpQd/iZjYw5fWMapx9ed+c80MAQ==" + }, + "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==" + }, + "data-bind-mapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/data-bind-mapper/-/data-bind-mapper-1.0.3.tgz", + "integrity": "sha512-QmU3lyEnbENQPo0M1F9BMu4s6cqNNp8iJA+b/HP2sSb7pf3dxwF3+EP1eO69rwBfH9kFJ1apmzrtogAmVt2/Xw==", + "requires": { + "accessor-fn": "1" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } + } + }, + "data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + } + }, + "data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + } + }, + "data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "requires": { + "@babel/runtime": "^7.21.0" + } + }, + "dayjs": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==" + }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "requires": { + "ms": "^2.1.3" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==" + } + } + }, + "decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + } + }, + "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==" + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "requires": { + "execa": "^5.0.0" + } + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "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==" + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-browser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", + "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + }, + "dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "echarts": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz", + "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", + "requires": { + "tslib": "2.3.0", + "zrender": "5.6.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.5.227", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.227.tgz", + "integrity": "sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA==" + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "requires": { + "stackframe": "^1.3.4" + } + }, + "es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "requires": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + } + }, + "es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + } + }, + "es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" + }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, + "es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "requires": { + "hasown": "^2.0.2" + } + }, + "es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "requires": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + } + }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "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==" + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + } + }, + "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" + } + }, + "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==" + } + } + }, + "eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "requires": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "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==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "requires": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "requires": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "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==", + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "requires": { + "@typescript-eslint/experimental-utils": "^5.0.0" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "requires": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + } + }, + "eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "requires": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==" + }, + "eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "requires": { + "@typescript-eslint/utils": "^5.58.0" + } + }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==" + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" + }, + "eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "requires": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "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==", + "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==" + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" + }, + "expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "requires": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + } + }, + "exponential-backoff": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==" + }, + "express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "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==" + }, + "fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "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.8" + }, + "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==", + "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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==" + }, + "fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "requires": { + "bser": "2.1.1" + } + }, + "fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "requires": { + "fbjs": "^3.0.0" + } + }, + "fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "requires": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + }, + "dependencies": { + "ua-parser-js": { + "version": "1.0.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", + "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==" + } + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "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==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "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==" + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" + }, + "float-tooltip": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz", + "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==", + "requires": { + "d3-selection": "2 - 3", + "kapsule": "^1.16", + "preact": "10" + } + }, + "flux": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", + "requires": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.1" + } + }, + "follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" + }, + "for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "requires": { + "is-callable": "^1.2.7" + } + }, + "foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "requires": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + } + } + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "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" + } + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "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==" + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + } + } + }, + "form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-monkey": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + } + }, + "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==" + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==" + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + } + }, + "gl-matrix": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", + "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==" + }, + "gl-vec2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/gl-vec2/-/gl-vec2-1.3.0.tgz", + "integrity": "sha512-YiqaAuNsheWmUV0Sa8k94kBB0D6RWjwZztyO+trEYS8KzJ6OQB/4686gdrf59wld4hHFIvaxynO3nRxpk1Ij/A==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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==", + "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==" + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "requires": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "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" + } + }, + "globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "requires": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "dependencies": { + "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" + } + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "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==" + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "requires": { + "lodash": "^4.17.15" + } + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "requires": { + "duplexer": "^0.1.2" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==" + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==" + }, + "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.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "requires": { + "dunder-proto": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "highlight-words-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.3.tgz", + "integrity": "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==" + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "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==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + } + }, + "html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "requires": { + "void-elements": "3.1.0" + } + }, + "html-webpack-plugin": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==" + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==" + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "requires": { + "ms": "^2.0.0" + } + }, + "i18next": { + "version": "19.9.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-19.9.2.tgz", + "integrity": "sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg==", + "requires": { + "@babel/runtime": "^7.12.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" + }, + "idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" + }, + "immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, + "import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "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==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "insert-css": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz", + "integrity": "sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA==" + }, + "install": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", + "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==" + }, + "internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + } + }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, + "ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==" + }, + "ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==" + }, + "is-any-array": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz", + "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==" + }, + "is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "requires": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + } + }, + "is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "requires": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + } + }, + "is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "requires": { + "has-bigints": "^1.0.2" + } + }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "requires": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + } + }, + "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==" + }, + "is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "requires": { + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "requires": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "requires": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "requires": { + "call-bound": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "requires": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + }, + "is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "requires": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" + }, + "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==" + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "requires": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" + }, + "is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "requires": { + "call-bound": "^1.0.3" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "requires": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + } + }, + "is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "requires": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + } + }, + "is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "requires": { + "which-typed-array": "^1.1.16" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" + }, + "is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "requires": { + "call-bound": "^1.0.3" + } + }, + "is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "requires": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==" + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "requires": { + "semver": "^7.5.3" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "requires": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + } + }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "requires": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + } + }, + "jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "requires": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + } + }, + "jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "requires": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + } + } + }, + "jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "requires": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "requires": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "requires": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "dependencies": { + "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" + } + }, + "pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "requires": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + } + } + }, + "jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==" + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "requires": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "requires": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "dependencies": { + "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" + } + }, + "pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "requires": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + } + } + }, + "jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "requires": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "dependencies": { + "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" + } + }, + "pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "requires": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + } + } + }, + "jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "requires": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==" + }, + "jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==" + }, + "jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "requires": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" + } + } + }, + "jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + } + }, + "jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "requires": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "dependencies": { + "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" + } + } + } + }, + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "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" + } + } + } + }, + "jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, + "@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "requires": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "requires": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==" + }, + "jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, + "jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==" + }, + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "requires": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "dependencies": { + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "requires": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + }, + "string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "requires": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "char-regex": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==" + } + } + }, + "strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "requires": { + "ansi-regex": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" + } + } + } + } + }, + "jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "requires": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==" + }, + "jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" + }, + "jquery-mousewheel": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.2.2.tgz", + "integrity": "sha512-JP71xTAg08ZY3hcs9ZbYUZ5i+dkSsz4yRl/zpWkAmtzc+kMs5EfPkpkINSidiLYMaR0MTo3DfFGF9WIezMsFQQ==", + "requires": { + "jquery": ">=1.2.6" + } + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, + "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==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "form-data": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } + } + }, + "jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "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==" + }, + "json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "requires": { + "string-convert": "^0.2.0" + } + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "requires": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + }, + "dependencies": { + "esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==" + } + } + }, + "jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" + }, + "jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + } + }, + "kapsule": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", + "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", + "requires": { + "lodash-es": "4" + } + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "requires": { + "json-buffer": "3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" + }, + "language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==" + }, + "language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "requires": { + "language-subtag-registry": "^0.3.20" + } + }, + "launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "requires": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "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==", + "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-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "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==" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "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" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + }, + "lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==" + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + } + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "requires": { + "tmpl": "1.0.5" + } + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==" + }, + "material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "requires": { + "fs-monkey": "^1.0.4" + } + }, + "memoize-one": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.3.tgz", + "integrity": "sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==" + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==" + } + } + }, + "merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "dependencies": { + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + }, + "mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "requires": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "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==" + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" + } + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ml-array-max": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.4.tgz", + "integrity": "sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==", + "requires": { + "is-any-array": "^2.0.0" + } + }, + "ml-array-min": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-1.2.3.tgz", + "integrity": "sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==", + "requires": { + "is-any-array": "^2.0.0" + } + }, + "ml-array-rescale": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-1.3.7.tgz", + "integrity": "sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==", + "requires": { + "is-any-array": "^2.0.0", + "ml-array-max": "^1.2.4", + "ml-array-min": "^1.2.3" + } + }, + "ml-matrix": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.12.1.tgz", + "integrity": "sha512-TJ+8eOFdp+INvzR4zAuwBQJznDUfktMtOB6g/hUcGh3rcyjxbz4Te57Pgri8Q9bhSQ7Zys4IYOGhFdnlgeB6Lw==", + "requires": { + "is-any-array": "^2.0.1", + "ml-array-rescale": "^1.3.7" + } + }, + "moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" + }, + "mousetrap": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", + "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==" + }, + "nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + }, + "negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "ngraph.events": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.4.0.tgz", + "integrity": "sha512-NeDGI4DSyjBNBRtA86222JoYietsmCXbs8CEB0dZ51Xeh4lhVl1y3wpWLumczvnha8sFQIW4E0vvVWwgmX2mGw==" + }, + "ngraph.forcelayout": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ngraph.forcelayout/-/ngraph.forcelayout-3.3.1.tgz", + "integrity": "sha512-MKBuEh1wujyQHFTW57y5vd/uuEOK0XfXYxm3lC7kktjJLRdt/KEKEknyOlc6tjXflqBKEuYBBcu7Ax5VY+S6aw==", + "requires": { + "ngraph.events": "^1.0.0", + "ngraph.merge": "^1.0.0", + "ngraph.random": "^1.0.0" + } + }, + "ngraph.graph": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/ngraph.graph/-/ngraph.graph-20.1.0.tgz", + "integrity": "sha512-1jorNgIc0Kg0L9bTNN4+RCrVvbZ+4pqGVMrbhX3LLyqYcRdLvAQRRnxddmfj9l5f6Eq59SUTfbYZEm8cktiE7Q==", + "requires": { + "ngraph.events": "^1.2.1" + } + }, + "ngraph.merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ngraph.merge/-/ngraph.merge-1.0.0.tgz", + "integrity": "sha512-5J8YjGITUJeapsomtTALYsw7rFveYkM+lBj3QiYZ79EymQcuri65Nw3knQtFxQBU1r5iOaVRXrSwMENUPK62Vg==" + }, + "ngraph.random": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ngraph.random/-/ngraph.random-1.2.0.tgz", + "integrity": "sha512-4EUeAGbB2HWX9njd6bP6tciN6ByJfoaAvmVL9QTaZSeXrW46eNGA9GajiXiPBbvFqxUWFkEbyo6x5qsACUuVfA==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "requires": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node-releases": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==" + }, + "node-sass": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-9.0.0.tgz", + "integrity": "sha512-yltEuuLrfH6M7Pq2gAj5B6Zm7m+gdZoG66wTqG6mIZV/zijq3M2OO2HswtT6oBspPyFhHDcaxWpsBm0fRNDHPg==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "make-fetch-happen": "^10.0.4", + "meow": "^9.0.0", + "nan": "^2.17.0", + "node-gyp": "^8.4.1", + "sass-graph": "^4.0.1", + "stdout-stream": "^1.4.0", + "true-case-path": "^2.2.1" + }, + "dependencies": { + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "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" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "requires": { + "minipass": "^3.1.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + } + } + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "requires": { + "abbrev": "^1.0.0" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "nwsapi": { + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==" + }, + "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-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" + }, + "object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + } + }, + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "requires": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + } + }, + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + } + }, + "object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==" + }, + "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" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "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.5" + } + }, + "own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "requires": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "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==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "dependencies": { + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==" + }, + "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==" + }, + "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==" + }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, + "path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + } + } + }, + "polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "requires": { + "@babel/runtime": "^7.17.8" + } + }, + "possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==" + }, + "postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "requires": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + } + }, + "postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" + }, + "postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "requires": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==" + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" + }, + "postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" + }, + "postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" + }, + "postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" + }, + "postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==" + }, + "postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" + }, + "postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "requires": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "dependencies": { + "lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" + }, + "yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==" + } + } + }, + "postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + } + }, + "postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==" + }, + "postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" + }, + "postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + } + }, + "postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "requires": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==" + }, + "postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, + "postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "requires": { + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "requires": { + "postcss-selector-parser": "^6.1.1" + } + }, + "postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "requires": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==" + }, + "postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" + }, + "postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "requires": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" + }, + "postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + } + } + }, + "postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "preact": { + "version": "10.27.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", + "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "probe.gl": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/probe.gl/-/probe.gl-3.6.0.tgz", + "integrity": "sha512-19JydJWI7+DtR4feV+pu4Mn1I5TAc0xojuxVgZdXIyfmTLfUaFnk4OloWK1bKbPtkgGKLr2lnbnCXmpZEcEp9g==", + "requires": { + "@babel/runtime": "^7.0.0", + "@probe.gl/env": "3.6.0", + "@probe.gl/log": "3.6.0", + "@probe.gl/stats": "3.6.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "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" + }, + "dependencies": { + "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==" + } + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + } + } + }, + "psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "requires": { + "punycode": "^2.3.1" + } + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, + "pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "requires": { + "side-channel": "^1.0.6" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "rc-align": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", + "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-cascader": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.3.tgz", + "integrity": "sha512-KBpT+kzhxDW+hxPiNk4zaKa99+Lie2/8nnI11XF+FIOPl4Bj9VlFZi61GrnWzhLGA7VEN+dTxAkNOjkySDa0dA==", + "requires": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.6.1" + } + }, + "rc-checkbox": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.0.1.tgz", + "integrity": "sha512-k7nxDWxYF+jDI0ZcCvuvj71xONmWRVe5+1MKcERRR9MRyP3tZ69b+yUCSXXh+sik4/Hc9P5wHr2nnUoGS2zBjA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + } + }, + "rc-collapse": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz", + "integrity": "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.2.1", + "shallowequal": "^1.1.0" + } + }, + "rc-dialog": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.4.tgz", + "integrity": "sha512-pmnPRZKd9CGzGgf4a1ysBvMhxm8Afx5fF6M7AzLtJ0qh8X1bshurDlqnK4MBNAB4hAeAMMbz6Ytb1rkGMvKFbQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + } + }, + "rc-drawer": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.3.0.tgz", + "integrity": "sha512-uBZVb3xTAR+dBV53d/bUhTctCw3pwcwJoM7g5aX+7vgwt2zzVzoJ6aqFjYJpBlZ9zp0dVYN8fV+hykFE7c4lig==", + "requires": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.21.2" + } + }, + "rc-dropdown": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.6.2.tgz", + "integrity": "sha512-Wsw7GkVbUXADEs8FPL0v8gd+3mWQiydPFXBlr2imMScQaf8hh79pG9KrBc1DwK+nqHmYOpQfK2gn6jG2AQw9Pw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-trigger": "^5.0.4", + "rc-util": "^5.17.0" + } + }, + "rc-field-form": { + "version": "1.38.2", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.38.2.tgz", + "integrity": "sha512-O83Oi1qPyEv31Sg+Jwvsj6pXc8uQI2BtIAkURr5lvEYHVggXJhdU/nynK8wY1gbw0qR48k731sN5ON4egRCROA==", + "requires": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.32.2" + } + }, + "rc-image": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz", + "integrity": "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==", + "requires": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.0.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.0.6" + } + }, + "rc-input": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz", + "integrity": "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + } + }, + "rc-input-number": { + "version": "7.3.11", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.3.11.tgz", + "integrity": "sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.23.0" + } + }, + "rc-mentions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz", + "integrity": "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-menu": "~9.8.0", + "rc-textarea": "^0.4.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.22.5" + } + }, + "rc-menu": { + "version": "9.8.4", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.4.tgz", + "integrity": "sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.8", + "rc-trigger": "^5.1.2", + "rc-util": "^5.27.0" + } + }, + "rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + } + }, + "rc-notification": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.6.1.tgz", + "integrity": "sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.2.0", + "rc-util": "^5.20.1" + } + }, + "rc-overflow": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.4.1.tgz", + "integrity": "sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + } + }, + "rc-pagination": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", + "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + } + }, + "rc-picker": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.7.6.tgz", + "integrity": "sha512-H9if/BUJUZBOhPfWcPeT15JUI3/ntrG9muzERrXDkSoWmDj4yzmBvumozpxYrHwjcKnjyDGAke68d+whWwvhHA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "date-fns": "2.x", + "dayjs": "1.x", + "moment": "^2.24.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.37.0", + "shallowequal": "^1.1.0" + } + }, + "rc-progress": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.2.tgz", + "integrity": "sha512-iAGhwWU+tsayP+Jkl9T4+6rHeQTG9kDz8JAHZk4XtQOcYN5fj9H34NXNEdRdZx94VUDHMqCb1yOIvi8eJRh67w==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + } + }, + "rc-rate": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.3.tgz", + "integrity": "sha512-2THssUSnRhtqIouQIIXqsZGzRczvp4WsH4WvGuhiwm+LG2fVpDUJliP9O1zeDOZvYfBE/Bup4SgHun/eCkbjgQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + } + }, + "rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "requires": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-segmented": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.3.0.tgz", + "integrity": "sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + } + }, + "rc-select": { + "version": "14.1.18", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.18.tgz", + "integrity": "sha512-4JgY3oG2Yz68ECMUSCON7mtxuJvCSj+LJpHEg/AONaaVBxIIrmI/ZTuMJkyojall/X50YdBe5oMKqHHPNiPzEg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.2.0" + } + }, + "rc-slider": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz", + "integrity": "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.18.1", + "shallowequal": "^1.1.0" + } + }, + "rc-steps": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-5.0.0.tgz", + "integrity": "sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==", + "requires": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + } + }, + "rc-switch": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz", + "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.0.1" + } + }, + "rc-table": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz", + "integrity": "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.22.5", + "shallowequal": "^1.1.0" + } + }, + "rc-tabs": { + "version": "12.5.10", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.10.tgz", + "integrity": "sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.0.0", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.16.0" + }, + "dependencies": { + "rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" + } + } + } + }, + "rc-textarea": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz", + "integrity": "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.24.4", + "shallowequal": "^1.1.0" + } + }, + "rc-tooltip": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz", + "integrity": "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.3.1", + "rc-trigger": "^5.0.0" + } + }, + "rc-tree": { + "version": "5.7.12", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.12.tgz", + "integrity": "sha512-LXA5nY2hG5koIAlHW5sgXgLpOMz+bFRbnZZ+cCg0tQs4Wv1AmY7EDi1SK7iFXhslYockbqUerQan82jljoaItg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + } + }, + "rc-tree-select": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz", + "integrity": "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.16.1" + } + }, + "rc-trigger": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", + "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.19.2" + } + }, + "rc-upload": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.6.tgz", + "integrity": "sha512-Bt7ESeG5tT3IY82fZcP+s0tQU2xmo1W6P3S8NboUUliquJLQYLkUcsaExi3IlBVr43GQMCjo30RA2o0i70+NjA==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + } + }, + "rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "requires": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "dependencies": { + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + } + } + }, + "rc-virtual-list": { + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.19.2.tgz", + "integrity": "sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==", + "requires": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + } + }, + "react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "requires": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "dependencies": { + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + } + } + }, + "react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", + "requires": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "react-color": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", + "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", + "requires": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + } + }, + "react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "requires": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "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" + } + }, + "loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==" + } + } + }, + "react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + } + }, + "react-error-overlay": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==" + }, + "react-highlight-words": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-highlight-words/-/react-highlight-words-0.18.0.tgz", + "integrity": "sha512-5z+46eLPjB4JWgOhuQ0E+6iUPTD1U3amiy5KKjzZmeJ5zyvHr91hnzBT3UHya/KlySm5KRTKpYpba9vs67oO2A==", + "requires": { + "highlight-words-core": "^1.2.0", + "memoize-one": "^4.0.0", + "prop-types": "^15.5.8" + } + }, + "react-i18next": { + "version": "11.18.6", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.6.tgz", + "integrity": "sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==", + "requires": { + "@babel/runtime": "^7.14.5", + "html-parse-stringify": "^3.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "requires": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + } + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" + }, + "react-resize-detector": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-7.1.2.tgz", + "integrity": "sha512-zXnPJ2m8+6oq9Nn8zsep/orts9vQv3elrpA+R8XTcW7DVVUJ9vwDwMXaBtykAYjMnkCIaOoK9vObyR7ZgFNlOw==", + "requires": { + "lodash": "^4.17.21" + } + }, + "react-router": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", + "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", + "requires": { + "@remix-run/router": "1.23.0" + } + }, + "react-router-dom": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", + "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", + "requires": { + "@remix-run/router": "1.23.0", + "react-router": "6.30.1" + } + }, + "react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "requires": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "fsevents": "^2.3.2", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "react-textarea-autosize": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz", + "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==", + "requires": { + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + } + }, + "reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "requires": { + "lodash": "^4.0.1" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + }, + "dependencies": { + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + } + }, + "recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "requires": { + "minimatch": "^3.0.5" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "requires": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "requires": { + "regenerate": "^1.4.2" + } + }, + "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==" + }, + "regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==" + }, + "regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "requires": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + } + }, + "regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + } + }, + "regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" + }, + "regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "requires": { + "jsesc": "~3.1.0" + } + }, + "regl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/regl/-/regl-1.7.0.tgz", + "integrity": "sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w==" + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "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==" + }, + "resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" + }, + "reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" + }, + "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" + } + }, + "rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, + "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==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "requires": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + } + }, + "safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" + }, + "sass-graph": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.1.tgz", + "integrity": "sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA==", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.17.11", + "scss-tokenizer": "^0.4.3", + "yargs": "^17.2.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + } + }, + "sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "screenfull": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-6.0.2.tgz", + "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==" + }, + "scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "requires": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "scss-tokenizer": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz", + "integrity": "sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw==", + "requires": { + "js-base64": "^2.4.9", + "source-map": "^0.7.3" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "requires": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + } + }, + "semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==" + }, + "send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + } + } + }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "requires": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, + "set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "requires": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "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==", + "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==" + }, + "shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==" + }, + "side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==" + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "requires": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==" + }, + "source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + }, + "source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "requires": { + "escodegen": "^1.8.1" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "requires": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + } + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + } + } + }, + "string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + } + }, + "string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + } + }, + "string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + } + }, + "string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } + }, + "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==" + }, + "style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==" + }, + "style-mod": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==" + }, + "stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "requires": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + } + }, + "sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, + "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-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.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==" + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "dependencies": { + "lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" + }, + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==" + }, + "tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + } + } + }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" + }, + "tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "requires": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "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==" + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "three": { + "version": "0.180.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.180.0.tgz", + "integrity": "sha512-o+qycAMZrh+TsE01GqWUxUIKR1AL0S8pq7zDkYOQw8GqfX8b8VoCKYUoHbhiX5j+7hr8XsuHDVU6+gkQJQKg9w==" + }, + "three-forcegraph": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/three-forcegraph/-/three-forcegraph-1.43.0.tgz", + "integrity": "sha512-1AqLmTCjjjwcuccObG96fCxiRnNJjCLdA5Mozl7XK+ROwTJ6QEJPo2XJ6uxWeuAmPE7ukMhgv4lj28oZSfE4wg==", + "requires": { + "accessor-fn": "1", + "d3-array": "1 - 3", + "d3-force-3d": "2 - 3", + "d3-scale": "1 - 4", + "d3-scale-chromatic": "1 - 3", + "data-bind-mapper": "1", + "kapsule": "^1.16", + "ngraph.forcelayout": "3", + "ngraph.graph": "20", + "tinycolor2": "1" + } + }, + "three-render-objects": { + "version": "1.40.4", + "resolved": "https://registry.npmjs.org/three-render-objects/-/three-render-objects-1.40.4.tgz", + "integrity": "sha512-Ukpu1pei3L5r809izvjsZxwuRcYLiyn6Uvy3lZ9bpMTdvj3i6PeX6w++/hs2ZS3KnEzGjb6YvTvh4UQuwHTDJg==", + "requires": { + "@tweenjs/tween.js": "18 - 25", + "accessor-fn": "1", + "float-tooltip": "^1.7", + "kapsule": "^1.16", + "polished": "4" + } + }, + "throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" + }, + "throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==" + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==" + }, + "true-case-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", + "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==" + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "requires": { + "minimist": "^1.2.0" + } + }, + "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==" + } + } + }, + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "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==" + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "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==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + } + }, + "typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "requires": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + } + }, + "typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + } + }, + "typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" + }, + "ua-parser-js": { + "version": "0.7.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", + "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==" + }, + "unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "requires": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "undici-types": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==" + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==" + }, + "unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==" + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "requires": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use-composed-ref": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz", + "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==" + }, + "use-isomorphic-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", + "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==" + }, + "use-latest": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz", + "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==", + "requires": { + "use-isomorphic-layout-effect": "^1.1.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validator": { + "version": "13.15.15", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", + "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "vis-network": { + "version": "9.1.13", + "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.1.13.tgz", + "integrity": "sha512-HLeHd5KZS92qzO1kC59qMh1/FWAZxMUEwUWBwDMoj6RKj/Ajkrgy/heEYo0Zc8SZNQ2J+u6omvK2+a28GX1QuQ==" + }, + "void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "webpack": { + "version": "5.101.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", + "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", + "requires": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + } + }, + "webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "dependencies": { + "ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==" + } + } + }, + "webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "requires": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + } + } + }, + "webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==" + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + } + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "requires": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + } + }, + "which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "requires": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + } + }, + "which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "requires": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + } + }, + "which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" + }, + "workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "requires": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "requires": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" + }, + "workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "requires": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "requires": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "requires": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "requires": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "requires": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" + }, + "workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "requires": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "requires": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==" + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "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==" + }, + "zrender": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz", + "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "requires": { + "tslib": "2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + } + } +} diff --git a/hugegraph-hubble/hubble-fe/package.json b/hugegraph-hubble/hubble-fe/package.json index 711ca918e..71ba6724c 100644 --- a/hugegraph-hubble/hubble-fe/package.json +++ b/hugegraph-hubble/hubble-fe/package.json @@ -1,57 +1,63 @@ { "name": "hubble", - "version": "1.6.0", - "author": "wangzixi", - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "https://github.com/hugegraph/hugegraph-hubble" - }, + "version": "0.1.0", + "private": true, "dependencies": { - "@types/classnames": "^2.2.10", - "@types/codemirror": "^0.0.96", - "@types/d3": "^5.7.2", - "@types/file-saver": "^2.0.1", - "@types/jest": "24.0.15", - "@types/lodash-es": "^4.17.3", - "@types/node": "14.11.8", - "@types/react": "16.9.52", - "@types/react-dom": "16.9.8", - "@types/react-highlight-words": "^0.16.1", - "@types/uuid": "^8.3.0", - "@types/validator": "^13.1.0", - "antd": "^4.18.5", - "axios": "^0.19.0", - "classnames": "^2.2.6", - "codemirror": "^5.55.0", - "file-saver": "^2.0.2", - "framer-motion": "^2.1.2", "i18next": "^19.5.3", - "less": "^3.11.3", - "lodash-es": "^4.17.15", - "mobx": "^5.13.0", - "mobx-react": "^6.2.2", - "prettier": "^2.0.5", - "react": "^16.13.1", - "react-dnd": "^11.1.3", - "react-dnd-html5-backend": "^11.1.3", - "react-dom": "^16.13.1", - "react-highlight-words": "^0.16.0", "react-i18next": "^11.7.3", - "react-json-view": "^1.19.1", - "react-popper-tooltip": "^2.11.1", - "react-scripts": "3.4.1", - "typescript": "^3.9.6", - "uuid": "^8.3.1", - "validator": "^13.1.1", - "vis-network": "7.3.5", - "wouter": "^2.5.1" + "@types/lodash-es": "^4.17.3", + "@ant-design/icons": "^4.7.0", + "@antv/g6": "^4.6.15", + "@antv/graphin": "^2.7.12", + "@antv/graphin-components": "^2.4.0", + "@antv/graphin-icons": "^1.0.0", + "@antv/x6": "^1.34.6", + "@antv/x6-react-components": "^1.1.20", + "@antv/x6-react-shape": "^1.6.3", + "@babel/eslint-plugin": "^7.18.10", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^13.5.0", + "3d-force-graph": "^1.71.2", + "ajv": "8.17.1", + "antd": "^4.23.1", + "axios": "^0.27.2", + "codemirror": "^6.0.1", + "cron-expression-validator": "^1.0.20", + "date-fns": "^2.29.3", + "echarts": "^5.4.1", + "http-proxy-middleware": "^2.0.6", + "install": "^0.13.0", + "json-bigint": "^1.0.0", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "node-gyp": "^9.4.0", + "sass": "^1.54.0", + "react": "^18.2.0", + "react-color": "^2.19.3", + "react-dom": "^18.2.0", + "react-highlight-words": "^0.18.0", + "react-json-view": "^1.21.3", + "react-router-dom": "^6.3.0", + "react-scripts": "5.0.1", + "screenfull": "^6.0.2", + "typescript": "^4.7.4", + "validator": "^13.7.0", + "vis-network": "^9.1.2", + "web-vitals": "^2.1.4" }, "scripts": { - "start": "react-app-rewired start", - "build": "CI=false && react-app-rewired build && yarn run license", - "test": "react-app-rewired test", - "license": "node add-license.js" + "start": "react-scripts start", + "build": "node scripts/check-i18n.js && react-scripts build", + "i18n:check": "node scripts/check-i18n.js", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] }, "browserslist": { "production": [ @@ -66,13 +72,10 @@ ] }, "devDependencies": { - "customize-cra": "^0.9.1", - "less-loader": "^5.0.0", - "react-app-rewired": "^2.1.6", - "stylelint": "^13.6.1", - "stylelint-config-standard": "^20.0.0" - }, - "keywords": [ - "hugegraph" - ] + "@ecomfe/eslint-config": "^7.4.0", + "@ecomfe/stylelint-config": "^1.1.2", + "eslint": "^8.19.0", + "eslint-plugin-react": "^7.30.1", + "resize-observer-polyfill": "^1.5.1" + } } diff --git a/hugegraph-hubble/hubble-fe/public/index.html b/hugegraph-hubble/hubble-fe/public/index.html index c5bcd62a8..adfc86805 100644 --- a/hugegraph-hubble/hubble-fe/public/index.html +++ b/hugegraph-hubble/hubble-fe/public/index.html @@ -1,38 +1,70 @@ - + - + - - + + - HugeGraph + + 数据管理平台 +
+ diff --git a/hugegraph-hubble/hubble-fe/public/logo192.png b/hugegraph-hubble/hubble-fe/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 zcmZWtbyO6NvR-oO24RV%BvuJ&=?+<7=`LvyB&A_#M7mSDYw1v6DJkiYl9XjT!%$dLEBTQ8R9|wd3008in6lFF3GV-6mLi?MoP_y~}QUnaDCHI#t z7w^m$@6DI)|C8_jrT?q=f8D?0AM?L)Z}xAo^e^W>t$*Y0KlT5=@bBjT9kxb%-KNdk zeOS1tKO#ChhG7%{ApNBzE2ZVNcxbrin#E1TiAw#BlUhXllzhN$qWez5l;h+t^q#Eav8PhR2|T}y5kkflaK`ba-eoE+Z2q@o6P$)=&` z+(8}+-McnNO>e#$Rr{32ngsZIAX>GH??tqgwUuUz6kjns|LjsB37zUEWd|(&O!)DY zQLrq%Y>)Y8G`yYbYCx&aVHi@-vZ3|ebG!f$sTQqMgi0hWRJ^Wc+Ibv!udh_r%2|U) zPi|E^PK?UE!>_4`f`1k4hqqj_$+d!EB_#IYt;f9)fBOumGNyglU(ofY`yHq4Y?B%- zp&G!MRY<~ajTgIHErMe(Z8JG*;D-PJhd@RX@QatggM7+G(Lz8eZ;73)72Hfx5KDOE zkT(m}i2;@X2AT5fW?qVp?@WgN$aT+f_6eo?IsLh;jscNRp|8H}Z9p_UBO^SJXpZew zEK8fz|0Th%(Wr|KZBGTM4yxkA5CFdAj8=QSrT$fKW#tweUFqr0TZ9D~a5lF{)%-tTGMK^2tz(y2v$i%V8XAxIywrZCp=)83p(zIk6@S5AWl|Oa2hF`~~^W zI;KeOSkw1O#TiQ8;U7OPXjZM|KrnN}9arP)m0v$c|L)lF`j_rpG(zW1Qjv$=^|p*f z>)Na{D&>n`jOWMwB^TM}slgTEcjxTlUby89j1)|6ydRfWERn3|7Zd2&e7?!K&5G$x z`5U3uFtn4~SZq|LjFVrz$3iln-+ucY4q$BC{CSm7Xe5c1J<=%Oagztj{ifpaZk_bQ z9Sb-LaQMKp-qJA*bP6DzgE3`}*i1o3GKmo2pn@dj0;He}F=BgINo};6gQF8!n0ULZ zL>kC0nPSFzlcB7p41doao2F7%6IUTi_+!L`MM4o*#Y#0v~WiO8uSeAUNp=vA2KaR&=jNR2iVwG>7t%sG2x_~yXzY)7K& zk3p+O0AFZ1eu^T3s};B%6TpJ6h-Y%B^*zT&SN7C=N;g|#dGIVMSOru3iv^SvO>h4M=t-N1GSLLDqVTcgurco6)3&XpU!FP6Hlrmj}f$ zp95;b)>M~`kxuZF3r~a!rMf4|&1=uMG$;h^g=Kl;H&Np-(pFT9FF@++MMEx3RBsK?AU0fPk-#mdR)Wdkj)`>ZMl#^<80kM87VvsI3r_c@_vX=fdQ`_9-d(xiI z4K;1y1TiPj_RPh*SpDI7U~^QQ?%0&!$Sh#?x_@;ag)P}ZkAik{_WPB4rHyW#%>|Gs zdbhyt=qQPA7`?h2_8T;-E6HI#im9K>au*(j4;kzwMSLgo6u*}-K`$_Gzgu&XE)udQ zmQ72^eZd|vzI)~!20JV-v-T|<4@7ruqrj|o4=JJPlybwMg;M$Ud7>h6g()CT@wXm` zbq=A(t;RJ^{Xxi*Ff~!|3!-l_PS{AyNAU~t{h;(N(PXMEf^R(B+ZVX3 z8y0;0A8hJYp@g+c*`>eTA|3Tgv9U8#BDTO9@a@gVMDxr(fVaEqL1tl?md{v^j8aUv zm&%PX4^|rX|?E4^CkplWWNv*OKM>DxPa z!RJ)U^0-WJMi)Ksc!^ixOtw^egoAZZ2Cg;X7(5xZG7yL_;UJ#yp*ZD-;I^Z9qkP`} zwCTs0*%rIVF1sgLervtnUo&brwz?6?PXRuOCS*JI-WL6GKy7-~yi0giTEMmDs_-UX zo=+nFrW_EfTg>oY72_4Z0*uG>MnXP=c0VpT&*|rvv1iStW;*^={rP1y?Hv+6R6bxFMkxpWkJ>m7Ba{>zc_q zEefC3jsXdyS5??Mz7IET$Kft|EMNJIv7Ny8ZOcKnzf`K5Cd)&`-fTY#W&jnV0l2vt z?Gqhic}l}mCv1yUEy$%DP}4AN;36$=7aNI^*AzV(eYGeJ(Px-j<^gSDp5dBAv2#?; zcMXv#aj>%;MiG^q^$0MSg-(uTl!xm49dH!{X0){Ew7ThWV~Gtj7h%ZD zVN-R-^7Cf0VH!8O)uUHPL2mO2tmE*cecwQv_5CzWeh)ykX8r5Hi`ehYo)d{Jnh&3p z9ndXT$OW51#H5cFKa76c<%nNkP~FU93b5h-|Cb}ScHs@4Q#|}byWg;KDMJ#|l zE=MKD*F@HDBcX@~QJH%56eh~jfPO-uKm}~t7VkHxHT;)4sd+?Wc4* z>CyR*{w@4(gnYRdFq=^(#-ytb^5ESD?x<0Skhb%Pt?npNW1m+Nv`tr9+qN<3H1f<% zZvNEqyK5FgPsQ`QIu9P0x_}wJR~^CotL|n zk?dn;tLRw9jJTur4uWoX6iMm914f0AJfB@C74a;_qRrAP4E7l890P&{v<}>_&GLrW z)klculcg`?zJO~4;BBAa=POU%aN|pmZJn2{hA!d!*lwO%YSIzv8bTJ}=nhC^n}g(ld^rn#kq9Z3)z`k9lvV>y#!F4e{5c$tnr9M{V)0m(Z< z#88vX6-AW7T2UUwW`g<;8I$Jb!R%z@rCcGT)-2k7&x9kZZT66}Ztid~6t0jKb&9mm zpa}LCb`bz`{MzpZR#E*QuBiZXI#<`5qxx=&LMr-UUf~@dRk}YI2hbMsAMWOmDzYtm zjof16D=mc`^B$+_bCG$$@R0t;e?~UkF?7<(vkb70*EQB1rfUWXh$j)R2)+dNAH5%R zEBs^?N;UMdy}V};59Gu#0$q53$}|+q7CIGg_w_WlvE}AdqoS<7DY1LWS9?TrfmcvT zaypmplwn=P4;a8-%l^e?f`OpGb}%(_mFsL&GywhyN(-VROj`4~V~9bGv%UhcA|YW% zs{;nh@aDX11y^HOFXB$a7#Sr3cEtNd4eLm@Y#fc&j)TGvbbMwze zXtekX_wJqxe4NhuW$r}cNy|L{V=t#$%SuWEW)YZTH|!iT79k#?632OFse{+BT_gau zJwQcbH{b}dzKO?^dV&3nTILYlGw{27UJ72ZN){BILd_HV_s$WfI2DC<9LIHFmtyw? zQ;?MuK7g%Ym+4e^W#5}WDLpko%jPOC=aN)3!=8)s#Rnercak&b3ESRX3z{xfKBF8L z5%CGkFmGO@x?_mPGlpEej!3!AMddChabyf~nJNZxx!D&{@xEb!TDyvqSj%Y5@A{}9 zRzoBn0?x}=krh{ok3Nn%e)#~uh;6jpezhA)ySb^b#E>73e*frBFu6IZ^D7Ii&rsiU z%jzygxT-n*joJpY4o&8UXr2s%j^Q{?e-voloX`4DQyEK+DmrZh8A$)iWL#NO9+Y@!sO2f@rI!@jN@>HOA< z?q2l{^%mY*PNx2FoX+A7X3N}(RV$B`g&N=e0uvAvEN1W^{*W?zT1i#fxuw10%~))J zjx#gxoVlXREWZf4hRkgdHx5V_S*;p-y%JtGgQ4}lnA~MBz-AFdxUxU1RIT$`sal|X zPB6sEVRjGbXIP0U+?rT|y5+ev&OMX*5C$n2SBPZr`jqzrmpVrNciR0e*Wm?fK6DY& zl(XQZ60yWXV-|Ps!A{EF;=_z(YAF=T(-MkJXUoX zI{UMQDAV2}Ya?EisdEW;@pE6dt;j0fg5oT2dxCi{wqWJ<)|SR6fxX~5CzblPGr8cb zUBVJ2CQd~3L?7yfTpLNbt)He1D>*KXI^GK%<`bq^cUq$Q@uJifG>p3LU(!H=C)aEL zenk7pVg}0{dKU}&l)Y2Y2eFMdS(JS0}oZUuVaf2+K*YFNGHB`^YGcIpnBlMhO7d4@vV zv(@N}(k#REdul8~fP+^F@ky*wt@~&|(&&meNO>rKDEnB{ykAZ}k>e@lad7to>Ao$B zz<1(L=#J*u4_LB=8w+*{KFK^u00NAmeNN7pr+Pf+N*Zl^dO{LM-hMHyP6N!~`24jd zXYP|Ze;dRXKdF2iJG$U{k=S86l@pytLx}$JFFs8e)*Vi?aVBtGJ3JZUj!~c{(rw5>vuRF$`^p!P8w1B=O!skwkO5yd4_XuG^QVF z`-r5K7(IPSiKQ2|U9+`@Js!g6sfJwAHVd|s?|mnC*q zp|B|z)(8+mxXyxQ{8Pg3F4|tdpgZZSoU4P&9I8)nHo1@)9_9u&NcT^FI)6|hsAZFk zZ+arl&@*>RXBf-OZxhZerOr&dN5LW9@gV=oGFbK*J+m#R-|e6(Loz(;g@T^*oO)0R zN`N=X46b{7yk5FZGr#5&n1!-@j@g02g|X>MOpF3#IjZ_4wg{dX+G9eqS+Es9@6nC7 zD9$NuVJI}6ZlwtUm5cCAiYv0(Yi{%eH+}t)!E^>^KxB5^L~a`4%1~5q6h>d;paC9c zTj0wTCKrhWf+F#5>EgX`sl%POl?oyCq0(w0xoL?L%)|Q7d|Hl92rUYAU#lc**I&^6p=4lNQPa0 znQ|A~i0ip@`B=FW-Q;zh?-wF;Wl5!+q3GXDu-x&}$gUO)NoO7^$BeEIrd~1Dh{Tr` z8s<(Bn@gZ(mkIGnmYh_ehXnq78QL$pNDi)|QcT*|GtS%nz1uKE+E{7jdEBp%h0}%r zD2|KmYGiPa4;md-t_m5YDz#c*oV_FqXd85d@eub?9N61QuYcb3CnVWpM(D-^|CmkL z(F}L&N7qhL2PCq)fRh}XO@U`Yn<?TNGR4L(mF7#4u29{i~@k;pLsgl({YW5`Mo+p=zZn3L*4{JU;++dG9 X@eDJUQo;Ye2mwlRs?y0|+_a0zY+Zo%Dkae}+MySoIppb75o?vUW_?)>@g{U2`ERQIXV zeY$JrWnMZ$QC<=ii4X|@0H8`si75jB(ElJb00HAB%>SlLR{!zO|C9P3zxw_U8?1d8uRZ=({Ga4shyN}3 zAK}WA(ds|``G4jA)9}Bt2Hy0+f3rV1E6b|@?hpGA=PI&r8)ah|)I2s(P5Ic*Ndhn^ z*T&j@gbCTv7+8rpYbR^Ty}1AY)YH;p!m948r#%7x^Z@_-w{pDl|1S4`EM3n_PaXvK z1JF)E3qy$qTj5Xs{jU9k=y%SQ0>8E$;x?p9ayU0bZZeo{5Z@&FKX>}s!0+^>C^D#z z>xsCPvxD3Z=dP}TTOSJhNTPyVt14VCQ9MQFN`rn!c&_p?&4<5_PGm4a;WS&1(!qKE z_H$;dDdiPQ!F_gsN`2>`X}$I=B;={R8%L~`>RyKcS$72ai$!2>d(YkciA^J0@X%G4 z4cu!%Ps~2JuJ8ex`&;Fa0NQOq_nDZ&X;^A=oc1&f#3P1(!5il>6?uK4QpEG8z0Rhu zvBJ+A9RV?z%v?!$=(vcH?*;vRs*+PPbOQ3cdPr5=tOcLqmfx@#hOqX0iN)wTTO21jH<>jpmwRIAGw7`a|sl?9y9zRBh>(_%| zF?h|P7}~RKj?HR+q|4U`CjRmV-$mLW>MScKnNXiv{vD3&2@*u)-6P@h0A`eeZ7}71 zK(w%@R<4lLt`O7fs1E)$5iGb~fPfJ?WxhY7c3Q>T-w#wT&zW522pH-B%r5v#5y^CF zcC30Se|`D2mY$hAlIULL%-PNXgbbpRHgn<&X3N9W!@BUk@9g*P5mz-YnZBb*-$zMM z7Qq}ic0mR8n{^L|=+diODdV}Q!gwr?y+2m=3HWwMq4z)DqYVg0J~^}-%7rMR@S1;9 z7GFj6K}i32X;3*$SmzB&HW{PJ55kT+EI#SsZf}bD7nW^Haf}_gXciYKX{QBxIPSx2Ma? zHQqgzZq!_{&zg{yxqv3xq8YV+`S}F6A>Gtl39_m;K4dA{pP$BW0oIXJ>jEQ!2V3A2 zdpoTxG&V=(?^q?ZTj2ZUpDUdMb)T?E$}CI>r@}PFPWD9@*%V6;4Ag>D#h>!s)=$0R zRXvdkZ%|c}ubej`jl?cS$onl9Tw52rBKT)kgyw~Xy%z62Lr%V6Y=f?2)J|bZJ5(Wx zmji`O;_B+*X@qe-#~`HFP<{8$w@z4@&`q^Q-Zk8JG3>WalhnW1cvnoVw>*R@c&|o8 zZ%w!{Z+MHeZ*OE4v*otkZqz11*s!#s^Gq>+o`8Z5 z^i-qzJLJh9!W-;SmFkR8HEZJWiXk$40i6)7 zZpr=k2lp}SasbM*Nbn3j$sn0;rUI;%EDbi7T1ZI4qL6PNNM2Y%6{LMIKW+FY_yF3) zSKQ2QSujzNMSL2r&bYs`|i2Dnn z=>}c0>a}>|uT!IiMOA~pVT~R@bGlm}Edf}Kq0?*Af6#mW9f9!}RjW7om0c9Qlp;yK z)=XQs(|6GCadQbWIhYF=rf{Y)sj%^Id-ARO0=O^Ad;Ph+ z0?$eE1xhH?{T$QI>0JP75`r)U_$#%K1^BQ8z#uciKf(C701&RyLQWBUp*Q7eyn76} z6JHpC9}R$J#(R0cDCkXoFSp;j6{x{b&0yE@P7{;pCEpKjS(+1RQy38`=&Yxo%F=3y zCPeefABp34U-s?WmU#JJw23dcC{sPPFc2#J$ZgEN%zod}J~8dLm*fx9f6SpO zn^Ww3bt9-r0XaT2a@Wpw;C23XM}7_14#%QpubrIw5aZtP+CqIFmsG4`Cm6rfxl9n5 z7=r2C-+lM2AB9X0T_`?EW&Byv&K?HS4QLoylJ|OAF z`8atBNTzJ&AQ!>sOo$?^0xj~D(;kS$`9zbEGd>f6r`NC3X`tX)sWgWUUOQ7w=$TO&*j;=u%25ay-%>3@81tGe^_z*C7pb9y*Ed^H3t$BIKH2o+olp#$q;)_ zfpjCb_^VFg5fU~K)nf*d*r@BCC>UZ!0&b?AGk_jTPXaSnCuW110wjHPPe^9R^;jo3 zwvzTl)C`Zl5}O2}3lec=hZ*$JnkW#7enKKc)(pM${_$9Hc=Sr_A9Biwe*Y=T?~1CK z6eZ9uPICjy-sMGbZl$yQmpB&`ouS8v{58__t0$JP%i3R&%QR3ianbZqDs<2#5FdN@n5bCn^ZtH992~5k(eA|8|@G9u`wdn7bnpg|@{m z^d6Y`*$Zf2Xr&|g%sai#5}Syvv(>Jnx&EM7-|Jr7!M~zdAyjt*xl;OLhvW-a%H1m0 z*x5*nb=R5u><7lyVpNAR?q@1U59 zO+)QWwL8t zyip?u_nI+K$uh{y)~}qj?(w0&=SE^8`_WMM zTybjG=999h38Yes7}-4*LJ7H)UE8{mE(6;8voE+TYY%33A>S6`G_95^5QHNTo_;Ao ztIQIZ_}49%{8|=O;isBZ?=7kfdF8_@azfoTd+hEJKWE!)$)N%HIe2cplaK`ry#=pV z0q{9w-`i0h@!R8K3GC{ivt{70IWG`EP|(1g7i_Q<>aEAT{5(yD z=!O?kq61VegV+st@XCw475j6vS)_z@efuqQgHQR1T4;|-#OLZNQJPV4k$AX1Uk8Lm z{N*b*ia=I+MB}kWpupJ~>!C@xEN#Wa7V+7{m4j8c?)ChV=D?o~sjT?0C_AQ7B-vxqX30s0I_`2$in86#`mAsT-w?j{&AL@B3$;P z31G4(lV|b}uSDCIrjk+M1R!X7s4Aabn<)zpgT}#gE|mIvV38^ODy@<&yflpCwS#fRf9ZX3lPV_?8@C5)A;T zqmouFLFk;qIs4rA=hh=GL~sCFsXHsqO6_y~*AFt939UYVBSx1s(=Kb&5;j7cSowdE;7()CC2|-i9Zz+_BIw8#ll~-tyH?F3{%`QCsYa*b#s*9iCc`1P1oC26?`g<9))EJ3%xz+O!B3 zZ7$j~To)C@PquR>a1+Dh>-a%IvH_Y7^ys|4o?E%3`I&ADXfC8++hAdZfzIT#%C+Jz z1lU~K_vAm0m8Qk}K$F>|>RPK%<1SI0(G+8q~H zAsjezyP+u!Se4q3GW)`h`NPSRlMoBjCzNPesWJwVTY!o@G8=(6I%4XHGaSiS3MEBK zhgGFv6Jc>L$4jVE!I?TQuwvz_%CyO!bLh94nqK11C2W$*aa2ueGopG8DnBICVUORP zgytv#)49fVXDaR$SukloYC3u7#5H)}1K21=?DKj^U)8G;MS)&Op)g^zR2($<>C*zW z;X7`hLxiIO#J`ANdyAOJle4V%ppa*(+0i3w;8i*BA_;u8gOO6)MY`ueq7stBMJTB; z-a0R>hT*}>z|Gg}@^zDL1MrH+2hsR8 zHc}*9IvuQC^Ju)^#Y{fOr(96rQNPNhxc;mH@W*m206>Lo<*SaaH?~8zg&f&%YiOEG zGiz?*CP>Bci}!WiS=zj#K5I}>DtpregpP_tfZtPa(N<%vo^#WCQ5BTv0vr%Z{)0q+ z)RbfHktUm|lg&U3YM%lMUM(fu}i#kjX9h>GYctkx9Mt_8{@s%!K_EI zScgwy6%_fR?CGJQtmgNAj^h9B#zmaMDWgH55pGuY1Gv7D z;8Psm(vEPiwn#MgJYu4Ty9D|h!?Rj0ddE|&L3S{IP%H4^N!m`60ZwZw^;eg4sk6K{ ziA^`Sbl_4~f&Oo%n;8Ye(tiAdlZKI!Z=|j$5hS|D$bDJ}p{gh$KN&JZYLUjv4h{NY zBJ>X9z!xfDGY z+oh_Z&_e#Q(-}>ssZfm=j$D&4W4FNy&-kAO1~#3Im;F)Nwe{(*75(p=P^VI?X0GFakfh+X-px4a%Uw@fSbmp9hM1_~R>?Z8+ ziy|e9>8V*`OP}4x5JjdWp}7eX;lVxp5qS}0YZek;SNmm7tEeSF*-dI)6U-A%m6YvCgM(}_=k#a6o^%-K4{`B1+}O4x zztDT%hVb;v#?j`lTvlFQ3aV#zkX=7;YFLS$uIzb0E3lozs5`Xy zi~vF+%{z9uLjKvKPhP%x5f~7-Gj+%5N`%^=yk*Qn{`> z;xj&ROY6g`iy2a@{O)V(jk&8#hHACVDXey5a+KDod_Z&}kHM}xt7}Md@pil{2x7E~ zL$k^d2@Ec2XskjrN+IILw;#7((abu;OJii&v3?60x>d_Ma(onIPtcVnX@ELF0aL?T zSmWiL3(dOFkt!x=1O!_0n(cAzZW+3nHJ{2S>tgSK?~cFha^y(l@-Mr2W$%MN{#af8J;V*>hdq!gx=d0h$T7l}>91Wh07)9CTX zh2_ZdQCyFOQ)l(}gft0UZG`Sh2`x-w`5vC2UD}lZs*5 zG76$akzn}Xi))L3oGJ75#pcN=cX3!=57$Ha=hQ2^lwdyU#a}4JJOz6ddR%zae%#4& za)bFj)z=YQela(F#Y|Q#dp}PJghITwXouVaMq$BM?K%cXn9^Y@g43$=O)F&ZlOUom zJiad#dea;-eywBA@e&D6Pdso1?2^(pXiN91?jvcaUyYoKUmvl5G9e$W!okWe*@a<^ z8cQQ6cNSf+UPDx%?_G4aIiybZHHagF{;IcD(dPO!#=u zWfqLcPc^+7Uu#l(Bpxft{*4lv#*u7X9AOzDO z1D9?^jIo}?%iz(_dwLa{ex#T}76ZfN_Z-hwpus9y+4xaUu9cX}&P{XrZVWE{1^0yw zO;YhLEW!pJcbCt3L8~a7>jsaN{V3>tz6_7`&pi%GxZ=V3?3K^U+*ryLSb)8^IblJ0 zSRLNDvIxt)S}g30?s_3NX>F?NKIGrG_zB9@Z>uSW3k2es_H2kU;Rnn%j5qP)!XHKE zPB2mHP~tLCg4K_vH$xv`HbRsJwbZMUV(t=ez;Ec(vyHH)FbfLg`c61I$W_uBB>i^r z&{_P;369-&>23R%qNIULe=1~T$(DA`ev*EWZ6j(B$(te}x1WvmIll21zvygkS%vwG zzkR6Z#RKA2!z!C%M!O>!=Gr0(J0FP=-MN=5t-Ir)of50y10W}j`GtRCsXBakrKtG& zazmITDJMA0C51&BnLY)SY9r)NVTMs);1<=oosS9g31l{4ztjD3#+2H7u_|66b|_*O z;Qk6nalpqdHOjx|K&vUS_6ITgGll;TdaN*ta=M_YtyC)I9Tmr~VaPrH2qb6sd~=AcIxV+%z{E&0@y=DPArw zdV7z(G1hBx7hd{>(cr43^WF%4Y@PXZ?wPpj{OQ#tvc$pABJbvPGvdR`cAtHn)cSEV zrpu}1tJwQ3y!mSmH*uz*x0o|CS<^w%&KJzsj~DU0cLQUxk5B!hWE>aBkjJle8z~;s z-!A=($+}Jq_BTK5^B!`R>!MulZN)F=iXXeUd0w5lUsE5VP*H*oCy(;?S$p*TVvTxwAeWFB$jHyb0593)$zqalVlDX=GcCN1gU0 zlgU)I$LcXZ8Oyc2TZYTPu@-;7<4YYB-``Qa;IDcvydIA$%kHhJKV^m*-zxcvU4viy&Kr5GVM{IT>WRywKQ9;>SEiQD*NqplK-KK4YR`p0@JW)n_{TU3bt0 zim%;(m1=#v2}zTps=?fU5w^(*y)xT%1vtQH&}50ZF!9YxW=&7*W($2kgKyz1mUgfs zfV<*XVVIFnohW=|j+@Kfo!#liQR^x>2yQdrG;2o8WZR+XzU_nG=Ed2rK?ntA;K5B{ z>M8+*A4!Jm^Bg}aW?R?6;@QG@uQ8&oJ{hFixcfEnJ4QH?A4>P=q29oDGW;L;= z9-a0;g%c`C+Ai!UmK$NC*4#;Jp<1=TioL=t^YM)<<%u#hnnfSS`nq63QKGO1L8RzX z@MFDqs1z ztYmxDl@LU)5acvHk)~Z`RW7=aJ_nGD!mOSYD>5Odjn@TK#LY{jf?+piB5AM-CAoT_ z?S-*q7}wyLJzK>N%eMPuFgN)Q_otKP;aqy=D5f!7<=n(lNkYRXVpkB{TAYLYg{|(jtRqYmg$xH zjmq?B(RE4 zQx^~Pt}gxC2~l=K$$-sYy_r$CO(d=+b3H1MB*y_5g6WLaWTXn+TKQ|hNY^>Mp6k*$ zwkovomhu776vQATqT4blf~g;TY(MWCrf^^yfWJvSAB$p5l;jm@o#=!lqw+Lqfq>X= z$6~kxfm7`3q4zUEB;u4qa#BdJxO!;xGm)wwuisj{0y2x{R(IGMrsIzDY9LW>m!Y`= z04sx3IjnYvL<4JqxQ8f7qYd0s2Ig%`ytYPEMKI)s(LD}D@EY>x`VFtqvnADNBdeao zC96X+MxnwKmjpg{U&gP3HE}1=s!lv&D{6(g_lzyF3A`7Jn*&d_kL<;dAFx!UZ>hB8 z5A*%LsAn;VLp>3${0>M?PSQ)9s3}|h2e?TG4_F{}{Cs>#3Q*t$(CUc}M)I}8cPF6% z=+h(Kh^8)}gj(0}#e7O^FQ6`~fd1#8#!}LMuo3A0bN`o}PYsm!Y}sdOz$+Tegc=qT z8x`PH$7lvnhJp{kHWb22l;@7B7|4yL4UOOVM0MP_>P%S1Lnid)+k9{+3D+JFa#Pyf zhVc#&df87APl4W9X)F3pGS>@etfl=_E5tBcVoOfrD4hmVeTY-cj((pkn%n@EgN{0f zwb_^Rk0I#iZuHK!l*lN`ceJn(sI{$Fq6nN& zE<-=0_2WN}m+*ivmIOxB@#~Q-cZ>l136w{#TIJe478`KE7@=a{>SzPHsKLzYAyBQO zAtuuF$-JSDy_S@6GW0MOE~R)b;+0f%_NMrW(+V#c_d&U8Z9+ec4=HmOHw?gdjF(Lu zzra83M_BoO-1b3;9`%&DHfuUY)6YDV21P$C!Rc?mv&{lx#f8oc6?0?x zK08{WP65?#>(vPfA-c=MCY|%*1_<3D4NX zeVTi-JGl2uP_2@0F{G({pxQOXt_d{g_CV6b?jNpfUG9;8yle-^4KHRvZs-_2siata zt+d_T@U$&t*xaD22(fH(W1r$Mo?3dc%Tncm=C6{V9y{v&VT#^1L04vDrLM9qBoZ4@ z6DBN#m57hX7$C(=#$Y5$bJmwA$T8jKD8+6A!-IJwA{WOfs%s}yxUw^?MRZjF$n_KN z6`_bGXcmE#5e4Ym)aQJ)xg3Pg0@k`iGuHe?f(5LtuzSq=nS^5z>vqU0EuZ&75V%Z{ zYyhRLN^)$c6Ds{f7*FBpE;n5iglx5PkHfWrj3`x^j^t z7ntuV`g!9Xg#^3!x)l*}IW=(Tz3>Y5l4uGaB&lz{GDjm2D5S$CExLT`I1#n^lBH7Y zDgpMag@`iETKAI=p<5E#LTkwzVR@=yY|uBVI1HG|8h+d;G-qfuj}-ZR6fN>EfCCW z9~wRQoAPEa#aO?3h?x{YvV*d+NtPkf&4V0k4|L=uj!U{L+oLa(z#&iuhJr3-PjO3R z5s?=nn_5^*^Rawr>>Nr@K(jwkB#JK-=+HqwfdO<+P5byeim)wvqGlP-P|~Nse8=XF zz`?RYB|D6SwS}C+YQv+;}k6$-%D(@+t14BL@vM z2q%q?f6D-A5s$_WY3{^G0F131bbh|g!}#BKw=HQ7mx;Dzg4Z*bTLQSfo{ed{4}NZW zfrRm^Ca$rlE{Ue~uYv>R9{3smwATcdM_6+yWIO z*ZRH~uXE@#p$XTbCt5j7j2=86e{9>HIB6xDzV+vAo&B?KUiMP|ttOElepnl%|DPqL b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 diff --git a/hugegraph-hubble/hubble-fe/public/manifest.json b/hugegraph-hubble/hubble-fe/public/manifest.json index 1f2f141fa..080d6c77a 100644 --- a/hugegraph-hubble/hubble-fe/public/manifest.json +++ b/hugegraph-hubble/hubble-fe/public/manifest.json @@ -6,6 +6,16 @@ "src": "favicon.ico", "sizes": "64x64 32x32 24x24 16x16", "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" } ], "start_url": ".", diff --git a/hugegraph-hubble/hubble-fe/public/robots.txt b/hugegraph-hubble/hubble-fe/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/hugegraph-hubble/hubble-fe/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/hugegraph-hubble/hubble-fe/scripts/check-i18n.js b/hugegraph-hubble/hubble-fe/scripts/check-i18n.js new file mode 100644 index 000000000..4464caf0f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/scripts/check-i18n.js @@ -0,0 +1,559 @@ +#!/usr/bin/env node + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const fs = require('fs'); +const path = require('path'); + +const projectRoot = path.resolve(__dirname, '..'); +const resourcesRoot = path.join(projectRoot, 'src', 'i18n', 'resources'); +const sourceRoot = path.join(projectRoot, 'src'); +const locales = ['zh-CN', 'en-US']; +const ignoredSourceDirs = new Set(['i18n', 'node_modules']); +const problems = []; +const sharedConstants = loadSharedConstants(); + +if (process.argv.includes('--self-test')) { + runSelfTests(); + process.exit(0); +} + +const localeData = Object.fromEntries( + locales.map((locale) => [locale, loadLocale(locale)]) +); + +checkSymmetricKeys(); +checkLocaleValues(); +checkStaticTranslationUsage(); + +if (problems.length > 0) { + console.error(`i18n check failed with ${problems.length} issue(s):`); + for (const problem of problems) { + console.error(`- ${problem}`); + } + process.exit(1); +} + +console.log(JSON.stringify({ + status: 'passed', + locales: Object.fromEntries( + locales.map((locale) => [locale, Object.keys(localeData[locale].flat).length]) + ), + checkedStaticKeys: collectStaticTranslationKeys().length +}, null, 2)); + +function loadLocale(locale) { + const root = path.join(resourcesRoot, locale); + const files = listFiles(root, (file) => file.endsWith('.json')); + const byFile = new Map(); + const merged = {}; + + for (const file of files) { + const relativePath = path.relative(root, file); + const json = JSON.parse(fs.readFileSync(file, 'utf8')); + byFile.set(relativePath, flatten(json)); + } + + for (const moduleFile of getMergedModuleFiles(locale)) { + const file = path.join(root, moduleFile); + if (fs.existsSync(file)) { + deepMerge(merged, JSON.parse(fs.readFileSync(file, 'utf8'))); + } + } + + return { + byFile, + flat: flatten(Object.fromEntries( + Array.from(byFile.entries()).map(([file, flat]) => [file, flat]) + )), + merged, + mergedFlat: flatten(merged) + }; +} + +function getMergedModuleFiles(locale) { + const indexPath = path.join(resourcesRoot, locale, 'index.js'); + const indexText = fs.readFileSync(indexPath, 'utf8'); + const imports = new Map(); + + for (const barrelImport of getNamedImports(indexText)) { + const barrel = path.join(resourcesRoot, locale, barrelImport.source, 'index.js'); + if (!fs.existsSync(barrel)) { + continue; + } + const barrelText = fs.readFileSync(barrel, 'utf8'); + const barrelImports = getDefaultJsonImports(barrelText, barrelImport.source); + for (const name of barrelImport.names) { + if (barrelImports.has(name)) { + imports.set(name, barrelImports.get(name)); + } + } + } + + for (const [name, file] of getDefaultJsonImports(indexText)) { + imports.set(name, file); + } + + return getMergeArguments(indexText) + .map((name) => imports.get(name)) + .filter(Boolean); +} + +function getDefaultJsonImports(text, parentDir = '') { + const imports = new Map(); + const importPattern = /import\s+(\w+)\s+from\s+(['"])\.\/([^'"]+\.json)\2/g; + let match; + + while ((match = importPattern.exec(text)) !== null) { + imports.set(match[1], path.join(parentDir, match[3])); + } + return imports; +} + +function getNamedImports(text) { + const imports = []; + const importPattern = /import\s+\{([^}]*)\}\s+from\s+(['"])\.\/([^'"]+)\2;?/g; + let match; + + while ((match = importPattern.exec(text)) !== null) { + imports.push({ + names: match[1].split(',').map((name) => name.trim()).filter(Boolean), + source: match[3] + }); + } + return imports; +} + +function getMergeArguments(indexText) { + const start = indexText.indexOf('merge('); + if (start === -1) { + return []; + } + let depth = 0; + let end = start; + for (; end < indexText.length; end++) { + if (indexText[end] === '(') { + depth++; + } else if (indexText[end] === ')') { + depth--; + if (depth === 0) { + break; + } + } + } + return indexText + .slice(start + 'merge('.length, end) + .split(',') + .map((name) => name.trim()) + .filter(Boolean); +} + +function checkSymmetricKeys() { + const zhFiles = localeData['zh-CN'].byFile; + const enFiles = localeData['en-US'].byFile; + const allFiles = new Set([...zhFiles.keys(), ...enFiles.keys()]); + + for (const file of allFiles) { + if (!zhFiles.has(file)) { + problems.push(`zh-CN missing resource file ${file}`); + continue; + } + if (!enFiles.has(file)) { + problems.push(`en-US missing resource file ${file}`); + continue; + } + const zhKeys = new Set(Object.keys(zhFiles.get(file))); + const enKeys = new Set(Object.keys(enFiles.get(file))); + for (const key of zhKeys) { + if (!enKeys.has(key)) { + problems.push(`en-US missing key ${file}:${key}`); + } + } + for (const key of enKeys) { + if (!zhKeys.has(key)) { + problems.push(`zh-CN missing key ${file}:${key}`); + } + } + } +} + +function checkLocaleValues() { + for (const locale of locales) { + for (const [file, entries] of localeData[locale].byFile.entries()) { + for (const [key, value] of Object.entries(entries)) { + if (typeof value !== 'string') { + continue; + } + if (value.trim() === '') { + problems.push(`${locale} empty value ${file}:${key}`); + } + if ( + locale === 'en-US' && + /[\u4e00-\u9fff]/.test(value) + ) { + problems.push(`${locale} Chinese text ${file}:${key}=${value}`); + } + if (locale === 'en-US' && /[,。!?;:()【】《》]/.test(value)) { + problems.push(`${locale} full-width punctuation ${file}:${key}=${value}`); + } + if (/\b(TODO|TBD|xxx)\b/i.test(key) || /\b(TODO|TBD|xxx)\b/i.test(value)) { + problems.push(`${locale} placeholder ${file}:${key}=${value}`); + } + if (looksLikeRawKey(value) && value === key) { + problems.push(`${locale} raw key value ${file}:${key}`); + } + } + } + } +} + +function checkStaticTranslationUsage() { + const staticKeys = collectStaticTranslationKeys(); + const zhMerged = localeData['zh-CN'].mergedFlat; + const enMerged = localeData['en-US'].mergedFlat; + + for (const key of staticKeys) { + if (!Object.prototype.hasOwnProperty.call(zhMerged, key)) { + problems.push(`zh-CN missing merged static t() key ${key}`); + } + if (!Object.prototype.hasOwnProperty.call(enMerged, key)) { + problems.push(`en-US missing merged static t() key ${key}`); + } + } +} + +function collectStaticTranslationKeys() { + const keys = new Set(); + for (const file of listFiles(sourceRoot, isJavaScriptLikeFile)) { + if (shouldIgnoreSource(file)) { + continue; + } + const content = fs.readFileSync(file, 'utf8'); + for (const key of extractStaticTranslationKeys(content, sharedConstants)) { + keys.add(key); + } + } + return Array.from(keys).sort(); +} + +function extractStaticTranslationKeys(content, baseConstants = new Map()) { + const keys = []; + const constants = collectStringConstants(content, baseConstants); + const source = stripComments(content); + const translationPattern = /\bt\(\s*([^)]+)\)/g; + let match; + + while ((match = translationPattern.exec(source)) !== null) { + const key = resolveStringExpression(match[1].trim(), constants); + if (key) { + keys.push(key); + } + } + return keys; +} + +function loadSharedConstants() { + const constants = new Map(); + const constantsPath = path.join(sourceRoot, 'utils', 'constants.js'); + if (!fs.existsSync(constantsPath)) { + return constants; + } + + const content = fs.readFileSync(constantsPath, 'utf8'); + const textPathMatch = content.match(/export\s+const\s+TEXT_PATH\s*=\s*\{([\s\S]*?)\};/); + if (!textPathMatch) { + return constants; + } + + const entryPattern = /(\w+)\s*:\s*(['"])((?:\\[\s\S]|(?!\2)[\s\S])*?)\2/g; + let match; + while ((match = entryPattern.exec(textPathMatch[1])) !== null) { + constants.set(`TEXT_PATH.${match[1]}`, unescapeQuotedString(match[3])); + } + return constants; +} + +function collectStringConstants(content, baseConstants) { + const constants = new Map(baseConstants); + const source = stripComments(content); + const declarationPattern = /\bconst\s+(\w+)\s*=\s*([^;]+);/g; + const declarations = []; + let match; + + while ((match = declarationPattern.exec(source)) !== null) { + declarations.push([match[1], match[2].trim()]); + } + + let changed = true; + while (changed) { + changed = false; + for (const [name, expression] of declarations) { + if (constants.has(name)) { + continue; + } + const value = resolveStringExpression(expression, constants); + if (value) { + constants.set(name, value); + changed = true; + } + } + } + return constants; +} + +function resolveStringExpression(expression, constants) { + const value = expression.trim(); + if (!value) { + return null; + } + + const literal = parseQuotedLiteral(value); + if (literal !== null) { + return literal; + } + + if (constants.has(value)) { + return constants.get(value); + } + + const template = resolveTemplateLiteral(value, constants); + if (template !== null) { + return template; + } + + const parts = splitTopLevelConcat(value); + if (parts.length > 1) { + const resolved = parts.map((part) => resolveStringExpression(part, constants)); + if (resolved.every((part) => part !== null)) { + return resolved.join(''); + } + } + + return null; +} + +function resolveTemplateLiteral(expression, constants) { + if (!expression.startsWith('`') || !expression.endsWith('`')) { + return null; + } + const body = expression.slice(1, -1); + let unresolved = false; + const resolved = body.replace(/\$\{([^}]+)\}/g, (fullMatch, name) => { + const value = resolveStringExpression(name, constants); + if (value === null) { + unresolved = true; + return fullMatch; + } + return value; + }); + return unresolved ? null : unescapeQuotedString(resolved); +} + +function splitTopLevelConcat(expression) { + const parts = []; + let quote = null; + let depth = 0; + let start = 0; + for (let index = 0; index < expression.length; index++) { + const char = expression[index]; + const prev = expression[index - 1]; + if (quote) { + if (char === quote && prev !== '\\') { + quote = null; + } + continue; + } + if (char === '\'' || char === '"' || char === '`') { + quote = char; + continue; + } + if (char === '(') { + depth++; + } else if (char === ')') { + depth--; + } else if (char === '+' && depth === 0) { + parts.push(expression.slice(start, index).trim()); + start = index + 1; + } + } + parts.push(expression.slice(start).trim()); + return parts; +} + +function parseQuotedLiteral(expression) { + if (expression.length < 2) { + return null; + } + const quote = expression[0]; + if ((quote !== '\'' && quote !== '"') || expression[expression.length - 1] !== quote) { + return null; + } + return unescapeQuotedString(expression.slice(1, -1)); +} + +function unescapeQuotedString(value) { + return value.replace(/\\(['"`\\])/g, '$1'); +} + +function stripComments(content) { + let output = ''; + let quote = null; + let lineComment = false; + let blockComment = false; + + for (let index = 0; index < content.length; index++) { + const char = content[index]; + const next = content[index + 1]; + const prev = content[index - 1]; + + if (lineComment) { + if (char === '\n') { + lineComment = false; + output += char; + } else { + output += ' '; + } + continue; + } + + if (blockComment) { + if (char === '*' && next === '/') { + blockComment = false; + output += ' '; + index++; + } else { + output += char === '\n' ? '\n' : ' '; + } + continue; + } + + if (quote) { + output += char; + if (char === quote && prev !== '\\') { + quote = null; + } + continue; + } + + if (char === '\'' || char === '"' || char === '`') { + quote = char; + output += char; + } else if (char === '/' && next === '/') { + lineComment = true; + output += ' '; + index++; + } else if (char === '/' && next === '*') { + blockComment = true; + output += ' '; + index++; + } else { + output += char; + } + } + return output; +} + +function shouldIgnoreSource(file) { + const relative = path.relative(sourceRoot, file); + return relative.split(path.sep).some((segment) => ignoredSourceDirs.has(segment)); +} + +function isJavaScriptLikeFile(file) { + return /\.(js|jsx|ts|tsx)$/.test(file); +} + +function looksLikeRawKey(value) { + return /^[A-Za-z][A-Za-z0-9_-]*(\.[A-Za-z0-9_-]+)+$/.test(value); +} + +function listFiles(root, predicate) { + const out = []; + for (const entry of fs.readdirSync(root, {withFileTypes: true})) { + const file = path.join(root, entry.name); + if (entry.isDirectory()) { + out.push(...listFiles(file, predicate)); + } else if (predicate(file)) { + out.push(file); + } + } + return out; +} + +function flatten(obj, prefix = '', out = {}) { + for (const [key, value] of Object.entries(obj)) { + const nextKey = prefix ? `${prefix}.${key}` : key; + if (value && typeof value === 'object' && !Array.isArray(value)) { + flatten(value, nextKey, out); + } else { + out[nextKey] = value; + } + } + return out; +} + +function deepMerge(target, source) { + for (const [key, value] of Object.entries(source)) { + if (value && typeof value === 'object' && !Array.isArray(value)) { + if (!target[key] || typeof target[key] !== 'object' || Array.isArray(target[key])) { + target[key] = {}; + } + deepMerge(target[key], value); + } else { + target[key] = value; + } + } + return target; +} + +function runSelfTests() { + const defaultImports = getDefaultJsonImports( + 'import common from "./common.json";\nimport home from \'./modules/home.json\';' + ); + assert(defaultImports.get('common') === 'common.json', 'double-quoted JSON import'); + assert(defaultImports.get('home') === path.join('modules', 'home.json'), 'single import'); + + const namedImports = getNamedImports('import {\n common,\n modules\n} from "./modules";'); + assert(namedImports.length === 1, 'multi-line named import'); + assert(namedImports[0].names.join(',') === 'common,modules', 'named import names'); + assert(namedImports[0].source === 'modules', 'double-quoted named import source'); + + const staticKeys = extractStaticTranslationKeys( + 't("addition.save"); // t("missing.comment")\n' + + 't(\'common.cancel\'); t(`dynamic.${id}`); t("quote.\\"key");\n' + + 'const BASE = "analysis.algorithm.olap.item"; t(`${BASE}.PAGE_RANK`);\n' + + 'const OWNED_TEXT_PATH = TEXT_PATH.OLAP + ".page_rank"; t(OWNED_TEXT_PATH + ".desc");', + new Map([ + ['TEXT_PATH.OLAP', 'analysis.algorithm.olap'] + ]) + ); + assert(staticKeys.includes('addition.save'), 'double-quoted static t()'); + assert(staticKeys.includes('common.cancel'), 'single-quoted static t()'); + assert(staticKeys.includes('quote."key'), 'escaped quote in static t()'); + assert(staticKeys.includes('analysis.algorithm.olap.item.PAGE_RANK'), 'template constant t()'); + assert(staticKeys.includes('analysis.algorithm.olap.page_rank.desc'), 'concatenated t()'); + assert(!staticKeys.includes('missing.comment'), 'commented t() ignored'); + assert(!staticKeys.some((key) => key.includes('${')), 'dynamic template key ignored'); + + console.log(JSON.stringify({status: 'passed', selfTests: 13}, null, 2)); +} + +function assert(condition, message) { + if (!condition) { + throw new Error(`self-test failed: ${message}`); + } +} diff --git a/hugegraph-hubble/hubble-fe/scripts/react-app-rewired.js b/hugegraph-hubble/hubble-fe/scripts/react-app-rewired.js new file mode 100644 index 000000000..a71caf9da --- /dev/null +++ b/hugegraph-hubble/hubble-fe/scripts/react-app-rewired.js @@ -0,0 +1,63 @@ +#!/usr/bin/env node + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +const { spawnSync } = require('child_process'); + +const script = process.argv[2]; +const extraArgs = process.argv.slice(3); +const nodeMajorVersion = Number(process.versions.node.split('.')[0]); +const env = { ...process.env }; + +if ( + nodeMajorVersion >= 17 && + !hasNodeOption(env.NODE_OPTIONS, '--openssl-legacy-provider') +) { + env.NODE_OPTIONS = appendNodeOption( + env.NODE_OPTIONS, + '--openssl-legacy-provider' + ); +} + +if (script === 'build' && typeof env.CI === 'undefined') { + env.CI = 'false'; +} + +const result = spawnSync( + process.execPath, + [require.resolve('react-app-rewired/bin/index.js'), script, ...extraArgs], + { + env, + stdio: 'inherit' + } +); + +if (result.error) { + throw result.error; +} + +process.exit(result.status === null ? 1 : result.status); + +function appendNodeOption(existingOptions, nextOption) { + return existingOptions ? `${existingOptions} ${nextOption}` : nextOption; +} + +function hasNodeOption(existingOptions, targetOption) { + return typeof existingOptions === 'string' && + existingOptions.split(/\s+/).includes(targetOption); +} diff --git a/hugegraph-hubble/hubble-fe/src/App.css b/hugegraph-hubble/hubble-fe/src/App.css new file mode 100644 index 000000000..4d3da7a78 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/App.css @@ -0,0 +1,92 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.form_attr_add { + border: 1px dashed #40a9ff; + text-align: center; + padding: 4px; + cursor: pointer; +} + +.form_attr_select { + display: inline-block; + width: calc(25% - 12px); + width: 120px; +} + +.form_attr_val { + display: inline-block; + width: 120px; +} + +.form_attr_split { + display: inline-block; + width: 24px; + line-height: 32px; + text-align: center; +} + +.form_attr_border { + border: 1px dashed #2f54eb; + padding: 20px; + margin-bottom: 10px; +} + +.form_attr_button, +.form_attr_table { + margin-bottom: 10px; +} + +.ant-layout-sider-trigger { + border-top: 1px solid rgba(0, 0, 0, .06); +} + +/* .ant-modal-content { + width: 600px; +} */ + +.ant-modal-body { + max-height: 488px; + overflow: auto; +} + +.ant-menu-sub.ant-menu-inline { + background-color: #fff; +} + +.ant-page-header { + padding: 24px 10px 24px; +} + +.ant-page-header-content { + padding-top: 24px; +} + +/* csslint ignore:start */ +.ant-table-thead > tr > th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan])::before { + width: 0; +} +/* csslint ignore:end */ + +.ant-table-tbody > tr > td { + border-bottom: 0; +} + +.ant-table-tbody .ant-empty-normal { + margin: 200px 0; +} diff --git a/hugegraph-hubble/hubble-fe/src/App.js b/hugegraph-hubble/hubble-fe/src/App.js new file mode 100644 index 000000000..a879fbdf2 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/App.js @@ -0,0 +1,34 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import Route from './routes'; +import 'antd/dist/antd.css'; +import './App.scss'; +import './App.css'; +import Layout from './layout.ant'; + +function App() { + + return ( +
+ } /> +
+ ); +}; + +export default App; diff --git a/hugegraph-hubble/hubble-fe/src/App.scss b/hugegraph-hubble/hubble-fe/src/App.scss new file mode 100644 index 000000000..e68fdb445 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/App.scss @@ -0,0 +1,44 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +iframe { + border: medium none; +} + +.main { + min-height: calc(100vh - 60px); + + .content { + display: flex; + flex-direction: column; + padding: 10px; + + .container { + background: #fff; + padding-left: 25px; + margin-top: 10px; + + padding: 10px; + flex: 1 auto; + } + } + + .center { + text-align: center; + } +} diff --git a/hugegraph-hubble/hubble-fe/src/App.test.js b/hugegraph-hubble/hubble-fe/src/App.test.js new file mode 100644 index 000000000..1d891b494 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/App.test.js @@ -0,0 +1,26 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {render, screen} from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/hugegraph-hubble/hubble-fe/src/api/analysis.js b/hugegraph-hubble/hubble-fe/src/api/analysis.js new file mode 100644 index 000000000..6b54cc97e --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/api/analysis.js @@ -0,0 +1,203 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import request from './request'; +import qs from 'qs'; + +// 图分析通用 +const getGraphSpaceList = () => { + return request.get('/graphspaces/list'); +}; + +const getGraphList = graphSpace => { + return request.get(`/graphspaces/${graphSpace}/graphs/list`); +}; + +const getOlapMode = (graphSpace, graph) => { + return request.get(`/graphspaces/${graphSpace}/graphs/${graph}/graph_read_mode`); +}; + +const switchOlapMode = (graphSpace, graph, params) => { + return request.put(`/graphspaces/${graphSpace}/graphs/${graph}/graph_read_mode`, params); +}; + +const getUploadList = (graphspace, graph) => { + return `/api/v1.3//graphspaces/${graphspace}/graphs/${graph}/import`; +}; + +const getMetaEdgeList = (graphspace, graph) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/edgelabels`); +}; + +const getMetaVertexList = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels`); +}; + +const updateVertexProperties = (graphspace, graph, params) => { + return request.put(`/graphspaces/${graphspace}/graphs/${graph}/vertex/${params.id}`, params); +}; + +const updateEdgeProperties = (graphspace, graph, params) => { + return request.put(`/graphspaces/${graphspace}/graphs/${graph}/edge/${params.id}`, params); +}; + +const getVertexProperties = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/vertexlabel/${params}`); +}; + +const getEdgeProperties = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/edgelabel/${params}`); +}; + +const getExecutionLogs = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/execute-histories`, {params}); +}; + +const getExecutionQuery = (graphspace, graph, params) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/gremlin-query`, params); +}; + +const getGraphData = (graphspace, graph) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/gremlin-query`); +}; + +const putExecutionQuery = (graphspace, graph, params) => { + return request.put(`/graphspaces/${graphspace}/graphs/${graph}/gremlin-query`, params); +}; + +const getCypherExecutionQuery = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/cypher`, {params}); +}; + +const getExecutionTask = (graphspace, graph, params) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/gremlin-query/async-task`, params); +}; + +const getCypherTask = (graphspace, graph, params) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/cypher/async-task`, params); +}; + +const fetchManageTaskList = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/async-tasks?`, {params}); +}; + +const addFavoriate = (graphspace, graph, params) => { + return request.post(`graphspaces/${graphspace}/graphs/${graph}/gremlin-collections`, params); +}; + +const deleteQueryCollection = (graphspace, graph, id) => { + return request.delete(`graphspaces/${graphspace}/graphs/${graph}/gremlin-collections/${id}`); +}; + +const editQueryCollection = (graphspace, graph, parmas) => { + return request.put(`graphspaces/${graphspace}/graphs/${graph}/gremlin-collections/${parmas.id}`, parmas); +}; + +const fetchFavoriteQueries = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/gremlin-collections?`, {params}); +}; + +const addGraphNode = (graphspace, graph, params) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/vertex`, params); +}; + +const fetchEdgeLabels = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/edgelabels/${params}`); +}; + +const fetchVertexlinks = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels/${params}/link`); +}; + +const addEdge = (graphspace, graph, params) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/edge`, params); +}; + + +// 图算法 +const postOlapInfo = (graphspace, graph, data) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/algorithms/olap`, data); +}; + +const runOltpInfo = (graphspace, graph, data) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/algorithms/oltp/` + data.algorithmName, data); +}; + +const runOlapVermeer = (graphspace, graph, params) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/algorithms/vermeer`, {params}); +}; + +// 任务管理 +const fetchAsyncTaskResult = (graphspace, graph, taskId) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/async-tasks/${taskId}`); +}; + +const deleteAsyncTask = (graphspace, graph, selectedTaskIds) => { + const params = qs.stringify(selectedTaskIds, {arrayFormat: 'repeat'}); + return request.delete(`/graphspaces/${graphspace}/graphs/${graph}/async-tasks?` + params); +}; + +const abortAsyncTask = (graphspace, graph, taskId) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/async-tasks/cancel/${taskId}`); +}; + +const getExecuteAsyncTaskList = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/execute-histories`, {params}); +}; + +const loadVermeerTask = params => { + return request.post('/vermeer/task', {...params}); +}; + +export { + getGraphSpaceList, + getGraphList, + getOlapMode, + switchOlapMode, + getExecutionLogs, + getExecutionQuery, + getGraphData, + putExecutionQuery, + getExecutionTask, + getCypherTask, + fetchManageTaskList, + addFavoriate, + postOlapInfo, + runOltpInfo, + runOlapVermeer, + fetchAsyncTaskResult, + addGraphNode, + deleteAsyncTask, + abortAsyncTask, + getMetaEdgeList, + getMetaVertexList, + deleteQueryCollection, + editQueryCollection, + fetchFavoriteQueries, + getUploadList, + updateVertexProperties, + updateEdgeProperties, + getCypherExecutionQuery, + getVertexProperties, + getEdgeProperties, + getExecuteAsyncTaskList, + fetchEdgeLabels, + fetchVertexlinks, + addEdge, + loadVermeerTask, +}; diff --git a/hugegraph-hubble/hubble-fe/src/api/auth.js b/hugegraph-hubble/hubble-fe/src/api/auth.js new file mode 100644 index 000000000..e39f72212 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/api/auth.js @@ -0,0 +1,217 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import request from './request'; +import qs from 'qs'; + +// login +const login = data => { + return request.post('/auth/login', data); +}; + +const logout = () => { + return request.get('/auth/logout'); +}; + +const status = () => { + return request.get('/auth/status'); +}; + +const getUserList = params => { + return request.get('/auth/users/list', {params}); +}; + +const getAllUserList = params => { + return request.get('/auth/users', {params}); +}; + +const getUserInfo = username => { + return request.get(`/auth/users/${username}`); +}; + +const updateUser = (id, data) => { + return request.put(`/auth/users/${id}`, data); +}; + +const delUser = id => { + return request.delete(`/auth/users/${id}`); +}; + +const updateAdminspace = (username, data) => { + return request.post(`/auth/users/updateadminspace/${username}`, data); +}; + +const addUser = data => { + return request.post('/auth/users', data); +}; + +const updatePwd = (username, oldpwd, newpwd) => { + return request.post('/auth/users/updatepwd', {username, oldpwd, newpwd}); +}; + +const importUserUrl = '/api/v1.3/auth/users/batch'; + +export {login, logout, status, getUserList, getAllUserList, getUserInfo, delUser, + updateUser, addUser, updatePwd, importUserUrl, updateAdminspace}; + +// resource + +const getResourceList = (graphspace, params) => { + return request.get(`/graphspaces/${graphspace}/auth/targets`, {params}); +}; + +const addResource = (graphspace, data) => { + return request.post(`/graphspaces/${graphspace}/auth/targets`, data); +}; + +const updateResource = (graphspace, id, data) => { + return request.put(`/graphspaces/${graphspace}/auth/targets/${id}`, data); +}; + +const getResource = (graphspace, id) => { + return request.get(`/graphspaces/${graphspace}/auth/targets/${id}`); +}; + +const delResource = (graphspace, id) => { + return request.delete(`/graphspaces/${graphspace}/auth/targets/${id}`); +}; + +export {getResourceList, addResource, updateResource, getResource, delResource}; + +// role + +const getRoleList = (graphspace, params) => { + return request.get(`/graphspaces/${graphspace}/auth/roles`, {params}); +}; + +const getAllRoleList = graphspace => { + return request.get(`/graphspaces/${graphspace}/auth/roles/list`); +}; + +const addRole = (graphspace, data) => { + return request.post(`/graphspaces/${graphspace}/auth/roles`, data); +}; + +const updateRole = (graphspace, id, data) => { + return request.put(`/graphspaces/${graphspace}/auth/roles/${id}`, data); +}; + +const delRole = (graphspace, id) => { + return request.delete(`/graphspaces/${graphspace}/auth/roles/${id}`); +}; + +const delRoleBatch = (graphspace, data) => { + return request.delete(`/graphspaces/${graphspace}/auth/roles/`, data); +}; + +const getRoleResourceList = (graphspace, params) => { + return request.get(`/graphspaces/${graphspace}/auth/accesses`, {params}); +}; + +const addRoleResource = (graphspace, data) => { + return request.post(`/graphspaces/${graphspace}/auth/accesses`, data); +}; + +const updateRoleResource = (graphspace, data) => { + return request.put(`/graphspaces/${graphspace}/auth/accesses`, data); +}; + +const delRoleResource = (graphspace, data) => { + return request.delete(`/graphspaces/${graphspace}/auth/accesses`, data); +}; + +const getRoleUser = (graphspace, params) => { + return request.get(`/graphspaces/${graphspace}/auth/belongs`, {params}); +}; + +const addRoleUser = (graphspace, data) => { + return request.post(`/graphspaces/${graphspace}/auth/belongs`, data); +}; + +const addRoleUserBatch = (graphspace, data) => { + return request.post(`/graphspaces/${graphspace}/auth/belongs/ids`, data); +}; + +const delRoleUser = (graphspace, id) => { + return request.delete(`/graphspaces/${graphspace}/auth/belongs/${id}`); +}; + +const delRoleUserBatch = (graphspace, data) => { + return request.post(`/graphspaces/${graphspace}/auth/belongs/delids`, data); +}; + +export { + getRoleList, getAllRoleList, addRole, updateRole, delRole, delRoleBatch, + getRoleResourceList, addRoleResource, updateRoleResource, delRoleResource, + getRoleUser, addRoleUser, addRoleUserBatch, delRoleUser, delRoleUserBatch, +}; + +const getPersonal = () => { + return request.get('/auth/users/getpersonal'); +}; + +const updatePersonal = params => { + return request.get('/auth/users/updatepersonal', {params}); +}; + +export {getPersonal, updatePersonal}; + +const getDashboard = () => { + return request.get('/dashboard'); +}; + +const getVermeer = () => { + return request.get('/vermeer'); +}; + +export {getDashboard, getVermeer}; + +// saas TODO REMOVED +const getUUapList = params => { + return request.get('/uic/list', {params}); +}; + +const getSuperUser = params => { + return request.get('/auth/users/super', {params}); +}; + +const addSuperUser = data => { + return request.post('/auth/users/super', + qs.stringify(data), + {headers: {'Content-Type': 'application/x-www-form-urlencoded'}} + ); +}; + +const addUuapUser = data => { + return request.post('/auth/users/uuap', + qs.stringify(data), + {headers: {'Content-Type': 'application/x-www-form-urlencoded'}} + ); + + // return request.post('/auth/users/uuap', data); +}; + +const removeSuperUser = username => { + return request.delete(`/auth/users/super/${username}`); +}; + +const getAccountsList = username => { + return request.get('/uic/accounts', {params: {username}}); +}; + +export {getUUapList, getSuperUser, addSuperUser, addUuapUser, removeSuperUser, getAccountsList}; diff --git a/hugegraph-hubble/hubble-fe/src/api/cloud.js b/hugegraph-hubble/hubble-fe/src/api/cloud.js new file mode 100644 index 000000000..b475f520c --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/api/cloud.js @@ -0,0 +1,54 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +// import request from './request'; +// TODO REMOVED +// const getAccountsList = username => { +// return request.get('/uic/accounts', {params: {username}}); +// }; +// +// const getOrderList = params => { +// return request.get('/order', {params}); +// }; +// +// const getOrder = id => { +// return request.get(`/order/${id}`); +// }; +// +// const updateOrder = (id, data) => { +// return request.put(`/order/${id}`, data); +// }; +// +// const updateOrderStatus = (id, status) => { +// return request.put(`/order/${id}/status`, {status}); +// }; +// +// const createOrder = data => { +// return request.post('/order', data); +// // return request.post1('/settle', qs.stringify(data), +// // {headers: {'Content-Type': 'application/x-www-form-urlencoded'}}); +// }; +// +// const getBillList = params => { +// return request.get('/bill', {params}); +// }; +// +// export { +// getAccountsList, createOrder, getOrderList, getOrder, updateOrder, updateOrderStatus, +// getBillList, +// }; diff --git a/hugegraph-hubble/hubble-fe/src/api/config.js b/hugegraph-hubble/hubble-fe/src/api/config.js new file mode 100644 index 000000000..f4130000c --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/api/config.js @@ -0,0 +1,25 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import request from './request'; + +const getConfig = () => { + return request.get('/config'); +}; + +export {getConfig}; diff --git a/hugegraph-hubble/hubble-fe/src/api/index.js b/hugegraph-hubble/hubble-fe/src/api/index.js new file mode 100644 index 000000000..61311a0fc --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/api/index.js @@ -0,0 +1,28 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import request from './request'; +import * as manage from './manage'; +import * as auth from './auth'; +import * as analysis from './analysis'; +import * as cloud from './cloud'; +import * as config from './config'; + +const uploadUrl = '/api/v1.3/ingest/files/upload'; + +export {request, manage, auth, analysis, cloud, config, uploadUrl}; diff --git a/hugegraph-hubble/hubble-fe/src/api/manage.js b/hugegraph-hubble/hubble-fe/src/api/manage.js new file mode 100644 index 000000000..35208898d --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/api/manage.js @@ -0,0 +1,368 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import request from './request'; +import qs from 'qs'; + +// 图空间 +const getGraphSpaceList = params => { + return request.get('/graphspaces', {params}); +}; + +const getGraphSpace = graphspace => { + return request.get(`/graphspaces/${graphspace}`); +}; + +const addGraphSpace = data => { + return request.post('/graphspaces', data); +}; + +const updateGraphSpace = (graphspace, data) => { + return request.put(`/graphspaces/${graphspace}`, data); +}; + +const delGraphSpace = graphspace => { + return request.delete(`/graphspaces/${graphspace}`); +}; + +const setDefaultGraphSpace = graphspace => { + return request.get(`/graphspaces/${graphspace}/setdefault`); +}; + +const getDefaultGraphSpace = () => { + return request.get('/graphspaces/getdefault'); +}; + +const initBuiltin = params => { + return request.post('/graphspaces/builtin', params); +}; + +export {getGraphSpace, getGraphSpaceList, addGraphSpace, updateGraphSpace, + delGraphSpace, setDefaultGraphSpace, getDefaultGraphSpace, initBuiltin}; + +// schema +const getSchemaList = (graphspace, params) => { + return request.get(`/graphspaces/${graphspace}/schematemplates`, {params}); +}; + +const addSchema = (graphspace, data) => { + return request.post(`/graphspaces/${graphspace}/schematemplates`, data); +}; + +const getSchema = (graphspace, name) => { + return request.get(`graphspaces/${graphspace}/schematemplates/${name}`); +}; + +const getGraphSchema = (graphspace, graph) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/groovy`); +}; + +const exportSchema = (graphspace, graph) => { + return request.get(`graphspaces/${graphspace}/graphs/${graph}/schema/groovy/export`); +}; + +const updateSchema = (graphspace, name, data) => { + return request.put(`graphspaces/${graphspace}/schematemplates/${name}`, data); +}; + +const delSchema = (graphspace, name) => { + return request.delete(`graphspaces/${graphspace}/schematemplates/${name}`); +}; + +export {getSchemaList, addSchema, updateSchema, getSchema, getGraphSchema, exportSchema, delSchema}; + +// 图 +const getGraphList = (graphspace, params) => { + return request.get(`/graphspaces/${graphspace}/graphs`, {params}); +}; + +const addGraph = (graphspace, data) => { + return request.post(`/graphspaces/${graphspace}/graphs`, + qs.stringify(data), + {headers: {'Content-Type': 'application/x-www-form-urlencoded'}} + ); +}; + +const updateGraph = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/update`, {params}); +}; + +const getGraph = (graphspace, graph) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/get`); +}; + +const delGraph = (graphspace, graph) => { + return request.delete(`/graphspaces/${graphspace}/graphs/${graph}`); +}; + +const getGraphView = (graphspace, graph) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/graphview`); +}; + +const setDefaultGraph = (graphspace, graph) => { + return request.get(`graphspaces/${graphspace}/graphs/${graph}/setdefault`); +}; + +const getDefaultGraph = graphspace => { + return request.get(`graphspaces/${graphspace}/graphs/getdefault`); +}; + +const clearGraphData = (graphspace, graph) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/truncate`, { + params: {clear_schema: false, clear_data: true}, + }); +}; + +const clearGraphDataAndSchema = (graphspace, graph) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/truncate`, {params: {clear_schema: true}}); +}; + +const getGraphStatistic = (graphspace, graph) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/statistics`); +}; + +const updateGraphStatistic = (graphspace, graph) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/statistics`); +}; + +// no-use +const getGraphStorage = (graphspace, graph) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/storage`); +}; + +const cloneGraph = (graphspace, graph, params) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/clone`, params); +}; + +export {getGraphList, getGraph, addGraph, updateGraph, delGraph, getDefaultGraph, + getGraphView, clearGraphData, setDefaultGraph, clearGraphDataAndSchema, + getGraphStatistic, updateGraphStatistic, getGraphStorage, cloneGraph}; + +// meta property +const getMetaPropertyList = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/propertykeys`, {params}); +}; + +const addMetaProperty = (graphspace, graph, data) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/schema/propertykeys`, data); +}; + +const checkMetaProperty = (graphspace, graph, data) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/schema/propertykeys/check_using`, data); +}; + +const updateMetaProperty = () => {}; + +const delMetaProperty = (graphspace, graph, data) => { + const {names} = data; + const str = names.map(name => 'names=' + encodeURIComponent(name)).join('&'); + const skip_using = String(names.length !== 1); + + // return request.delete(`/graphspaces/${graphspace}/graphs/${graph}/schema/propertykeys`, data); + return request.delete( + `/graphspaces/${graphspace}/graphs/${graph}/schema/propertykeys?${str}&skip_using=${skip_using}`); +}; + +export {getMetaPropertyList, addMetaProperty, updateMetaProperty, delMetaProperty, checkMetaProperty}; + +// meta vertex +const getMetaVertexList = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels`, {params}); +}; + +const getMetaVertex = (graphspace, graph, name) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels/${name}`); +}; + +const getMetaVertexLink = (graphspace, graph, name) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels/${name}/link`); +}; + +const getMetaVertexNew = (graphspace, graph, name) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels/${name}/new`); +}; + +const addMetaVertex = (graphspace, graph, data) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels`, data); +}; + +const addMetaVertexNew = (graphspace, graph, data) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels/create_new`, data); +}; + +const checkMetaVertex = (graphspace, graph, data) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels/check_using`, data); +}; + +const updateMetaVertex = (graphspace, graph, name, data) => { + return request.put(`/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels/${name}`, data); +}; + +const delMetaVertex = (graphspace, graph, data) => { + // return request.delete(`/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels`, data); + + const {names} = data; + const str = names.map(name => 'names=' + encodeURIComponent(name)).join('&'); + const skip_using = String(names.length !== 1); + + return request.delete( + `/graphspaces/${graphspace}/graphs/${graph}/schema/vertexlabels?${str}&skip_using=${skip_using}`); +}; + +export {getMetaVertexList, addMetaVertex, updateMetaVertex, delMetaVertex, checkMetaVertex, getMetaVertex, + getMetaVertexNew, addMetaVertexNew, getMetaVertexLink}; + +// meta edge +const getMetaEdgeList = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/edgelabels`, {params}); +}; + +const getMetaEdge = (graphspace, graph, name) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/edgelabels/${name}`); +}; + +const addMetaEdge = (graphspace, graph, data) => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/schema/edgelabels`, data); +}; + +const updateMetaEdge = (graphspace, graph, name, data) => { + return request.put(`/graphspaces/${graphspace}/graphs/${graph}/schema/edgelabels/${name}`, data); +}; + +const delMetaEdge = (graphspace, graph, data) => { + // return request.delete(`/graphspaces/${graphspace}/graphs/${graph}/schema/edgelabels`, data); + + const {names} = data; + const str = names.map(name => 'names=' + encodeURIComponent(name)).join('&'); + const skip_using = String(names.length !== 1); + + return request.delete( + `/graphspaces/${graphspace}/graphs/${graph}/schema/edgelabels?${str}&skip_using=${skip_using}`); +}; + +export {getMetaEdgeList, getMetaEdge, addMetaEdge, updateMetaEdge, delMetaEdge}; + +// meta vertex index +const getMetaVertexIndexList = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/propertyindexes?is_vertex_label=true`, + {params}); +}; + +// meta edge index +const getMetaEdgeIndexList = (graphspace, graph, params) => { + return request.get(`/graphspaces/${graphspace}/graphs/${graph}/schema/propertyindexes?is_vertex_label=false`, + {params}); +}; + +export {getMetaVertexIndexList, getMetaEdgeIndexList}; + +// datasource +const testhost = '/ingest'; +const getDatasourceList = params => { + // return request.get('/datasources/list', data); + return request.get(`${testhost}/datasources/list`, {params}); +}; + +const getDatasource = id => { + // return request.get(`/datasources/${id}`); + return request.get(`${testhost}/datasources/${id}`); +}; + +const addDatasource = data => { + // return request.post('/datasources', data); + return request.post(`${testhost}/datasources`, data); +}; + +// const updateDatasource = () => {}; + +const delDatasource = id => { + // return request.delete(`/datasources/${id}`); + return request.delete(`${testhost}/datasources/${id}`); +}; + +const delBatchDatasource = data => { + return request.post(`${testhost}/datasources/delete`, data); +}; + +const getDatasourceSchema = datasourceID => { + return request.get(`${testhost}/schemas`, {params: {datasource: datasourceID}}); +}; + +const checkJDBC = data => { + return request.post(`${testhost}/jdbc/check`, data); +}; + + +const datasourceUploadUrl = '/api/v1.3/ingest/files/upload'; + +export {getDatasource, getDatasourceList, addDatasource, delDatasource, + getDatasourceSchema, delBatchDatasource, checkJDBC, datasourceUploadUrl}; + +// task +const addTask = data => { + return request.post(`${testhost}/tasks`, data, { + headers: { + 'Content-Type': 'application/json;charset=UTF-8', + }, + }); +}; + +const getTaskList = params => { + return request.get(`${testhost}/tasks/list`, {params}); +}; + +const getTaskDetail = id => { + return request.get(`${testhost}/tasks/${id}`); +}; + +const deleteTask = id => { + return request.delete(`${testhost}/tasks/${id}`); +}; + +const disableTask = id => { + return request.put(`${testhost}/tasks/${id}/disable`); +}; + +const enableTask = id => { + return request.put(`${testhost}/tasks/${id}/enable`); +}; + +const updateTask = (id, data) => { + return request.put(`${testhost}/tasks/${id}`, data); +}; + +const getMetricsTask = () => { + return request.get(`${testhost}/metrics/task`); +}; + +export {addTask, getTaskList, getTaskDetail, deleteTask, disableTask, enableTask, updateTask, getMetricsTask}; + +// job +const getJobsList = params => { + return request.get(`${testhost}/jobs/list`, {params}); +}; + +const getJobsDetail = id => { + return request.get(`${testhost}/jobs/${id}`); +}; + +const deleteJobs = id => { + return request.delete(`${testhost}/jobs/${id}`); +}; + +export {getJobsList, getJobsDetail, deleteJobs}; diff --git a/hugegraph-hubble/hubble-fe/src/api/request.js b/hugegraph-hubble/hubble-fe/src/api/request.js new file mode 100644 index 000000000..2ee7d2389 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/api/request.js @@ -0,0 +1,108 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import axios from 'axios'; +import {message} from 'antd'; +import JSONbig from 'json-bigint'; +import _ from 'lodash'; + +const instance = axios.create({ + baseURL: '/api/v1.3', + withCredentials: true, + // 后端请求时延为30s,30s后后端统一处理返回400报错,这里设置31s为了尽可能不走timeout逻辑拿到超时报错。 + timeout: 31000, + transformResponse: [data => { + return JSONbig.parse(data); + }], +}); + +instance.interceptors.request.use( + config => { + if (!config.headers['Content-Type']) { + config.data = JSON.stringify(config.data); + config.headers = { + 'Content-Type': 'application/json;charset=UTF-8', + }; + } + return config; + }, + error => { + return Promise.reject(error); + } +); + +instance.interceptors.response.use( + response => { + if (response.data.status !== 200 && response.data.status !== 401) { + if (!_.isEmpty(response.data.message)) { + message.error(response.data.message); + } + } + else if (response.data.status === 401) { + // message.error('授权过期'); + localStorage.setItem('user', ''); + // storageFn.removeStorage(['lg','userInfo','tenant']) + // setTimeout(() => { + // window.location = '/check'; + // }, 700); + } + return response; + }, + error => { + const res = error.response?.data; + message.error(`请求出错:${res?.message ?? ''},path:${res?.path ?? ''}`); + return {data: {status: 500, message: res?.message ?? '请求失败'}}; + } +); + +const request = {}; + +request.get = async (url, params) => { + const resposne = await instance.get(`${url}`, params); + return resposne?.data; +}; + +request.post = async (url, params, config) => { + const resposne = await instance.post( + `${url}`, + params, + config + ); + + return resposne?.data; +}; + +request.put = async (url, params) => { + const resposne = await instance.put( + `${url}`, + params + ); + + return resposne?.data; +}; + +request.delete = async (url, params) => { + const resposne = await instance.delete( + `${url}`, + {params} + ); + + return resposne?.data; +}; + +export default request; diff --git a/hugegraph-hubble/hubble-fe/src/api/request2.js b/hugegraph-hubble/hubble-fe/src/api/request2.js new file mode 100644 index 000000000..0f3aafbe1 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/api/request2.js @@ -0,0 +1,127 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import axios from 'axios'; +import {message} from 'antd'; +import JSONbig from 'json-bigint'; +import _ from 'lodash'; +import qs from 'qs'; + +const instance = axios.create({ + baseURL: '/api/v1.3', + withCredentials: true, + // 后端请求时延为30s,30s后后端统一处理返回400报错,这里设置31s为了尽可能不走timeout逻辑拿到超时报错。 + timeout: 31000, + transformResponse: [data => { + return JSONbig.parse(data); + }], +}); + +instance.interceptors.request.use( + config => { + if (!config.headers['Content-Type']) { + // config.data = JSON.stringify(config.data); + config.headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + }; + } + return config; + }, + error => { + return Promise.reject(error); + } +); + +instance.interceptors.response.use( + response => { + if (response.data.status !== 200 && response.data.status !== 401) { + if (!_.isEmpty(response.data.message)) { + message.error(response.data.message); + } + } + else if (response.data.status === 401) { + // message.error('授权过期'); + localStorage.setItem('user', ''); + // storageFn.removeStorage(['lg','userInfo','tenant']) + setTimeout(() => { + window.location = '/check'; + }, 700); + } + return response; + }, + error => { + if (!error.response) { + setTimeout(() => { + window.location = '/check'; + }, 700); + + return; + } + const res = error.response?.data; + message.error(`请求出错:${res.message ?? ''},path:${res.path}`); + } +); + +const request = {}; + +request.get = async (url, params) => { + const resposne = await instance.get(`${url}`, params); + return resposne?.data; +}; + +request.post = async (url, params, config) => { + console.log(params, qs.stringify(params)); + const resposne = await instance.post( + `${url}`, + qs.stringify(params), + config + ); + + return resposne?.data; +}; + +request.post1 = async (url, params, config) => { + console.log(params, qs.stringify(params)); + const resposne = await instance.post( + `${url}`, + params, + config + ); + + return resposne?.data; +}; + +request.put = async (url, params) => { + const resposne = await instance.put( + `${url}`, + params + ); + + return resposne?.data; +}; + +request.delete = async (url, params) => { + const resposne = await instance.delete( + `${url}`, + {params} + ); + + return resposne?.data; +}; + +export default request; diff --git a/hugegraph-hubble/hubble-fe/src/assets/canvas_bg.png b/hugegraph-hubble/hubble-fe/src/assets/canvas_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..1fef89309bf6c8060be2955b902bff9f7e92bc42 GIT binary patch literal 980 zcmaJ=PiWIn7>}!rF*Yc;gARm8hN58euT8py#nCp2E0|fjf<5}0ytT1QUQAwXI(BiM z1}a`Wi-@q3M-TqNdGzi{5JbEy=v`mhwezqUczN%Ae81oK`~JMW+WNKm*~M9gVdkrA zMxE{p>6)3Q|A%|$=jnEim`$>QH%T8xh$*?ag+SGZZB$3l9o+edRv0F8!D}>0)4r}b z*ymvC!zF%5(G0V)nuO5lA_7{d?FBmfgA`m40RuF56&JKAsdQQze3x+PFtFt3fO}hpvI6^??l$;|LmO)YFM5Q3) zl`B9JM3onoc`=_8L`_gMxd;wFmPU)*O|5QNhq35QXFG(18qfFpeXgJ9aMb2SRizvf zFG)G-k&6cbfk`fim&ObRik-*{iH8G_GQt+_5uK$gf@r|%R~#tCotqiPDoQ4 zJKFaDU44Jz9g{jb(t9j%+!%z2ucH|EB8N6^b14lKYLy5~ zs$;Byot}>ZGRC?SY*9E7n@)ot(#Qsiyt~M?BJ6`<)|z*WmZDWwEmN&fKI3>TBdmL( z7R5YK3s1%HX>b4O_1HuQC_PRlmtH2bj{-XI5uNO{od-AQt1zoZsgZncz5Vt5MLv_c zuV$Z~{`PKeVd^4yHPuq~pUr&|exA+#*?s-EbujZ=%E+hAWS)H3zxRCl(c<#$uUR<@ Y4w%}`?4Y;%1*Y$;YOWhE%eQv_0{v?*=>Px# literal 0 HcmV?d00001 diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_arrow.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_arrow.svg new file mode 100644 index 000000000..e4cd7be86 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_arrow.svg @@ -0,0 +1,33 @@ + + + + + + 直线 + Created with Sketch. + + + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_arrow_selected.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_arrow_selected.svg new file mode 100644 index 000000000..a5bde14ca --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_arrow_selected.svg @@ -0,0 +1,31 @@ + + + + + + 直线 + Created with Sketch. + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_biaoge_normal.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_biaoge_normal.svg new file mode 100644 index 000000000..f41a8aa7b --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_biaoge_normal.svg @@ -0,0 +1,27 @@ + + + + + + ic_biaoge_normal + Created with Sketch. + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_biaoge_pressed.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_biaoge_pressed.svg new file mode 100644 index 000000000..f9f934c5b --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_biaoge_pressed.svg @@ -0,0 +1,27 @@ + + + + + + ic_biaoge_pressed + Created with Sketch. + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_done_144.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_done_144.svg new file mode 100644 index 000000000..f14797a5e --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_done_144.svg @@ -0,0 +1,73 @@ + + + + + + ic_done_144 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_fail.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_fail.svg new file mode 100644 index 000000000..e7ae9a553 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_fail.svg @@ -0,0 +1,70 @@ + + + + + + ic_fail@2x + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_json_normal.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_json_normal.svg new file mode 100644 index 000000000..c68d5312d --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_json_normal.svg @@ -0,0 +1,31 @@ + + + + + + ic_json_normal + Created with Sketch. + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_json_pressed.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_json_pressed.svg new file mode 100644 index 000000000..b546beb09 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_json_pressed.svg @@ -0,0 +1,31 @@ + + + + + + ic_json_pressed + Created with Sketch. + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_loading_back.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_loading_back.svg new file mode 100644 index 000000000..79e91accf --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_loading_back.svg @@ -0,0 +1,69 @@ + + + + + + ic_jiance_fail备份 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_loading_front.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_loading_front.svg new file mode 100644 index 000000000..8efb412d1 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_loading_front.svg @@ -0,0 +1,47 @@ + + + + + + ic_jiance_fail备份 2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_sousuo_empty.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_sousuo_empty.svg new file mode 100644 index 000000000..d05e34ec7 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_sousuo_empty.svg @@ -0,0 +1,78 @@ + + + + + + ic_sousuo_empty@1x + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_straight.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_straight.svg new file mode 100644 index 000000000..e43a329f7 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_straight.svg @@ -0,0 +1,31 @@ + + + + + + 直线 + Created with Sketch. + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_straight_selected.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_straight_selected.svg new file mode 100644 index 000000000..51f67f628 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_straight_selected.svg @@ -0,0 +1,31 @@ + + + + + + 直线 + Created with Sketch. + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_tuzhanshi_normal.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_tuzhanshi_normal.svg new file mode 100644 index 000000000..ec695d75d --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_tuzhanshi_normal.svg @@ -0,0 +1,32 @@ + + + + + + ic_tuzhanshi_normal + Created with Sketch. + + + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/ic_tuzhanshi_pressed.svg b/hugegraph-hubble/hubble-fe/src/assets/ic_tuzhanshi_pressed.svg new file mode 100644 index 000000000..d8500ba88 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/ic_tuzhanshi_pressed.svg @@ -0,0 +1,30 @@ + + + + + + ic_tuzhanshi_pressed + Created with Sketch. + + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/layout_circular.svg b/hugegraph-hubble/hubble-fe/src/assets/layout_circular.svg new file mode 100644 index 000000000..f5e4e304c --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/layout_circular.svg @@ -0,0 +1,19 @@ + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/layout_concentric.svg b/hugegraph-hubble/hubble-fe/src/assets/layout_concentric.svg new file mode 100644 index 000000000..8b3f1520e --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/layout_concentric.svg @@ -0,0 +1,19 @@ + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/layout_dagre.svg b/hugegraph-hubble/hubble-fe/src/assets/layout_dagre.svg new file mode 100644 index 000000000..ac97db09d --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/layout_dagre.svg @@ -0,0 +1,19 @@ + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/layout_force.svg b/hugegraph-hubble/hubble-fe/src/assets/layout_force.svg new file mode 100644 index 000000000..2f2305184 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/layout_force.svg @@ -0,0 +1,19 @@ + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/layout_grid.svg b/hugegraph-hubble/hubble-fe/src/assets/layout_grid.svg new file mode 100644 index 000000000..06b760838 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/layout_grid.svg @@ -0,0 +1,26 @@ + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/layout_radial.svg b/hugegraph-hubble/hubble-fe/src/assets/layout_radial.svg new file mode 100644 index 000000000..d38e5caad --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/assets/layout_radial.svg @@ -0,0 +1,25 @@ + + + + + + diff --git a/hugegraph-hubble/hubble-fe/src/assets/logo.png b/hugegraph-hubble/hubble-fe/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..45d5178bb3919e1f4c7e700171b4bb72071840df GIT binary patch literal 2037 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 WZIQp4qz%muA9aa?yhWx9=2 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 literal 0 HcmV?d00001 diff --git a/hugegraph-hubble/hubble-fe/src/assets/logo_new.png b/hugegraph-hubble/hubble-fe/src/assets/logo_new.png new file mode 100644 index 0000000000000000000000000000000000000000..daedcc6f137f92d519e299587df0c7931026680b GIT binary patch literal 79524 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�Hl_l_DkRY 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

XDReRMQy?Q;~ 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%0DbS9O1?bAG`xY}4-Pw3paa~mhPaxe@=+|7QJ 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 { + const {t} = useTranslation(); + const editor = useRef(); + const cm = useRef(); + + useEffect(() => { + const syntax = syntaxConfig[lang] ?? syntaxConfig.default; + + const myCompletions = context => { + let before = context.matchBefore(/\w+/); + if (!context.explicit && !before) { + return null; + } + + return { + from: before ? before.from : context.pos, + options: syntax.hint, + validFor: /^\w*$/, + }; + }; + + const myHighlightStyle = HighlightStyle.define([ + {tag: tags.keyword, color: '#fc6eee'}, + {tag: tags.function, color: '#ff0'}, + ]); + + cm.current = new EditorView({ + extensions: [ + basicSetup, + autocompletion({override: [myCompletions]}), + syntaxHighlighting(myHighlightStyle), + EditorView.updateListener.of(e => { + onChange && onChange(e.state.doc.toString()); + }), + EditorView.theme( + { + '&': { + color: '#000', + }, + '&.cm-focused': { + outline: '0', + }, + '.cm-activeLine': { + 'background-color': 'transparent', + }, + } + ), + cmplaceholder(placeholder ?? t('analysis.query.placeholder')), + ], + parent: editor.current, + }); + + // onChange && EditorView.updateListener.of(e => onChange(e.state.doc.toString())); + + return () => { + cm.current.destroy(); + }; + }, [t, lang, onChange, placeholder]); + + useEffect(() => { + if (value !== null && cm.current.state.doc && value !== cm.current.state.doc.toString()) { + cm.current.dispatch({ + changes: {from: 0, to: cm.current.state.doc.length, insert: value}, + }); + } + }, [value]); + + return ( +

+ ); +}; + +export default CodeEditor; diff --git a/hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/cypher.js b/hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/cypher.js new file mode 100644 index 000000000..e638b5c8b --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/cypher.js @@ -0,0 +1,131 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +const hint = [ + // constant/type/class/function + // Clauses + {label: 'CALL', type: 'method'}, + {label: 'CREATE', type: 'method'}, + {label: 'DELETE', type: 'method'}, + {label: 'DETACH', type: 'method'}, + {label: 'FOREACH', type: 'method'}, + {label: 'LOAD', type: 'method'}, + {label: 'MATCH', type: 'method'}, + {label: 'MERGE', type: 'method'}, + {label: 'OPTIONAL MATCH', type: 'method'}, + {label: 'REMOVE', type: 'method'}, + {label: 'RETURN', type: 'method'}, + {label: 'SET', type: 'method'}, + {label: 'START', type: 'method'}, + {label: 'UNION', type: 'method'}, + {label: 'UNWIND', type: 'method'}, + {label: 'WITH', type: 'method'}, + + // Subclauses + {label: 'LIMIT', type: 'constant'}, + {label: 'ORDER BY', type: 'constant'}, + {label: 'SKIP', type: 'constant'}, + {label: 'WHERE', type: 'constant'}, + {label: 'YIELD', type: 'constant'}, + + // Modifiers + {label: 'ASC', type: 'keyword'}, + {label: 'ASCENDING', type: 'keyword'}, + {label: 'ASSERT', type: 'keyword'}, + {label: 'BY', type: 'keyword'}, + {label: 'CSV', type: 'keyword'}, + {label: 'DESC', type: 'keyword'}, + {label: 'DESCENDING', type: 'keyword'}, + {label: 'ON', type: 'keyword'}, + + // Expressions + {label: 'ALL', type: 'keyword'}, + {label: 'CASE', type: 'keyword'}, + {label: 'COUNT', type: 'keyword'}, + {label: 'ELSE', type: 'keyword'}, + {label: 'END', type: 'keyword'}, + {label: 'EXISTS', type: 'keyword'}, + {label: 'THEN', type: 'keyword'}, + {label: 'WHEN', type: 'keyword'}, + + // Operators + {label: 'AND', type: 'keyword'}, + {label: 'AS', type: 'keyword'}, + {label: 'CONTAINS', type: 'keyword'}, + {label: 'DISTINCT', type: 'keyword'}, + {label: 'ENDS', type: 'keyword'}, + {label: 'IN', type: 'keyword'}, + {label: 'IS', type: 'keyword'}, + {label: 'NOT', type: 'keyword'}, + {label: 'OR', type: 'keyword'}, + {label: 'STARTS', type: 'keyword'}, + {label: 'XOR', type: 'keyword'}, + + // Schema + {label: 'CONSTRAINT', type: 'keyword'}, + {label: 'CREATE', type: 'keyword'}, + {label: 'DROP', type: 'keyword'}, + {label: 'EXISTS', type: 'keyword'}, + {label: 'INDEX', type: 'keyword'}, + {label: 'NODE', type: 'keyword'}, + {label: 'KEY', type: 'keyword'}, + {label: 'UNIQUE', type: 'keyword'}, + + // Hints + {label: 'INDEX', type: 'keyword'}, + {label: 'JOIN', type: 'keyword'}, + {label: 'SCAN', type: 'keyword'}, + {label: 'USING', type: 'keyword'}, + + // Literals + {label: 'false', type: 'keyword'}, + {label: 'null', type: 'keyword'}, + {label: 'true', type: 'keyword'}, + + // Reserved for future use + {label: 'ADD', type: 'keyword'}, + {label: 'DO', type: 'keyword'}, + {label: 'FOR', type: 'keyword'}, + {label: 'MANDATORY', type: 'keyword'}, + {label: 'OF', type: 'keyword'}, + {label: 'REQUIRE', type: 'keyword'}, + {label: 'SCALAR', type: 'keyword'}, +]; + +const highlight = [ + {tag: 'CALL', color: '#fc6'}, + {tag: 'CREATE', color: '#fc6'}, + {tag: 'DELETE', color: '#fc6'}, + {tag: 'DETACH', color: '#fc6'}, + {tag: 'FOREACH', color: '#fc6'}, + {tag: 'LOAD', color: '#fc6'}, + {tag: 'MATCH', color: '#fc6'}, + {tag: 'MERGE', color: '#fc6'}, + {tag: 'OPTIONAL MATCH', color: '#fc6'}, + {tag: 'REMOVE', color: '#fc6'}, + {tag: 'RETURN', color: '#fc6'}, + {tag: 'SET', color: '#fc6'}, + {tag: 'START', color: '#fc6'}, + {tag: 'UNION', color: '#fc6'}, + {tag: 'UNWIND', color: '#fc6'}, + {tag: 'WITH', color: '#fc6'}, + // {tag: '', color: '#fc6'}, + // {tag: tags.comment, color: "#f5d", fontStyle: "italic"} +]; + +export {highlight, hint}; diff --git a/hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/gremlin.js b/hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/gremlin.js new file mode 100644 index 000000000..18c80e2af --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/gremlin.js @@ -0,0 +1,176 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +// const hint = [ +// 'g', +// 'graph', +// 'out', 'int', 'both', 'outE', 'inE', 'bothE', 'outV', 'inV', 'bothV', 'otherV', +// 'hasNext', 'next', 'tryNext', 'toList', 'toSet', 'toBulkSet', 'fill', 'iterate', +// 'addV', 'addE', 'aggregate', 'and', 'as', +// 'barrier', 'branch', 'by', +// 'call', 'cap', 'choose', 'coalesce', 'coin', 'connectedComponent', 'constant', 'count', 'cyclicPath', +// 'dedup', 'drop', +// 'E', 'element', 'elementMap', 'emit', 'explain', +// 'fail', 'filter', 'flatMap', 'fold', 'from', +// 'group', 'groupCount', +// 'has', 'hasLabel', 'hasId', 'hasKey', 'hasValue', 'hasNot', +// 'id', 'identity', 'index', 'inject', 'io', 'is', +// 'key', +// 'label', 'limit', 'local', 'loops', +// 'map', 'match', 'math', 'max', 'mean', 'mergeE', 'mergeV', 'min', +// 'none', 'not', +// 'option', 'optional', 'or', 'order', +// 'pageRank', 'path', 'peerPressure', 'profile', 'project', 'program', 'properties', 'property', +// 'propertiesMap', +// 'range', 'read', 'repeat', +// 'sack', 'sample', 'select', 'shortestPath', 'sideEffect', 'simplePath', 'skip', 'subgraph', 'sum', +// 'tail', 'timeLimit', 'to', 'tree', +// 'unfold', 'union', 'until', +// 'V', 'value', 'valueMap', 'values', +// 'where', 'with', 'write', +// ]; + +// const highlight = []; + +// export {hint, highlight}; + + +const hint = [ + {label: 'g', type: 'constant'}, + {label: 'graph', type: 'constant'}, + {label: 'out', type: 'function'}, + {label: 'int', type: 'function'}, + {label: 'both', type: 'function'}, + {label: 'outE', type: 'function'}, + {label: 'inE', type: 'function'}, + {label: 'bothE', type: 'function'}, + {label: 'outV', type: 'function'}, + {label: 'inV', type: 'function'}, + {label: 'bothV', type: 'function'}, + {label: 'otherV', type: 'function'}, + {label: 'hasNext', type: 'function'}, + {label: 'next', type: 'function'}, + {label: 'tryNext', type: 'function'}, + {label: 'toList', type: 'function'}, + {label: 'toSet', type: 'function'}, + {label: 'toBulkSet', type: 'function'}, + {label: 'fill', type: 'function'}, + {label: 'iterate', type: 'function'}, + {label: 'addV', type: 'function'}, + {label: 'addE', type: 'function'}, + {label: 'aggregate', type: 'function'}, + {label: 'and', type: 'function'}, + {label: 'as', type: 'function'}, + {label: 'barrier', type: 'function'}, + {label: 'branch', type: 'function'}, + {label: 'by', type: 'function'}, + {label: 'call', type: 'function'}, + {label: 'cap', type: 'function'}, + {label: 'choose', type: 'function'}, + {label: 'coalesce', type: 'function'}, + {label: 'coin', type: 'function'}, + {label: 'connectedComponent', type: 'function'}, + {label: 'constant', type: 'function'}, + {label: 'count', type: 'function'}, + {label: 'cyclicPath', type: 'function'}, + {label: 'dedup', type: 'function'}, + {label: 'drop', type: 'function'}, + {label: 'E', type: 'function'}, + {label: 'element', type: 'function'}, + {label: 'elementMap', type: 'function'}, + {label: 'emit', type: 'function'}, + {label: 'explain', type: 'function'}, + {label: 'fail', type: 'function'}, + {label: 'filter', type: 'function'}, + {label: 'flatMap', type: 'function'}, + {label: 'fold', type: 'function'}, + {label: 'from', type: 'function'}, + {label: 'group', type: 'function'}, + {label: 'groupCount', type: 'function'}, + {label: 'has', type: 'function'}, + {label: 'hasLabel', type: 'function'}, + {label: 'hasId', type: 'function'}, + {label: 'hasKey', type: 'function'}, + {label: 'hasValue', type: 'function'}, + {label: 'hasNot', type: 'function'}, + {label: 'id', type: 'function'}, + {label: 'identity', type: 'function'}, + {label: 'index', type: 'function'}, + {label: 'inject', type: 'function'}, + {label: 'io', type: 'function'}, + {label: 'is', type: 'function'}, + {label: 'key', type: 'function'}, + {label: 'label', type: 'function'}, + {label: 'limit', type: 'function'}, + {label: 'local', type: 'function'}, + {label: 'loops', type: 'function'}, + {label: 'map', type: 'function'}, + {label: 'match', type: 'function'}, + {label: 'math', type: 'function'}, + {label: 'max', type: 'function'}, + {label: 'mean', type: 'function'}, + {label: 'mergeE', type: 'function'}, + {label: 'mergeV', type: 'function'}, + {label: 'min', type: 'function'}, + {label: 'none', type: 'function'}, + {label: 'not', type: 'function'}, + {label: 'option', type: 'function'}, + {label: 'optional', type: 'function'}, + {label: 'or', type: 'function'}, + {label: 'order', type: 'function'}, + {label: 'pageRank', type: 'function'}, + {label: 'path', type: 'function'}, + {label: 'peerPressure', type: 'function'}, + {label: 'profile', type: 'function'}, + {label: 'project', type: 'function'}, + {label: 'program', type: 'function'}, + {label: 'properties', type: 'function'}, + {label: 'property', type: 'function'}, + {label: 'propertiesMap', type: 'function'}, + {label: 'range', type: 'function'}, + {label: 'read', type: 'function'}, + {label: 'repeat', type: 'function'}, + {label: 'sack', type: 'function'}, + {label: 'sample', type: 'function'}, + {label: 'select', type: 'function'}, + {label: 'shortestPath', type: 'function'}, + {label: 'sideEffect', type: 'function'}, + {label: 'simplePath', type: 'function'}, + {label: 'skip', type: 'function'}, + {label: 'subgraph', type: 'function'}, + {label: 'sum', type: 'function'}, + {label: 'tail', type: 'function'}, + {label: 'timeLimit', type: 'function'}, + {label: 'to', type: 'function'}, + {label: 'tree', type: 'function'}, + {label: 'unfold', type: 'function'}, + {label: 'union', type: 'function'}, + {label: 'until', type: 'function'}, + {label: 'V', type: 'function'}, + {label: 'value', type: 'function'}, + {label: 'valueMap', type: 'function'}, + {label: 'values', type: 'function'}, + {label: 'where', type: 'function'}, + {label: 'with', type: 'function'}, + {label: 'write', type: 'function'}, +]; + +const highlight = []; + +export {hint, highlight}; + diff --git a/hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/index.js b/hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/index.js new file mode 100644 index 000000000..b82c9d707 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/CodeEditor/syntax/index.js @@ -0,0 +1,22 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import * as gremlin from './gremlin'; +import * as cypher from './cypher'; + +export default {gremlin, cypher, default: {hint: [], highlight: []}}; diff --git a/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.js b/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.js new file mode 100644 index 000000000..950b45452 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.js @@ -0,0 +1,81 @@ + +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {useCallback, useEffect, useState} from 'react'; +import {ChromePicker} from 'react-color'; +import styles from './index.module.scss'; + +const InputColorSelect = ({value, onChange, disable}) => { + const [visible, setVisible] = useState(false); + const [color, setColor] = useState('#5c73e6'); + + const showPicker = useCallback(() => { + if (disable) { + return; + } + + setVisible(true); + }, [disable]); + + const hidePicker = useCallback(() => { + if (disable) { + return; + } + + setVisible(false); + }, [disable]); + + const handleClick = useCallback(color => { + if (disable) { + return; + } + + setColor(color.hex); + + onChange?.(color.hex); + }, [onChange, disable]); + + useEffect(() => { + if (value) { + setColor(value); + } + }, [value]); + + return ( +
+ {disable ?
: null} +
+
+
+ {visible ? ( +
+
+ +
+ ) : null} +
+ ); +}; + +export {InputColorSelect}; diff --git a/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.module.scss b/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.module.scss new file mode 100644 index 000000000..0f507782f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.module.scss @@ -0,0 +1,65 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.wrap { + line-height: 0; + position: relative; +} + +.disable { + // border-top: 1px solid #FF0000; + width: 60px; + // transform: rotate(27deg); + position: absolute; + z-index: 2; + height: 32px; + top: 0; + // top: 17px; + // left: -2px; + // display: inline-block; + background: linear-gradient(28deg, transparent 49%, deeppink 49%, deeppink 50.5%, transparent 50.5%); +} + +.color { + width: 46px; + height: 18px; + border-radius: 2px; +} + +.swatch { + padding: 6px; + background: #fff; + border-radius: 2px; + // box-shadow: 0 0 0 1px rgba(0, 0, 0, .1); + border: 1px solid #d9d9d9; + display: inline-block; + cursor: pointer; +} + +.popover { + position: absolute; + z-index: 2; +} + +.cover { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0, +} diff --git a/hugegraph-hubble/hubble-fe/src/components/ERView/EditLayer.js b/hugegraph-hubble/hubble-fe/src/components/ERView/EditLayer.js new file mode 100644 index 000000000..f8e603f74 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ERView/EditLayer.js @@ -0,0 +1,91 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {Form, Modal, Select} from 'antd'; +import vertexData from './data/vertex.json'; +import edgeData from './data/edge.json'; +import {useCallback} from 'react'; +import {useTranslation} from 'react-i18next'; + +const EditVertexLayer = ({open, onCancle: onCancel, onChange}) => { + const {t} = useTranslation(); + const [form] = Form.useForm(); + + const setVertex = useCallback((_, item) => { + form.setFieldValue('vertex', item.info); + }, [form]); + + const onFinish = useCallback(() => { + console.log(form.getFieldsValue()); + onChange(form.getFieldValue('vertex')); + onCancel(); + }, [form, onChange, onCancel]); + + return ( + +
+ + ({label: item.name, value: item.name, info: item}))} + onChange={setEdge} + /> + + + +
+ ); +}; + +export {EditVertexLayer, EditEdgeLayer}; diff --git a/hugegraph-hubble/hubble-fe/src/components/ERView/config.js b/hugegraph-hubble/hubble-fe/src/components/ERView/config.js new file mode 100644 index 000000000..6dc4d81fc --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ERView/config.js @@ -0,0 +1,307 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +const LINE_HEIGHT = 24; +const NODE_WIDTH = 150; + +const erRectConfig = { + inherit: 'rect', + markup: [ + { + tagName: 'rect', + selector: 'body', + }, + { + tagName: 'text', + selector: 'label', + }, + // { + // tagName: 'g', + // attrs: { + // class: 'btn add', + // }, + // children: [ + // { + // tagName: 'circle', + // attrs: { + // class: 'add', + // }, + // }, + // { + // tagName: 'text', + // attrs: { + // class: 'add', + // }, + // }, + // ], + // }, + ], + tools: [ + { + name: 'button', + args: { + x: 10, + y: 10, + markup: [ + // { + // tagName: 'circle', + // attrs: { + // stroke: '#fff', + // fill: 'transparent', + // cursor: 'pointer', + // 'stroke-width': 1, + // r: 8, + // }, + // }, + { + tagName: 'text', + textContent: '∅', + attrs: { + fontSize: 16, + fontWeight: 800, + x: -4, + y: 6, + fill: '#fff', + fontFamily: 'Times New Roman', + cursor: 'pointer', + }, + }, + ], + }, + }, + { + name: 'button-remove', + args: { + x: '100%', + y: 0, + offset: {x: 0, y: 0}, + }, + }, + ], + attrs: { + rect: { + strokeWidth: 1, + stroke: '#5F95FF', + fill: '#5F95FF', + }, + label: { + fontWeight: 'bold', + fill: '#ffffff', + fontSize: 12, + }, + '.btn.add': { + 'refDx': -16, + 'refY': 12, + 'event': 'node:add', + }, + '.btn.del': { + 'refDx': -44, + 'refY': 16, + 'event': 'node:delete', + }, + '.btn > circle': { + 'r': 8, + 'fill': 'transparent', + 'stroke': '#fff', + 'strokeWidth': 1, + }, + '.btn.add > text': { + 'fontSize': 16, + 'fontWeight': 800, + 'fill': '#fff', + 'x': -75, + 'y': -12, + 'fontFamily': 'Times New Roman', + 'text': '+', + }, + '.btn.del > text': { + 'fontSize': 28, + 'fontWeight': 500, + 'fill': '#fff', + 'x': -4.5, + 'y': 6, + 'fontFamily': 'Times New Roman', + 'text': '-', + }, + }, + ports: { + groups: { + list: { + markup: [ + { + tagName: 'rect', + selector: 'portBody', + }, + { + tagName: 'text', + selector: 'portNameLabel', + }, + { + tagName: 'text', + selector: 'portTypeLabel', + }, + ], + attrs: { + portBody: { + width: NODE_WIDTH, + height: LINE_HEIGHT, + strokeWidth: 1, + stroke: '#5F95FF', + fill: '#EFF4FF', + magnet: true, + }, + portNameLabel: { + ref: 'portBody', + refX: 6, + refY: 6, + fontSize: 10, + }, + portTypeLabel: { + ref: 'portBody', + refX: 95, + refY: 6, + fontSize: 10, + }, + }, + position: 'erPortPosition', + }, + title: { + markup: [ + { + tagName: 'rect', + selector: 'portBody', + }, + { + tagName: 'text', + selector: 'portNameLabel', + }, + { + tagName: 'text', + selector: 'portTypeLabel', + }, + ], + attrs: { + portBody: { + width: NODE_WIDTH, + height: LINE_HEIGHT, + strokeWidth: 1, + stroke: '#5F95FF', + fill: '#FFFF00', + magnet: true, + }, + portNameLabel: { + ref: 'portBody', + refX: 6, + refY: 6, + fontSize: 10, + }, + portTypeLabel: { + ref: 'portBody', + refX: 95, + refY: 6, + fontSize: 10, + }, + }, + position: 'erPortPosition', + }, + }, + }, +}; + +const erRectHeadConfig = { + inherit: 'rect', + markup: [ + { + tagName: 'rect', + selector: 'body', + }, + { + tagName: 'text', + selector: 'label', + }, + ], + attrs: { + rect: { + strokeWidth: 1, + stroke: '#5F95FF', + fill: '#5F95FF', + }, + label: { + fontWeight: 'bold', + fill: '#ffffff', + fontSize: 12, + }, + }, + ports: { + groups: { + list: { + markup: [ + { + tagName: 'rect', + selector: 'portBody', + }, + { + tagName: 'text', + selector: 'portNameLabel', + }, + { + tagName: 'text', + selector: 'portTypeLabel', + }, + ], + attrs: { + portBody: { + width: NODE_WIDTH, + height: LINE_HEIGHT, + strokeWidth: 1, + stroke: '#5F95FF', + fill: '#EFF4FF', + magnet: true, + }, + portNameLabel: { + ref: 'portBody', + refX: 6, + refY: 6, + fontSize: 10, + }, + portTypeLabel: { + ref: 'portBody', + refX: 95, + refY: 6, + fontSize: 10, + }, + }, + position: 'erPortPosition', + }, + }, + }, +}; + +const erPortPosition = portsPositionArgs => { + return portsPositionArgs.map((a, index) => { + return { + position: { + x: 0, + y: (index + 1) * LINE_HEIGHT, + }, + angle: 0, + }; + }); +}; + +export {erRectConfig, erRectHeadConfig, erPortPosition}; diff --git a/hugegraph-hubble/hubble-fe/src/components/ERView/data/edge.json b/hugegraph-hubble/hubble-fe/src/components/ERView/data/edge.json new file mode 100644 index 000000000..e18787291 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ERView/data/edge.json @@ -0,0 +1,232 @@ +[ + { + "name": "父子", + "source_label": "男人", + "target_label": "男人", + "link_multi_times": false, + "properties": [], + "sort_keys": [], + "property_indexes": [], + "open_label_index": true, + "style": { + "color": "#5C73E6", + "with_arrow": true, + "line_type": "SOLID", + "thickness": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "父女", + "source_label": "男人", + "target_label": "女人", + "link_multi_times": false, + "properties": [], + "sort_keys": [], + "property_indexes": [], + "open_label_index": true, + "style": { + "color": "#5C73E6", + "with_arrow": true, + "line_type": "SOLID", + "thickness": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "母子", + "source_label": "女人", + "target_label": "男人", + "link_multi_times": false, + "properties": [], + "sort_keys": [], + "property_indexes": [], + "open_label_index": true, + "style": { + "color": "#5C73E6", + "with_arrow": true, + "line_type": "SOLID", + "thickness": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "母女", + "source_label": "女人", + "target_label": "女人", + "link_multi_times": false, + "properties": [], + "sort_keys": [], + "property_indexes": [], + "open_label_index": true, + "style": { + "color": "#5C73E6", + "with_arrow": true, + "line_type": "SOLID", + "thickness": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "妻", + "source_label": "男人", + "target_label": "女人", + "link_multi_times": false, + "properties": [], + "sort_keys": [], + "property_indexes": [], + "open_label_index": true, + "style": { + "color": "#5C73E6", + "with_arrow": true, + "line_type": "SOLID", + "thickness": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "妾", + "source_label": "男人", + "target_label": "女人", + "link_multi_times": false, + "properties": [], + "sort_keys": [], + "property_indexes": [], + "open_label_index": true, + "style": { + "color": "#5C73E6", + "with_arrow": true, + "line_type": "SOLID", + "thickness": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "相恋", + "source_label": "男人", + "target_label": "女人", + "link_multi_times": false, + "properties": [], + "sort_keys": [], + "property_indexes": [], + "open_label_index": true, + "style": { + "color": "#5C73E6", + "with_arrow": true, + "line_type": "SOLID", + "thickness": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "朋友", + "source_label": "男人", + "target_label": "女人", + "link_multi_times": false, + "properties": [], + "sort_keys": [], + "property_indexes": [], + "open_label_index": true, + "style": { + "color": "#5C73E6", + "with_arrow": true, + "line_type": "SOLID", + "thickness": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "姐妹", + "source_label": "女人", + "target_label": "女人", + "link_multi_times": false, + "properties": [], + "sort_keys": [], + "property_indexes": [], + "open_label_index": true, + "style": { + "color": "#5C73E6", + "with_arrow": true, + "line_type": "SOLID", + "thickness": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "丫环", + "source_label": "男人", + "target_label": "女人", + "link_multi_times": false, + "properties": [], + "sort_keys": [], + "property_indexes": [], + "open_label_index": true, + "style": { + "color": "#5C73E6", + "with_arrow": true, + "line_type": "SOLID", + "thickness": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + } +] diff --git a/hugegraph-hubble/hubble-fe/src/components/ERView/data/group.json b/hugegraph-hubble/hubble-fe/src/components/ERView/data/group.json new file mode 100644 index 000000000..91cbce270 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ERView/data/group.json @@ -0,0 +1,95 @@ +{ + "markup": [ + { + "tagName": "rect", + "selector": "portBody" + }, + { + "tagName": "text", + "selector": "portNameLabel" + }, + { + "tagName": "text", + "selector": "portTypeLabel" + }, + { + "tagName": "g", + "attrs": { + "class": "btn add" + }, + "children": [ + { + "tagName": "circle", + "attrs": { + "class": "add" + } + }, + { + "tagName": "text", + "attrs": { + "class": "add" + } + } + ] + } + ], + "attrs": { + "portBody": { + "width": 150, + "height": 24, + "strokeWidth": 1, + "stroke": "#5F95FF", + "fill": "#EFF4FF", + "magnet": true + }, + "portNameLabel": { + "refX": 6, + "refY": 6, + "fontSize": 10, + "text": "ID" + }, + "portTypeLabel": { + "refX": 95, + "refY": 6, + "fontSize": 10, + "text": "" + }, + "rect": { + "fill": "#FAFAFA" + }, + ".btn.add": { + "refDx": -16, + "refY": 16, + "event": "node:add" + }, + ".btn.del": { + "refDx": -44, + "refY": 16, + "event": "node:delete" + }, + ".btn > circle": { + "r": 10, + "fill": "transparent", + "stroke": "#fff", + "strokeWidth": 1 + }, + ".btn.add > text": { + "fontSize": 20, + "fontWeight": 800, + "fill": "#fff", + "x": -5.5, + "y": 7, + "fontFamily": "Times New Roman", + "text": "+" + }, + ".btn.del > text": { + "fontSize": 28, + "fontWeight": 500, + "fill": "#fff", + "x": -4.5, + "y": 6, + "fontFamily": "Times New Roman", + "text": "-" + } + } +} \ No newline at end of file diff --git a/hugegraph-hubble/hubble-fe/src/components/ERView/data/property.json b/hugegraph-hubble/hubble-fe/src/components/ERView/data/property.json new file mode 100644 index 000000000..02c9b987f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ERView/data/property.json @@ -0,0 +1,32 @@ +[ + { + "name": "姓名", + "data_type": "TEXT", + "cardinality": "SINGLE", + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "性别", + "data_type": "TEXT", + "cardinality": "SINGLE", + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "年龄", + "data_type": "INT", + "cardinality": "SINGLE", + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "特点", + "data_type": "TEXT", + "cardinality": "SINGLE", + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "亲疏", + "data_type": "TEXT", + "cardinality": "SINGLE", + "create_time": "1970-01-01 08:00:00" + } +] \ No newline at end of file diff --git a/hugegraph-hubble/hubble-fe/src/components/ERView/data/test.json b/hugegraph-hubble/hubble-fe/src/components/ERView/data/test.json new file mode 100644 index 000000000..4e18a159b --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ERView/data/test.json @@ -0,0 +1,295 @@ +[ + { + "id": "1", + "shape": "er-rect", + "label": "男人", + "width": 150, + "height": 24, + "position": { + "x": 24, + "y": 150 + }, + "ports": [ + { + "id": "1", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "ID" + }, + "portTypeLabel": { + "text": "" + }, + "rect": { + "fill": "#FAFAFA" + } + } + }, + { + "id": "1-1", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "ID" + }, + "portTypeLabel": { + "text": "" + } + } + }, + { + "id": "1-2", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Property" + }, + "portTypeLabel": { + "text": "特点" + } + } + }, + { + "id": "1-3", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Property" + }, + "portTypeLabel": { + "text": "亲疏" + } + } + }, + { + "id": "1-4", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Property" + }, + "portTypeLabel": { + "text": "性别" + } + } + }, + { + "id": "1-5", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Property" + }, + "portTypeLabel": { + "text": "年龄" + } + } + }, + { + "id": "1-6", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Value" + }, + "portTypeLabel": { + "text": "aa->bb" + } + } + }, + { + "id": "1-7", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Value" + }, + "portTypeLabel": { + "text": "aa1->bb1" + } + }, + "tools": [{ + "name": "node-editor" + }] + }, + { + "id": "1-8", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Value" + }, + "portTypeLabel": { + "text": "aa2->bb2" + } + } + } + ] + }, + { + "id": "2", + "shape": "er-head-rect", + "label": "head", + "width": 150, + "height": 24, + "position": { + "x": 250, + "y": 210 + }, + "ports": [ + { + "id": "2-1", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Col-1" + }, + "portTypeLabel": { + "text": "STRING" + } + } + }, + { + "id": "2-2", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Col-2" + }, + "portTypeLabel": { + "text": "STRING" + } + } + }, + { + "id": "2-3", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Col-3" + }, + "portTypeLabel": { + "text": "STRING" + } + } + }, + { + "id": "2-4", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Col-4" + }, + "portTypeLabel": { + "text": "STRING" + } + } + }, + { + "id": "2-5", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Col-5" + }, + "portTypeLabel": { + "text": "STRING" + } + } + } + ] + }, + { + "id": "3", + "shape": "er-rect", + "label": "父子", + "width": 150, + "height": 24, + "position": { + "x": 480, + "y": 350 + }, + "ports": [ + { + "id": "3-1", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "起点ID" + } + } + }, + { + "id": "3-2", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "终点ID" + } + } + }, + { + "id": "3-3", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Property" + }, + "portTypeLabel": { + "text": "年龄" + } + } + }, + { + "id": "3-4", + "group": "list", + "attrs": { + "portNameLabel": { + "text": "Value" + }, + "portTypeLabel": { + "text": "ede1->nn1" + } + } + } + ] + }, + { + "id": "4", + "shape": "edge", + "source": { + "cell": "1", + "port": "1-1" + }, + "target": { + "cell": "2", + "port": "2-3" + }, + "attrs": { + "line": { + "stroke": "#A2B1C3", + "strokeWidth": 2 + } + }, + "zIndex": 0 + }, + { + "id": "5", + "shape": "edge", + "source": { + "cell": "3", + "port": "3-1" + }, + "target": { + "cell": "2", + "port": "2-4" + }, + "attrs": { + "line": { + "stroke": "#A2B1C3", + "strokeWidth": 2 + } + }, + "zIndex": 0 + } +] \ No newline at end of file diff --git a/hugegraph-hubble/hubble-fe/src/components/ERView/data/vertex.json b/hugegraph-hubble/hubble-fe/src/components/ERView/data/vertex.json new file mode 100644 index 000000000..cf9d0cb9d --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ERView/data/vertex.json @@ -0,0 +1,123 @@ +[ + { + "name": "男人", + "id_strategy": "PRIMARY_KEY", + "properties": [ + { + "name": "特点", + "nullable": false + }, + { + "name": "亲疏", + "nullable": false + }, + { + "name": "性别", + "nullable": false + }, + { + "name": "姓名", + "nullable": false + }, + { + "name": "年龄", + "nullable": false + } + ], + "primary_keys": [ + "姓名" + ], + "property_indexes": [], + "open_label_index": true, + "style": { + "icon": "", + "color": "#5C73E6", + "size": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "女人", + "id_strategy": "PRIMARY_KEY", + "properties": [ + { + "name": "特点", + "nullable": false + }, + { + "name": "亲疏", + "nullable": false + }, + { + "name": "性别", + "nullable": false + }, + { + "name": "姓名", + "nullable": false + }, + { + "name": "年龄", + "nullable": false + } + ], + "primary_keys": [ + "姓名" + ], + "property_indexes": [], + "open_label_index": true, + "style": { + "icon": "", + "color": "#5C73E6", + "size": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + }, + { + "name": "机构", + "id_strategy": "PRIMARY_KEY", + "properties": [ + { + "name": "特点", + "nullable": false + }, + { + "name": "亲疏", + "nullable": false + }, + { + "name": "姓名", + "nullable": false + } + ], + "primary_keys": [ + "姓名" + ], + "property_indexes": [], + "open_label_index": true, + "style": { + "icon": "", + "color": "#5C73E6", + "size": "NORMAL", + "display_fields": [ + "~id" + ], + "join_symbols": [ + "-" + ] + }, + "create_time": "1970-01-01 08:00:00" + } +] diff --git a/hugegraph-hubble/hubble-fe/src/components/ERView/index.js b/hugegraph-hubble/hubble-fe/src/components/ERView/index.js new file mode 100644 index 000000000..3b62f71c6 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ERView/index.js @@ -0,0 +1,361 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {Graph, Cell, Shape, Color} from '@antv/x6'; +import {ReactShape} from '@antv/x6-react-shape'; +import {Menu, Toolbar, Dropdown} from '@antv/x6-react-components'; +import {memo, useCallback, useEffect, useRef, useState} from 'react'; +import { + ZoomInOutlined, + ZoomOutOutlined, + RedoOutlined, + UndoOutlined, + DeleteOutlined, +} from '@ant-design/icons'; +import style from './index.module.scss'; +import testData from './data/test.json'; +import vertexData from './data/vertex.json'; +import edgeData from './data/edge.json'; +import propertyData from './data/property.json'; +import {erRectConfig, erRectHeadConfig, erPortPosition} from './config'; +import '@antv/x6-react-components/es/menu/style/index.css'; +import '@antv/x6-react-components/es/toolbar/style/index.css'; +import {EditVertexLayer, EditEdgeLayer} from './EditLayer'; +import {setCell} from './utils'; +import {useTranslation} from 'react-i18next'; + +Graph.registerPortLayout('erPortPosition', erPortPosition); +Graph.registerNode('er-rect', erRectConfig, true); +Graph.registerNode('er-head-rect', erRectHeadConfig, true); + +const ERShapce = memo( + ({node, text}) => { + const color = Color.randomHex(); + + return ( +
+ {text} +
+ ); + }, + (prev, next) => { + return Boolean(next.node?.hasChanged('data')); + } +); + +const ERView = () => { + const container = useRef(null); + const graph = useRef(null); + const {t} = useTranslation(); + const [vertexVisible, setVertexVisible] = useState(false); + const [edgeVisible, setEdgeVisible] = useState(false); + const [data, setData] = useState([]); + + useEffect(() => { + graph.current = new Graph({ + container: container.current, + grid: true, + history: true, + // selecting: true, + connecting: { + allowMulti: 'withPort', + allowBlank: false, + allowLoop: false, + allowNode: false, + allowEdge: false, + snap: true, + router: { + name: 'er', + args: { + offset: 25, + direction: 'H', + }, + }, + createEdge() { + return new Shape.Edge({ + // tools: [ + // { + // name: 'button-remove', + // args: { + // distance: -40, + // }, + // }, + // ], + attrs: { + line: { + stroke: '#A2B1C3', + strokeWidth: 2, + }, + }, + }); + }, + }, + }); + + const cells = []; + testData.forEach(item => { + if (item.shape === 'edge') { + cells.push(graph.current.createEdge(item)); + } + else { + cells.push(graph.current.createNode(item)); + } + }); + graph.current.resetCells(cells); + graph.current.zoomToFit({padding: 10, maxScale: 1}); + + graph.current.on('node:add', ({e, node}) => { + e.stopPropagation(); + console.log('add', node); + // const member = createNode( + // 'Employee', + // 'New Employee', + // Math.random() < 0.5 ? male : female, + // ); + // graph.freeze(); + // graph.addCell([member, createEdge(node, member)]) + // layout(); + }); + + graph.current.on('node:delete', ({e, node}) => { + e.stopPropagation(); + console.log('delete', node); + // graph.freeze(); + // graph.removeCell(node); + // layout(); + }); + + graph.current.on('edge:mouseenter', ({cell}) => { + cell.addTools([ + { + name: 'target-arrowhead', + args: { + attrs: { + fill: 'red', + }, + }, + }, + { + name: 'button-remove', + args: { + distance: 0.7, + }, + }, + { + name: 'button', + args: { + distance: 0.5, + onClick: ({cell}) => { + console.log(cell); + }, + markup: [ + { + tagName: 'circle', + selector: 'button', + attrs: { + r: 10, + stroke: '#A2B1C3', + strokeWidth: 1, + fill: 'white', + cursor: 'pointer', + }, + }, + { + tagName: 'g', + attrs: { + transform: 'translate(-8, -9)', + cursor: 'pointer', + }, + children: [ + { + tagName: 'svg', + attrs: { + width: 16, + height: 16, + viewBox: '0 0 1024 1024', + }, + children: [ + { + tagName: 'path', + attrs: { + // eslint-disable-next-line max-len + d: 'M257.7 752c2 0 4-0.2 6-0.5L431.9 722c2-0.4 3.9-1.3 5.3-2.8l423.9-423.9c3.9-3.9 3.9-10.2 0-14.1L694.9 114.9c-1.9-1.9-4.4-2.9-7.1-2.9s-5.2 1-7.1 2.9L256.8 538.8c-1.5 1.5-2.4 3.3-2.8 5.3l-29.5 168.2c-1.9 11.1 1.5 21.9 9.4 29.8 6.6 6.4 14.9 9.9 23.8 9.9z m67.4-174.4L687.8 215l73.3 73.3-362.7 362.6-88.9 15.7 15.6-89zM880 836H144c-17.7 0-32 14.3-32 32v36c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-36c0-17.7-14.3-32-32-32z', + fill: '#A2B1C3', + }, + }, + ], + }, + ], + }, + // { + // tagName: 'text', + // textContent: , + // selector: 'icon', + // attrs: { + // fill: '#fe854f', + // fontSize: 10, + // textAnchor: 'middle', + // pointerEvents: 'none', + // y: '0.3em', + // }, + // }, + ], + }, + }, + ]); + }); + + graph.current.on('edge:mouseleave', ({cell}) => { + cell.removeTools(); + }); + }, []); + + const [vertexList, setVertexList] = useState([]); + const [edgeList, setEdgeList] = useState([]); + + const addVertex = useCallback(vertex => { + graph.current.addNode(graph.current.createNode(setCell(t, vertex))); + }, [t]); + + const addEdge = useCallback(edge => { + graph.current.addNode(graph.current.createNode(setCell(t, edge, 'edge'))); + }, [t]); + + const addValueMap = () => { + + }; + + const showVertex = useCallback(() => { + setVertexVisible(true); + }, []); + + const hideVertex = useCallback(() => { + setVertexVisible(false); + }, []); + + const showEdge = useCallback(() => { + setEdgeVisible(true); + }, []); + + const hideEdge = useCallback(() => { + setEdgeVisible(false); + }, []); + + const handleZoomIn = useCallback(() => { + graph.current?.zoom(0.5); + }, []); + + const handleZoomOut = useCallback(() => { + graph.current?.zoom(-0.5); + }, []); + + const handleUndo = useCallback(() => { + graph.current?.history.undo(); + }, []); + + const handleRedo = useCallback(() => { + graph.current?.history.redo(); + }, []); + + const Item = Toolbar.Item; + const Group = Toolbar.Group; + const vertexMenu = ( + + {t('ERView.vertex.create')} + + {t('ERView.vertex.v1name')} + {t('ERView.vertex.v2name')} + + ); + + const edgeMenu = ( + + {t('ERView.edge.create')} + + {t('ERView.edge.e1name')} + {t('ERView.edge.e2name')} + + ); + + return ( +
+ console.log(graph.current.toJSON())}>Save}> + + } + onClick={handleZoomIn} + /> + } + onClick={handleZoomOut} + /> + + + } + onClick={handleUndo} + /> + } + onClick={handleRedo} + /> + + + } disabled tooltip="Delete (Delete)" /> + + + + + + + + + +
+ + +
+ ); +}; + +export default ERView; diff --git a/hugegraph-hubble/hubble-fe/src/components/ERView/index.module.scss b/hugegraph-hubble/hubble-fe/src/components/ERView/index.module.scss new file mode 100644 index 000000000..5cc07c55c --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ERView/index.module.scss @@ -0,0 +1,31 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.content { + flex: 1; + height: 540px; + margin-left: 8px; + margin-right: 8px; + box-shadow: 0 0 10px 1px #e9e9e9; +} + +.main { + text-align: center; + margin-top: 20px; + border: 1px solid #e9e9e9; +} diff --git a/hugegraph-hubble/hubble-fe/src/components/ERView/utils.js b/hugegraph-hubble/hubble-fe/src/components/ERView/utils.js new file mode 100644 index 000000000..db2ebf461 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ERView/utils.js @@ -0,0 +1,118 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {useTranslation} from 'react-i18next'; + +const setPropertyRow = item => { + return {...item, attr: {...item.attr, rect: {fill: '#FAFAFA'}}}; +}; + +const setValueRow = item => { + return {...item, attr: {...item.attr, rect: {fill: '#ACACAC'}}}; +}; + +const setCell = (t, cell, type) => { + const idList = []; + if (type === 'edge') { + idList.push( + { + id: `${cell.name}-source`, + group: 'list', + attrs: { + portNameLabel: { + text: t('ERView.edge.start'), + }, + portTypeLabel: { + text: '', + }, + rect: { + fill: '#FAFAFA', + }, + }, + } + ); + + idList.push( + { + id: `${cell.name}-target`, + group: 'list', + attrs: { + portNameLabel: { + text: t('ERView.edge.end'), + }, + portTypeLabel: { + text: '', + }, + rect: { + fill: '#FAFAFA', + }, + }, + } + ); + } + else { + idList.push( + { + id: `${cell.name}-ID`, + group: 'list', + attrs: { + portNameLabel: { + text: 'ID', + }, + portTypeLabel: { + text: '', + }, + rect: { + fill: '#FAFAFA', + }, + }, + } + ); + } + + const propertyList = cell.properties.map(item => ({ + id: `${cell.name}-${item.name}`, + group: 'list', + attrs: { + portNameLabel: { + text: 'Property', + }, + portTypeLabel: { + text: item.name, + }, + }, + })); + + return { + id: cell.name, + shape: 'er-rect', + label: cell.name, + width: 150, + height: 24, + position: { + x: 4, + y: 150, + }, + ports: [ + ...idList, + ...propertyList, + ], + }; +}; + +export {setPropertyRow, setValueRow, setCell}; diff --git a/hugegraph-hubble/hubble-fe/src/components/ExecutionContent/index.js b/hugegraph-hubble/hubble-fe/src/components/ExecutionContent/index.js new file mode 100644 index 000000000..7b9d1cf18 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ExecutionContent/index.js @@ -0,0 +1,70 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 折叠组件 + * @author + */ + +import React, {useState, useCallback} from 'react'; +import Highlighter from 'react-highlight-words'; + +import {UpOutlined, DownOutlined} from '@ant-design/icons'; +import c from './index.module.scss'; + +const ExecutionContent = ({content, highlightText}) => { + + const [isExpand, switchExpand] = useState(false); + + const onToggleCollapse = useCallback(() => { + switchExpand(prev => !prev); + }, []); + + const icon = isExpand ? : ; + const contentElement = isExpand ? ( + <> + + + ) : ( + <> + + + ); + + return ( +
+ {icon} + {contentElement} +
+ ); +}; + +export default ExecutionContent; diff --git a/hugegraph-hubble/hubble-fe/src/components/ExecutionContent/index.module.scss b/hugegraph-hubble/hubble-fe/src/components/ExecutionContent/index.module.scss new file mode 100644 index 000000000..721a07bb9 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ExecutionContent/index.module.scss @@ -0,0 +1,22 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.highlight { + color: #1890ff; + background-color: #fff; +} diff --git a/hugegraph-hubble/hubble-fe/src/components/GraphinView/index.js b/hugegraph-hubble/hubble-fe/src/components/GraphinView/index.js new file mode 100644 index 000000000..83a1d1074 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/GraphinView/index.js @@ -0,0 +1,67 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {useCallback} from 'react'; +import Graphin, {Behaviors} from '@antv/graphin'; + +const GraphView = ({data, width, height, layout, style, onClick, config, behaviors}) => { + // const [graphData, setGraphData] = useState([]); + + const {DragCanvas, ZoomCanvas, DragNode, ClickSelect, Hoverable} = Behaviors; + const graphinLayout = { + type: 'graphin-force', + animation: false, + ...layout, + // type: 'preset', + }; + + const handleClickSelect = useCallback(evt => { + const {item} = evt; + const {id, type} = item._cfg; + const model = item.getModel(); + + typeof onClick === 'function' && onClick(id, type, model.data, model, item, evt); + }, [onClick]); + + return ( +
+ + + + + + + + {/* */} + +
+ ); +}; + +export default GraphView; diff --git a/hugegraph-hubble/hubble-fe/src/components/IconSelect/index.js b/hugegraph-hubble/hubble-fe/src/components/IconSelect/index.js new file mode 100644 index 000000000..1a6cdef8c --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/IconSelect/index.js @@ -0,0 +1,107 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import React, {useEffect, useMemo, useState} from 'react'; +import * as AntIcon from '@ant-design/icons'; +import {Popover, Input} from 'antd'; +import classnames from 'classnames'; + +import {iconsMap} from '../../utils/constants'; + +import c from './index.module.scss'; +import {useTranslation} from 'react-i18next'; + +const DEFAULT_ICON = 'UserOutlined'; + +const IconSelect = props => { + const { + value, + onChange, + disabled, + } = props; + const {t} = useTranslation(); + const [icon, setIcon] = useState(); + + useEffect( + () => { + value && setIcon(value); + }, + [value] + ); + + const handleClickIconCallbacks = useMemo( + () => { + const icons = Object.keys(iconsMap); + const callbacks = {}; + for (const item of icons) { + callbacks[item] = () => { + setIcon(item); + onChange(item); + }; + } + return callbacks; + }, + [onChange] + ); + + const renderIcons = () => { + const icons = Object.keys(iconsMap); + return icons.map(item => { + const Icon = AntIcon[item]; + const iconClassName = classnames( + c.icon, + {[c.iconSelected]: item === icon} + ); + return ( +
+ +
+ ); + }); + }; + + if (disabled) { + return ( + + ); + } + + const CurrentIcon = AntIcon[icon || DEFAULT_ICON]; + return ( + {renderIcons()}
} + > + } + /> + + ); +}; + +export default IconSelect; diff --git a/hugegraph-hubble/hubble-fe/src/components/IconSelect/index.module.scss b/hugegraph-hubble/hubble-fe/src/components/IconSelect/index.module.scss new file mode 100644 index 000000000..0f0239bd5 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/IconSelect/index.module.scss @@ -0,0 +1,47 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.iconsWrapper { + width: 252px; + display: flex; + flex-wrap: wrap; + margin-right: -14px; + margin-bottom: -14px; + + .icon { + width: 28px; + height: 28px; + margin: 0 14px 14px 0; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + transition: all .3s; + border: 1px solid #999999; + + &:hover { + transform: scale(1.2); + } + } + + .iconSelected { + border: 1px solid #999999; + box-shadow: 0 0 5px 0 #999999; + } +} diff --git a/hugegraph-hubble/hubble-fe/src/components/ListButton/index.js b/hugegraph-hubble/hubble-fe/src/components/ListButton/index.js new file mode 100644 index 000000000..de4b89b74 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ListButton/index.js @@ -0,0 +1,39 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {useCallback} from 'react'; +import {Button} from 'antd'; + +const GraphspaceButton = ({data, current, onClick, children}) => { + const handleClick = useCallback(() => { + onClick(data); + }, [onClick, data]); + + return ( + + ); +}; + +export default GraphspaceButton; diff --git a/hugegraph-hubble/hubble-fe/src/components/SelectUser/index.js b/hugegraph-hubble/hubble-fe/src/components/SelectUser/index.js new file mode 100644 index 000000000..7a76b31bd --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/SelectUser/index.js @@ -0,0 +1,72 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +// import {useState, useCallback} from 'react'; +// import {Select, List, Avatar} from 'antd'; +// import * as api from '../../api'; +// TODO REMOVE IT +// const SelectUser = props => { +// const [userList, setUserList] = useState([]); +// +// const handleAdmins = useCallback(val => { +// if (val === '') { +// setUserList([]); +// return; +// } +// +// api.auth.getUUapList({username: val}).then(res => { +// if (res.status === 200) { +// setUserList(res.data); +// } +// else { +// setUserList([]); +// } +// }); +// }, []); +// +// +// return ( +// +// ); +// }; +// +// export default SelectUser; diff --git a/hugegraph-hubble/hubble-fe/src/components/Sidebar/index.ant.js b/hugegraph-hubble/hubble-fe/src/components/Sidebar/index.ant.js new file mode 100644 index 000000000..4a5c877f3 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/Sidebar/index.ant.js @@ -0,0 +1,124 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import React, {useState} from 'react'; +import {Layout, Menu} from 'antd'; +import { + HomeOutlined, + DatabaseOutlined, + AlertOutlined, + FundViewOutlined, + MenuUnfoldOutlined, + MenuFoldOutlined, +} from '@ant-design/icons'; +import {Link, useLocation} from 'react-router-dom'; +import * as user from '../../utils/user'; +import {isPdEnabled} from '../../utils/config'; +import {useTranslation} from 'react-i18next'; + +const items = t => { + const userInfo = user.getUser(); + const pdMode = isPdEnabled(); + const MY = {label: {t('home.my')}, key: 'my'}; + const ACCOUNT = {label: {t('home.account')}, key: 'account'}; + const RESOURCE = {label: {t('home.resource')}, key: 'resource'}; + const ROLE = {label: {t('home.role')}, key: 'role'}; + + // TODO temporary hided the resource and role modules + let systemList = [MY]; + if (userInfo.is_superadmin) { + // systemList = [MY, ACCOUNT, RESOURCE, ROLE]; + systemList = [MY, ACCOUNT]; + } + else if (userInfo.resSpaces && userInfo.resSpaces.length > 0) { + // systemList = [MY, RESOURCE, ROLE]; + systemList = [MY, ACCOUNT]; + } + + // Dynamic manage menu based on deployment mode + const manageChildren = pdMode + ? [ + {label: {t('manage.graphspace')}, key: 'graphspace'}, + {label: {t('manage.source')}, key: 'source'}, + {label: {t('manage.task')}, key: 'task'}, + ] + : [ + {label: 图管理, key: 'graph'}, + ]; + + const menu = [ + { + label: {t('navigation.name')}, + key: 'navigation', + icon: , + }, + { + label: t('manage.name'), + key: 'manage', + icon: , + children: manageChildren, + }, + { + label: t('analysis.name'), + key: 'analysis', + icon: , + children: [ + {label: {t('analysis.query.name')}, key: 'gremlin'}, + {label: {t('analysis.algorithm.name')}, key: 'algorithms'}, + {label: {t('analysis.async_task.name')}, key: 'asyncTasks'}, + ], + }, + { + label: t('home.name'), + key: 'system', + icon: , + children: [...systemList], + }, + ]; + + return menu; +}; + +const Sidebar = () => { + const [collapsed, setCollapsed] = useState(false); + const href = useLocation(); + const {t} = useTranslation(); + const menuKey = href.pathname.split('/')[1] || 'navigation'; + + return ( + setCollapsed(value)} + theme='light' + trigger={ + collapsed ? : + } + > +
+ + ); +}; + +export default Sidebar; diff --git a/hugegraph-hubble/hubble-fe/src/components/Sidebar/index.module.scss b/hugegraph-hubble/hubble-fe/src/components/Sidebar/index.module.scss new file mode 100644 index 000000000..5cd099cf5 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/Sidebar/index.module.scss @@ -0,0 +1,21 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.trigger { + text-align: right; +} diff --git a/hugegraph-hubble/hubble-fe/src/components/SlideComponent/index.js b/hugegraph-hubble/hubble-fe/src/components/SlideComponent/index.js new file mode 100644 index 000000000..936b760bb --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/SlideComponent/index.js @@ -0,0 +1,45 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 图分析组件 slide组件 + * @author + */ + +import React from 'react'; +import {Slider} from 'antd'; +import c from './index.module.scss'; + +const SliderComponent = props => { + const {min, max, step, value, onChange} = props; + + return ( +
+ + {value || 0} +
+ ); +}; + +export default SliderComponent; diff --git a/hugegraph-hubble/hubble-fe/src/components/SlideComponent/index.module.scss b/hugegraph-hubble/hubble-fe/src/components/SlideComponent/index.module.scss new file mode 100644 index 000000000..a5e1b2e27 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/SlideComponent/index.module.scss @@ -0,0 +1,40 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.layoutSlider { + display: flex; + align-items: center; + + :global(.ant-slider-horizontal) { + width: 90%; + } + + :global(.ant-slider-handle) { + border: solid 2px #1990ff; + }; + + :global(.ant-slider-track) { + background-color: #1990ff; + + &:hover { + border: solid 2px #1990ff; + } + } +} + + diff --git a/hugegraph-hubble/hubble-fe/src/components/Status/index.js b/hugegraph-hubble/hubble-fe/src/components/Status/index.js new file mode 100644 index 000000000..cec93eef3 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/Status/index.js @@ -0,0 +1,69 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {useCallback} from 'react'; +import style from './index.module.scss'; +import {useTranslation} from 'react-i18next'; + +const StatusField = ({status}) => { + const {t} = useTranslation(); + const lower = status ? status.toLowerCase() : 'undefined'; + const config = { + new: t('common.status.new'), + running: t('common.status.running'), + success: t('common.status.success'), + cancelling: t('common.status.cancelling'), + cancelled: t('common.status.cancelled'), + failed: t('common.status.failed'), + undefined: t('common.status.undefined'), + }; + + return ( + + {config[lower] ? config[lower] : status} + + ); +}; + +const StatusA = ({onClick, disable, children}) => { + + return ( +
+ {children} + + ); +}; + +const StatusText = ({onClick, data, disable, children}) => { + const handleClick = useCallback(() => { + onClick(data); + }, [onClick, data]); + + return ( + disable ? ( + {children} + ) : ( + {children} + ) + ); +}; + +export {StatusField, StatusA, StatusText}; diff --git a/hugegraph-hubble/hubble-fe/src/components/Status/index.module.scss b/hugegraph-hubble/hubble-fe/src/components/Status/index.module.scss new file mode 100644 index 000000000..35c28ecb0 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/Status/index.module.scss @@ -0,0 +1,44 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.state { + border-radius: 10px; + padding: 2px 10px; + color: #2f54eb; + background-color: #d6e4ff; + font-size: 10px; + + &.new, &.cancelling, &.cancelled { + color: #ad6800; + background-color: #fff1b8; + } + + &.failed { + color: #cf1322; + background-color: #ffccc7; + } + + &.success { + color: #3f6600; + background-color: #d9f7be; + } +} + +.disable, a.disable:hover { + color: #8c8c8c; +} diff --git a/hugegraph-hubble/hubble-fe/src/components/TableHeader/index.js b/hugegraph-hubble/hubble-fe/src/components/TableHeader/index.js new file mode 100644 index 000000000..0fdf24cd8 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/TableHeader/index.js @@ -0,0 +1,29 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import style from './index.module.scss'; + +const TableHeader = ({children}) => { + return ( +
+ {children} +
+ ); +}; + +export default TableHeader; diff --git a/hugegraph-hubble/hubble-fe/src/components/TableHeader/index.module.scss b/hugegraph-hubble/hubble-fe/src/components/TableHeader/index.module.scss new file mode 100644 index 000000000..7bea8f54e --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/TableHeader/index.module.scss @@ -0,0 +1,21 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.header { + margin: 6px 0 16px; +} diff --git a/hugegraph-hubble/hubble-fe/src/components/Topbar/index.ant.js b/hugegraph-hubble/hubble-fe/src/components/Topbar/index.ant.js new file mode 100644 index 000000000..67a36b875 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/Topbar/index.ant.js @@ -0,0 +1,97 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {Layout, Space, Avatar, Dropdown, Menu, message, Modal, Select} from 'antd'; +import {UserOutlined} from '@ant-design/icons'; +import style from './index.module.scss'; +import Logo from '../../assets/logo.png'; +import {useNavigate, useLocation} from 'react-router-dom'; +import * as api from '../../api/index'; +import * as user from '../../utils/user'; +import {useState} from 'react'; +import {useTranslation} from 'react-i18next'; + +const {Option} = Select; + +const Topbar = () => { + const userInfo = user.getUser(); + const navigate = useNavigate(); + const location = useLocation(); + const {t} = useTranslation(); + const [languageType, setLanguageType] = useState(localStorage.getItem('languageType') || 'zh-CN'); + + if (!userInfo || !userInfo.id) { + sessionStorage.setItem('redirect', `${location.pathname}${location.search}`); + window.location.href = '/login'; + } + + const i18Change = e => { + localStorage.setItem('languageType', e); + setLanguageType(e); + window.location.reload(); + }; + + const logout = () => { + + api.auth.logout().then(res => { + if (res.status === 200) { + sessionStorage.removeItem('redirect'); + user.clearUser(); + message.success(t('Topbar.exit.success')); + navigate('/login'); + } + }); + }; + + const confirm = () => { + Modal.confirm({ + title: t('Topbar.exit.confirm'), + okText: t('common.verify.ok'), + cancelText: t('common.verify.cancel'), + onOk: logout, + }); + }; + + return ( + +
+
+ + {t('Topbar.exit.name')}}]} + />} + > + + } /> + {userInfo?.user_nickname ?? ''} + + +
+
+ ); +}; + +export default Topbar; diff --git a/hugegraph-hubble/hubble-fe/src/components/Topbar/index.module.scss b/hugegraph-hubble/hubble-fe/src/components/Topbar/index.module.scss new file mode 100644 index 000000000..cd18cb4d1 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/Topbar/index.module.scss @@ -0,0 +1,51 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +div.nav { + background-color: #121212; + :global(.one-ui-pro-nav-profile) { + span, svg { + color: #fff; + } + + &:hover { + span, svg { + color: #0066ff; + } + } + } +} + +.logo { + float: left; + width: 120px; + height: 31px; +} + +.rightContainer { + display: flex; + align-items: center; + float: right; + color: #fff; + cursor: pointer; +} + +.right { + margin-left: 10px; +} + diff --git a/hugegraph-hubble/hubble-fe/src/customHook/useCustomEdge.js b/hugegraph-hubble/hubble-fe/src/customHook/useCustomEdge.js new file mode 100644 index 000000000..d1a2c6759 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/customHook/useCustomEdge.js @@ -0,0 +1,68 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 自定义边 + * @author + */ + +import G6 from '@antv/g6'; +import {useEffect} from 'react'; + +const options = { + afterDraw(cfg, group) { + const shape = group.get('children')[0]; + const startPoint = shape.getPoint(0); + const circle = group.addShape('circle', { + attrs: { + x: startPoint.x, + y: startPoint.y, + fill: cfg.style.stroke, + r: 3, + }, + name: 'circle-shape', + }); + circle.animate( + ratio => { + const tmpPoint = shape.getPoint(ratio); + return { + x: tmpPoint.x, + y: tmpPoint.y, + }; + }, + { + repeat: true, // Whether executes the animation repeatly + duration: 3000, // the duration for executing once + } + ); + }, + update: undefined, +}; + +const useCustomEdge = () => { + useEffect( + () => { + G6.registerEdge('runningLine', options, 'line'); + G6.registerEdge('runningQuadratic', options, 'quadratic'); + G6.registerEdge('runningLoop', options, 'loop'); + }, + [] + ); +}; + +export default useCustomEdge; diff --git a/hugegraph-hubble/hubble-fe/src/customHook/useCustomGrid.js b/hugegraph-hubble/hubble-fe/src/customHook/useCustomGrid.js new file mode 100644 index 000000000..1caf8b15c --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/customHook/useCustomGrid.js @@ -0,0 +1,303 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 自定义网格布局 + * @author + */ + +import _ from 'lodash'; +import G6 from '@antv/g6'; +import {useEffect} from 'react'; + +const options = { + small(val) { + const self = this; + let res; + const rows = self.rows; + const cols = self.cols; + if (val == null) { + res = Math.min(rows, cols); + } + else { + const min = Math.min(rows, cols); + if (min === self.rows) { + self.rows = val; + } + else { + self.cols = val; + } + } + return res; + }, + + large(val) { + const self = this; + let res; + const rows = self.rows; + const cols = self.cols; + if (val == null) { + res = Math.max(rows, cols); + } + else { + const max = Math.max(rows, cols); + if (max === self.rows) { + self.rows = val; + } + else { + self.cols = val; + } + } + return res; + }, + + used(row, col) { + const self = this; + return self.cellUsed[`c-${row}-${col}`] || false; + }, + + use(row, col) { + const self = this; + self.cellUsed[`c-${row}-${col}`] = true; + }, + + // 依次排完一行后,再往下排 ,固定列数 + moveToNextCell() { + const self = this; + + const cols = self.cols || 5; + self.col++; + if (self.col >= cols) { + self.col = 0; + self.row++; + } + + }, + + // 依次排完一列后,再往右排,固定行数 + moveToNextRow() { + const self = this; + const rows = self.rows || 5; + self.row++; + if (self.row >= rows) { + self.row = 0; + self.col++; + } + }, + + getPos(node) { + const self = this; + const begin = [0, 0]; + const cellWidth = self.cellWidth; + const cellHeight = self.cellHeight; + let x; + let y; + + const rcPos = self.id2manPos[node.id]; + if (rcPos) { + x = rcPos.col * cellWidth + cellWidth / 2 + begin[0]; + y = rcPos.row * cellHeight + cellHeight / 2 + begin[1]; + } + else { + + while (self.used(self.row, self.col)) { + if (self.cols > self.rows) { + self.moveToNextCell(); + } + else { + self.moveToNextRow(); + } + } + + x = self.col * cellWidth + cellWidth / 2 + begin[0]; + y = self.row * cellHeight + cellHeight / 2 + begin[1]; + self.use(self.row, self.col); + if (self.cols > self.rows) { + self.moveToNextCell(); + } + else { + self.moveToNextRow(); + } + } + node.x = x; + node.y = y; + }, + + /** + * 执行布局 + */ + execute() { + const self = this; + + const nodes = self.nodes; + const n = nodes.length; + const center = self.center; + const preventOverlap = true; + if (n === 0) { + return; + } + if (n === 1) { + nodes[0].x = center[0]; + nodes[0].y = center[1]; + return; + } + + const edges = self.edges; + const layoutNodes = []; + nodes.forEach(node => { + layoutNodes.push(node); + }); + const nodeIdxMap = {}; + layoutNodes.forEach((node, i) => { + nodeIdxMap[node.id] = i; + }); + // .......其他排序 + // 排序 + layoutNodes.sort((n1, n2) => n2 - n1); + + if (!self.width && typeof window !== 'undefined') { + self.width = window.innerWidth; + } + if (!self.height && typeof window !== 'undefined') { + self.height = window.innerHeight; + } + + const oRows = self.rows; + const oCols = self.cols != null ? self.cols : self.columns; + self.cells = n; + + // if rows or columns were set in self, use those values + if (oRows != null && oCols != null) { + self.rows = oRows; + self.cols = oCols; + } + else if (oRows != null && oCols == null) { + self.rows = oRows; + self.cols = Math.ceil(self.cells / self.rows); + } + else if (oRows == null && oCols != null) { + self.cols = oCols; + self.rows = Math.ceil(self.cells / self.cols); + } + else { + self.splits = Math.sqrt((self.cells * self.height) / self.width); + self.rows = Math.round(self.splits); + self.cols = Math.round((self.width / self.height) * self.splits); + } + + self.cellWidth = self.width / self.cols; + self.cellHeight = self.height / self.rows; + + if (self.condense) { + self.cellWidth = 0; + self.cellHeight = 0; + } + + if (preventOverlap) { + layoutNodes.forEach(node => { + if (!node.x || !node.y) { + node.x = 0; + node.y = 0; + } + + let nodew; + let nodeh; + if (_.isArray(node.size)) { + nodew = node.size[0]; + nodeh = node.size[1]; + } + else if (_.isNumber(node.size)) { + nodew = node.size; + nodeh = node.size; + } + if (nodew === undefined || nodeh === undefined) { + if (_.isArray(self.nodeSize)) { + nodew = self.nodeSize[0]; + nodeh = self.nodeSize[1]; + } + else if (_.isNumber(self.nodeSize)) { + nodew = self.nodeSize; + nodeh = self.nodeSize; + } + else { + nodew = 30; + nodeh = 30; + } + } + + const p = 30; + + const w = nodew + p; + const h = nodeh + p; + + self.cellWidth = Math.max(self.cellWidth, w); + self.cellHeight = Math.max(self.cellHeight, h); + }); + } + + self.cellUsed = {}; // e.g. 'c-0-2' => true + + self.row = 0; + self.col = 0; + + self.id2manPos = {}; + for (let i = 0; i < layoutNodes.length; i++) { + const node = layoutNodes[i]; + let rcPos; + if (self.position) { + rcPos = self.position(node); + } + + if (rcPos && (rcPos.row !== undefined || rcPos.col !== undefined)) { + const pos = { + row: rcPos.row, + col: rcPos.col, + }; + + if (pos.col === undefined) { + pos.col = 0; + while (self.used(pos.row, pos.col)) { + pos.col++; + } + } + else if (pos.row === undefined) { + pos.row = 0; + + while (self.used(pos.row, pos.col)) { + pos.row++; + } + } + + self.id2manPos[node.id] = pos; + self.use(pos.row, pos.col); + } + self.getPos(node); + } + }, +}; + +const useCustomGrid = () => { + useEffect( + () => { + G6.registerLayout('customGrid', options); + }, + [] + ); +}; + +export default useCustomGrid; diff --git a/hugegraph-hubble/hubble-fe/src/customHook/useCustomNode.js b/hugegraph-hubble/hubble-fe/src/customHook/useCustomNode.js new file mode 100644 index 000000000..90117d3c0 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/customHook/useCustomNode.js @@ -0,0 +1,177 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 自定义节点 + * @author + */ + +import icons from '../utils/graph'; +import G6 from '@antv/g6'; +import {useEffect} from 'react'; + +const getBadgePosition = (size, type) => { + let badgeX = 0; + let badgeY = 0; + if (type === 'circle') { + const r = size / 2; + badgeX = r * Math.cos((Math.PI * 7) / 4); + badgeY = -r * Math.sin((Math.PI * 7) / 4); + } + else if (type === 'diamond') { + const r = size / 2; + badgeX = r / 2; + badgeY = r / 2; + } + else if (type === 'triangle') { + const r = size; + badgeX = r * Math.cos((Math.PI) / 6); + badgeY = r - 5; + } + else if (type === 'star') { + const r = size / 2; + badgeX = r; + badgeY = 1.39 * r; + } + else if (type === 'ellipse') { + badgeX = size[0] / 4; + badgeY = size[1] / 3; + } + return { + x: badgeX, + y: badgeY, + }; +}; + +const drawBadge = (group, size, type) => { + const [width, height] = [10, 10]; + const {x: badgeX, y: badgeY} = getBadgePosition(size, type); + if (width === height) { + const shape = { + attrs: { + r: 5, + fill: 'grey', + x: badgeX, + y: badgeY, + }, + name: 'badges-circle', + id: 'badges-circle', + }; + group.addShape('circle', shape); + } + group.addShape('text', { + attrs: { + x: badgeX, + y: badgeY, + fontFamily: 'graphin', + text: icons.pushpin, + textAlign: 'center', + textBaseline: 'middle', + fontSize: 8, + color: '#fff', + fill: '#fff', + }, + capture: false, + name: 'badges-text', + id: 'badges-text', + }); +}; + +const removeBadge = group => { + const a = group.findById('badges-circle'); + group.removeChild(a); + const b = group.findById('badges-text'); + group.removeChild(b); +}; + +const options = { + setState(name, value, item) { + if (!name) { + return; + } + const group = item.getContainer(); + const groupChildren = group?.get('children'); + if (groupChildren) { + const shape = group?.get('children')[0]; + const model = item.getModel(); + const {stateStyles = {}, size, type} = model; + const currentStateStyle = stateStyles[name] || ''; + const status = item._cfg?.states || []; + if (value) { + Object.entries(currentStateStyle).forEach( + item => { + shape.attr(item[0], item[1]); + } + ); + // 固定节点增加样式 + if (name === 'customFixed') { + // 如果有icon就不添加 + const badgeGroup = group.findById('badges-circle'); + if (badgeGroup == null) { + drawBadge(group, size, type); + } + } + } + else { + if (name === 'customFixed') { + removeBadge(group); + } + Object.entries(currentStateStyle).forEach( + item => { + const [key] = item; + shape.attr(key, model.style[key]); + } + ); + // 如果有其他状态 设置过去; + if (status.length > 0) { + status.forEach(key => { + const currentStateStyle = stateStyles[key] || {}; + Object.entries(currentStateStyle).forEach( + item => { + shape.attr(item[0], item[1]); + } + ); + if (name === 'customFixed') { + // 如果有icon就不添加 + const badgeGroup = group.findById('badges-circle'); + if (badgeGroup == null) { + drawBadge(group, size, type); + } + } + } + ); + } + } + } + }, +}; + +const useCustomNode = () => { + useEffect( + () => { + G6.registerNode('circle', options, 'circle'); + G6.registerNode('diamond', options, 'diamond'); + G6.registerNode('triangle', options, 'triangle'); + G6.registerNode('star', options, 'star'); + G6.registerNode('ellipse', options, 'ellipse'); + }, + [] + ); +}; + +export default useCustomNode; diff --git a/hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.js b/hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.js new file mode 100644 index 000000000..73afa75be --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.js @@ -0,0 +1,42 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 下载Json数据 + * @author + */ + +const useDownloadJson = () => { + + const downloadJsonHandler = (fileName, data) => { + const formatedFileName = fileName.split('.').join(''); + let element = document.createElement('a'); + const processedData = JSON.stringify(data); + element.setAttribute('href', + `data:application/json;charset=utf-8,\ufeff${encodeURIComponent(processedData)}`); + element.setAttribute('download', formatedFileName); + element.style.display = 'none'; + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); + }; + + return {downloadJsonHandler}; +}; + +export default useDownloadJson; diff --git a/hugegraph-hubble/hubble-fe/src/i18n/index.js b/hugegraph-hubble/hubble-fe/src/i18n/index.js new file mode 100644 index 000000000..ae40a915e --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/index.js @@ -0,0 +1,38 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import i18n from 'i18next'; +import {initReactI18next} from 'react-i18next'; + +import {zhCNResources, enUSResources} from './resources'; + +i18n.use(initReactI18next).init({ + lng: localStorage.getItem('languageType') || 'zh-CN', + fallbackLng: 'zh-CN', + + resources: { + 'zh-CN': zhCNResources, + 'en-US': enUSResources, + }, + + interpolation: { + escapeValue: false, // not needed for react as it escapes by default + }, +}); + +export default i18n; diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/ERView.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/ERView.json new file mode 100644 index 000000000..897821193 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/ERView.json @@ -0,0 +1,30 @@ +{ + "ERView": { + "edge": { + "name": "Edge", + "type": "Edge Type", + "start": "Source ID", + "end": "Target ID", + "create": "Add Edge", + "e1name": "Edge 1", + "e2name": "Edge 2", + "out": "Outgoing", + "in": "Incoming", + "both": "Both" + }, + "vertex": { + "name": "Vertex", + "type": "Vertex Type", + "create": "Add Vertex", + "v1name": "Vertex 1", + "v2name": "Vertex 2" + }, + "control": { + "zoom_in": "Zoom In", + "zoom_out": "Zoom Out", + "undo": "Undo", + "redo": "Redo", + "auto_map": "Auto Map" + } + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/board.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/board.json new file mode 100644 index 000000000..a9b7d5062 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/board.json @@ -0,0 +1,15 @@ +{ + "Topbar": { + "exit":{ + "name": "Log Out", + "confirm":"Confirm log out?", + "success":"Logged out successfully" + } + }, + "selector": { + "placeholder": "Please select" + }, + "navigation": { + "name": "Navigation" + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/common.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/common.json new file mode 100644 index 000000000..0a3a6137c --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/common.json @@ -0,0 +1,19 @@ +{ + "common" : { + "verify" : { + "ok": "OK", + "cancel": "Cancel", + "yes": "Yes", + "no": "No" + }, + "status": { + "new": "New", + "running": "Running", + "success": "Completed", + "cancelling": "Stopping", + "cancelled": "Stopped", + "failed": "Failed", + "undefined": "Unknown" + } + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/index.js b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/index.js new file mode 100644 index 000000000..30ff1ae6f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/index.js @@ -0,0 +1,26 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import Common from './common.json'; +import Board from './board.json'; +import ERView from './ERView.json'; +export { + Common, + Board, + ERView, +}; diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/index.js b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/index.js new file mode 100644 index 000000000..55af6087b --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/index.js @@ -0,0 +1,46 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {merge} from 'lodash-es'; +import { + Board, + Common, + ERView, +} from './components'; +import { + Home, + Manage, + Analysis, + Modules, + Pages, +} from './modules'; + +const translation = { + translation: merge( + Board, + Common, + Home, + Manage, + ERView, + Analysis, + Modules, + Pages + ), +}; + +export default translation; diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/analysis.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/analysis.json new file mode 100644 index 000000000..8c28569ff --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/analysis.json @@ -0,0 +1,192 @@ +{ + "analysis": { + "name": "Business Analysis", + "query": { + "name": "Graph Query", + "placeholder": "Enter a query statement" + }, + "algorithm": { + "name": "Graph Algorithm", + "placeholder": "Algorithm Query", + "common": { + "instance_num": "Instance Count", + "input_limit_edges_per_vertex": "Max Outgoing Edges", + "max_iter_step": "Max Iterations", + "worker_num": "Worker Threads", + "sample_rate": "Edge sample rate. This algorithm grows exponentially and requires high compute capacity, so choose a practical sample rate for an approximate result.", + "weight_property": "Weight Property Name", + "property_filter": "Vertex/Edge Property Filter", + "min_ring_length": "Minimum ring length to output", + "max_ring_length": "Maximum ring length to output", + "max_step": "Max Iteration Steps", + "request_memory": "Minimum Memory Required per Compute Node", + "JVM_memory": "JVM memory size, 32 GB by default", + "source": "Source Vertex ID", + "query_tooltip": "OLAP algorithms can be used only after the selected graph data is loaded." + }, + "mode": { + "OLTP": "OLTP Algorithm", + "OLAP": "OLAP Algorithm" + }, + "capacity_item": { + "tooltip": "Maximum number of vertices visited during traversal" + }, + "direction_item": { + "tooltip": "Traversal direction from the vertex" + }, + "label_item": { + "tooltip": "Edge type. Leave empty to include all edge labels." + }, + "max_degree_item": { + "tooltip": "Maximum adjacent edges traversed from a single vertex during the query" + }, + "max_depth_item": { + "tooltip": "Number of steps" + }, + "nearest_item": { + "tooltip": "When nearest is true, the shortest path length from the source vertex to the result vertex is depth and no shorter path exists. When nearest is false, there is a path with length depth from the source vertex to the result vertex, but it may not be shortest and may contain cycles.", + "placeholder": "Shortest path length" + }, + "olap": { + "betweenness_centrality": { + "desc": "Betweenness Centrality estimates how likely a node is to act as a bridge on paths between other nodes. Higher values indicate stronger bridge behavior, such as common followed accounts in a social network.", + "sample_rate": "Edge Sample Rate", + "sample_rate_long": "Edge sample rate. This algorithm grows exponentially and requires high compute capacity, so choose a practical sample rate for an approximate result.", + "use_endpoint": "Include the last vertex in computation" + }, + "closeness_centrality": { + "desc": "Computes the reciprocal of the shortest distance from a node to all other reachable nodes, accumulates the values, and normalizes the result. It is used to calculate closeness centrality for each node and supports directed and undirected graphs.", + "weight_property": "Weight Property Name", + "sample_rate": "Edge Sample Rate", + "wf_improved": "Use the Wasserman and Faust closeness centrality formula" + }, + "cluster_coefficient": { + "desc": "Clustering coefficient computes the local clustering coefficient for each vertex. Global clustering coefficient is not available yet.", + "minimum_edges_use_superedge_cache": "Use memory to reduce message volume. If memory is insufficient, change 100 to 1000, but the clustering coefficient job may not complete." + }, + "degree_centrality": { + "desc": "Computes degree centrality for each node and supports directed and undirected graphs.", + "direction": "Direction: in/out/both for incoming, outgoing, or both directions" + }, + "filtered_rings_detection": { + "desc": "Filtered Rings Detection detects rings in the graph. Each ring path is recorded by the vertex with the smallest ID in the ring. Vertex and edge property filters can be specified to selectively propagate paths." + }, + "filter_subgraph_matching": { + "desc": "Filter Subgraph Matching accepts a query graph with property filters and matches all subgraphs that are isomorphic to the query graph.", + "query_graph_config": "Query graph configuration as a JSON array string" + }, + "k_core": { + "desc": "K-Core marks all vertices whose degree is K.", + "k": "K value for the K-Core algorithm. Optional, with a default value.", + "degree_k": "Minimum degree threshold" + }, + "label_propagation_algorithm": { + "desc": "Label Propagation Algorithm is a graph clustering algorithm commonly used in social networks." + }, + "links": { + "desc": "Links tracing starts from a set of source vertices, propagates according to specified rules, stops when the end condition is met, and records the resulting paths.", + "analyze_config": "Link propagation condition configuration" + }, + "louvain": { + "desc": "Louvain is a modularity-based community detection algorithm. Because of its algorithm characteristics, it runs with only one worker instance." + }, + "computer_item": { + "computer_cpu": "Master Max CPU", + "worker_cpu": "Worker Max CPU", + "master_request_memory": "Master Minimum Memory. Allocation fails if the minimum is not met.", + "worker_request_memory": "Worker Minimum Memory. Allocation fails if the minimum is not met.", + "master_memory": "Master Max Memory. The task is terminated by Kubernetes if this limit is exceeded.", + "worker_memory": "Worker Max Memory. The task is terminated by Kubernetes if this limit is exceeded." + }, + "item": { + "PAGE_RANK": "PageRank", + "WEAKLY_CONNECTED_COMPONENT": "Weakly Connected Component", + "DEGREE_CENTRALIT": "Degree Centrality", + "CLOSENESS_CENTRALITY": "Closeness Centrality", + "TRIANGLE_COUNT": "Triangle Count", + "K_NEIGHBOR": "K-neighbor (GET, Basic)", + "K_OUT": "K-out API (GET, Basic)", + "SAME_NEIGHBORS": "Same Neighbors", + "RINGS": "Rings", + "SHORTEST_PATH": "Shortest Path", + "ALLPATHS": "Find All Paths (POST, Advanced)", + "JACCARD_SIMILARITY": "Jaccard Similarity (GET)", + "CROSSPOINTS": "Crosspoints", + "RINGS_DETECTION": "Rings Detection", + "FILTERED_RINGS_DETECTION": "Filtered Rings Detection", + "LINKS": "Links", + "CLUSTER_COEFFICIENT": "Cluster Coefficient", + "BETWEENNESS_CENTRALITY": "Betweenness Centrality", + "LABEL_PROPAGATION_ALGORITHM": "Label Propagation Algorithm", + "LOUVAIN": "Louvain", + "FILTER_SUBGRAPH_MATCHING": "Filter SubGraph Matching", + "K_CORE": "K-Core", + "PERSONAL_PAGE_RANK": "PersonalPageRank", + "KOUT_POST": "K-out API (POST, Advanced)", + "KNEIGHBOR_POST": "K-neighbor API (POST, Advanced)", + "JACCARD_SIMILARITY_POST": "Jaccard Similarity (POST)", + "RANK_API": "rank API", + "NEIGHBOR_RANK_API": "Neighbor Rank API", + "FINDSHORTESTPATH": "Find Shortest Path", + "FINDSHORTESTPATHWITHWEIGHT": "Find Weighted Shortest Path", + "SINGLESOURCESHORTESTPATH": "Find Shortest Paths from One Vertex", + "MULTINODESSHORTESTPATH": "Find Shortest Paths for Specified Vertices", + "CUSTOMIZEDPATHS": "Customized Path Query", + "TEMPLATEPATHS": "Template Path Query", + "CUSTOMIZED_CROSSPOINTS": "Customized Crosspoints", + "RAYS": "Rays", + "PATHS": "Find All Paths (GET, Basic)", + "FUSIFORM_SIMILARITY": "Fusiform Similarity", + "ADAMIC_ADAR": "Adamic Adar", + "RESOURCE_ALLOCATION": "Resource Allocation", + "SAME_NEIGHBORS_BATCH": "Same Neighbors Batch", + "EGONET": "Egonet", + "SSSP": "SSSP (Single Source Shortest Path)" + }, + "page_rank": { + "desc": "PageRank ranks web pages or graph nodes by computing relationships through links, reflecting node relevance and importance.", + "alpha": "Weight coefficient, also known as damping factor", + "l1": "Convergence precision. It is the upper bound of the accumulated absolute changes between two iterations. The algorithm stops when the value is below this threshold.", + "damping": "Damping factor, the percentage propagated to the next node", + "diff": "Convergence precision. It is the upper bound of the accumulated absolute changes between two iterations. The algorithm stops when the value is below this threshold." + }, + "personal_page_bank": { + "desc": "PersonalPageRank is a personalized recommendation algorithm that computes relevance and importance from links between pages or graph nodes.", + "source": "Source Vertex", + "alpha": "Weight coefficient, also known as damping factor", + "l1": "Convergence Precision", + "use_id_fixlength": "When true, the system uses auto-increment ID calculation", + "use_id_fixlength_query": "Whether to use auto-increment ID calculation" + }, + "ring_detection": { + "desc": "Rings Detection detects rings in the graph. Each ring path is recorded by the vertex with the smallest ID in the ring." + }, + "SSSPVermeer": { + "desc": "Single Source Shortest Path computes the shortest distance from one vertex to all other vertices." + }, + "triangle_count": { + "desc": "Triangle Count computes the number of triangles that each vertex participates in.", + "limit_edges_in_one_vertex": "Max Outgoing Edges", + "minimum_edges_use_superedge_cache": "Use memory to reduce message volume. If memory is insufficient, change 100 to 1000, but the triangle count job may not complete." + }, + "weakly_connected_component": { + "desc": "Weakly Connected Component computes all connected subgraphs in an undirected graph and outputs the weakly connected component ID for each vertex." + } + }, + "oltp": { + "adamic_adar": { + "desc": "Adamic-Adar is commonly used in social networks to estimate how closely two vertices are related based on the density of their common neighbors.", + "vertex": "Source Vertex", + "other": "Target Vertex", + "direction": "Direction from the source vertex to the target vertex. The reverse direction is target to source. BOTH ignores direction.", + "label": "Leave empty to include all edge labels", + "max_degree": "Maximum adjacent edges traversed from a single vertex during the query", + "select_direction": "Traversal direction from the vertex" + } + } + }, + "async_task": { + "name": "Task Management" + } + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/home.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/home.json new file mode 100644 index 000000000..b6a5f1991 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/home.json @@ -0,0 +1,9 @@ +{ + "home": { + "name":"System Management" , + "my": "My Profile", + "account": "Account Management", + "resource": "Resource Management", + "role": "Role Management" + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/index.js b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/index.js new file mode 100644 index 000000000..9155cab6f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/index.js @@ -0,0 +1,30 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import Home from './home.json'; +import Manage from './manage.json'; +import Analysis from './analysis.json'; +import Modules from './modules.json'; +import Pages from './pages.json'; +export { + Home, + Analysis, + Manage, + Modules, + Pages, +}; diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/manage.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/manage.json new file mode 100644 index 000000000..e23360658 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/manage.json @@ -0,0 +1,8 @@ +{ + "manage": { + "name": "Data Management", + "graphspace": "Graph Management", + "source": "Data Source Management", + "task": "Data Import" + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/modules.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/modules.json new file mode 100644 index 000000000..0986ecebd --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/modules.json @@ -0,0 +1,262 @@ +{ + "topbar": { + "current_graphspace": "Graph Space:", + "current_graph": "Graph:", + "graph_select_placeholder": "Please select", + "status": { + "loaded": "Loaded", + "loading": "Loading", + "error": "Load Failed", + "created": "Not Loaded" + }, + "last_load_time": "Last loaded:", + "reload_to_vermeer": "Reload to Vermeer", + "load_to_vermeer": "Load to Vermeer", + "meta_config": "Metadata Config", + "meta_config_tooltip": "Click to navigate to the metadata configuration page", + "olap_switch": "Query OLAP results:", + "olap_on": "On", + "olap_off": "Off", + "load_fail": "Failed to load Vermeer task" + }, + "execute_log": { + "col": { + "time": "Time", + "type": "Type", + "content": "Content", + "status": "Status", + "duration": "Duration", + "operation": "Actions" + }, + "type": { + "GREMLIN": "GREMLIN Query", + "GREMLIN_ASYNC": "GREMLIN Task", + "ALGORITHM": "Algorithm Task", + "CYPHER": "CYPHER Query" + }, + "status": { + "SUCCESS": "Success", + "ASYNC_TASK_SUCCESS": "Submitted", + "ASYNC_TASK_RUNNING": "Submitting", + "RUNNING": "Running", + "FAILED": "Failed", + "ASYNC_TASK_FAILED": "Submit Failed" + }, + "favorite": "Favorite", + "load_statement": "Load", + "favorite_title": "Favorite Statement", + "favorite_placeholder": "Enter favorite name" + }, + "favorite": { + "col": { + "name": "Name", + "content": "Content", + "create_time": "Saved At", + "operation": "Actions" + }, + "edit_title": "Edit Name", + "edit_placeholder": "Enter favorite name", + "load_statement": "Load", + "delete_confirm": "Confirm delete?", + "search_placeholder": "Search favorite name" + }, + "query_bar": { + "tab_execute": "Execution Log", + "tab_favorite": "Favorites", + "gremlin_placeholder": "Please enter a query statement", + "execute": "Execute", + "async_execute": "Async Execute", + "clear": "Clear" + }, + "query_result": { + "tab_graph": "Graph", + "tab_table": "Table", + "tab_json": "JSON", + "empty": "No results", + "vertex_count": "Vertices: {{count}}", + "edge_count": "Edges: {{count}}" + }, + "async_task": { + "col": { + "id": "Task ID", + "type": "Type", + "status": "Status", + "create_time": "Create Time", + "update_time": "Update Time", + "operation": "Actions" + }, + "detail": { + "title": "Task Detail", + "id": "Task ID", + "type": "Type", + "status": "Status", + "create_time": "Create Time", + "update_time": "Update Time", + "content": "Content", + "result": "Result" + }, + "cancel": "Cancel Task", + "cancel_confirm": "Confirm cancel this task?" + }, + "graph_component": { + "search": { + "placeholder": "Search vertex ID or property value", + "search_btn": "Search", + "vertex_id": "Vertex ID", + "property": "Property", + "result_count": "Found {{count}} results" + }, + "edit_element": { + "title_vertex": "Edit Vertex", + "title_edge": "Edit Edge", + "id": "ID", + "label": "Type", + "properties": "Properties", + "save": "Save", + "cancel": "Cancel", + "delete": "Delete" + }, + "export": { + "title": "Export Data", + "json": "Export JSON", + "csv": "Export CSV", + "image": "Export Image" + }, + "menu": { + "expand": "Expand", + "hide": "Hide", + "show_properties": "Show Properties", + "hide_properties": "Hide Properties", + "fix": "Pin", + "unfix": "Unpin" + }, + "status": { + "vertex_count": "Vertices: {{count}}", + "edge_count": "Edges: {{count}}" + }, + "clear": "Clear Graph", + "clear_confirm": "Confirm clear graph?", + "fit_center": "Fit Canvas", + "fix_node": "Pin Node", + "full_screen": "Fullscreen", + "zoom_in": "Zoom In", + "zoom_out": "Zoom Out", + "redo": "Redo", + "undo": "Undo", + "refresh": "Refresh", + "zero_degree": "Show Isolated Nodes", + "legend": "Legend", + "3d_mode": "3D Mode", + "2d_mode": "2D Mode" + }, + "filter": { + "title": "Filter", + "add": "Add Filter", + "vertex_filter": "Vertex Filter", + "edge_filter": "Edge Filter", + "property": "Property", + "operator": "Operator", + "value": "Value", + "apply": "Apply", + "reset": "Reset", + "and": "AND", + "or": "OR" + }, + "layout": { + "title": "Layout Config", + "type": "Layout Type", + "force": "Force", + "circular": "Circular", + "radial": "Radial", + "dagre": "Dagre", + "grid": "Grid", + "concentric": "Concentric", + "apply": "Apply", + "node_size": "Node Size", + "link_distance": "Link Distance", + "node_strength": "Node Strength", + "edge_strength": "Edge Strength", + "gravity": "Gravity", + "speed": "Speed", + "iterations": "Iterations", + "radius_ratio": "Radius Ratio", + "node_sep": "Node Spacing", + "rank_sep": "Rank Spacing", + "direction": "Direction", + "LR": "Left to Right", + "RL": "Right to Left", + "TB": "Top to Bottom", + "BT": "Bottom to Top", + "start_radius": "Start Radius", + "end_radius": "End Radius", + "sweep": "Sweep", + "equal_node_spacing": "Equal Spacing", + "min_node_spacing": "Min Spacing", + "start_angle": "Start Angle", + "clockwise": "Clockwise", + "prevent_overlap": "Prevent Overlap", + "node_spacing": "Node Spacing", + "cols": "Columns", + "rows": "Rows" + }, + "style_config": { + "title": "Style Config", + "vertex_style": "Vertex Style", + "edge_style": "Edge Style", + "color": "Color", + "size": "Size", + "label": "Label", + "icon": "Icon", + "line_type": "Line Type", + "line_width": "Line Width", + "arrow": "Arrow", + "display_field": "Display Field", + "apply": "Apply", + "reset": "Reset" + }, + "statistics": { + "title": "Graph Statistics", + "vertex_count": "Vertices", + "edge_count": "Edges", + "vertex_types": "Vertex Types", + "edge_types": "Edge Types", + "loading": "Loading..." + }, + "dynamic_add": { + "vertex": { + "title": "Add Vertex", + "id": "Vertex ID", + "type": "Vertex Type", + "properties": "Properties", + "submit": "Submit", + "cancel": "Cancel" + }, + "edge": { + "title": "Add Edge", + "type": "Edge Type", + "source": "Source", + "target": "Target", + "properties": "Properties", + "submit": "Submit", + "cancel": "Cancel" + } + }, + "navigation_module": { + "create_data": { + "title": "Create Data", + "graph_management": "Graph Management", + "meta_management": "Metadata Management", + "data_import": "Data Import" + }, + "analysis": { + "title": "Business Analysis", + "graph_query": "Graph Query", + "algorithm": "Graph Algorithm" + }, + "system": { + "title": "System Management", + "user_management": "User Management", + "role_management": "Role Management" + } + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json new file mode 100644 index 000000000..1b66a7676 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json @@ -0,0 +1,470 @@ +{ + "common": { + "action": { + "create": "Create", + "save": "Save", + "edit": "Edit", + "delete": "Delete", + "cancel": "Cancel", + "confirm": "Confirm", + "add": "Add", + "search": "Search", + "reset": "Reset", + "view": "View", + "detail": "Detail", + "upload": "Upload", + "download": "Download", + "refresh": "Refresh", + "submit": "Submit", + "back": "Back", + "close": "Close", + "apply": "Apply", + "assign_permission": "Assign Permission", + "set_default": "Set Default", + "schema_manage": "Schema Management", + "init": "Initialize", + "clone": "Clone" + }, + "label": { + "default": "Default", + "unlimited": "Unlimited", + "unknown": "Unknown", + "yes": "Yes", + "no": "No", + "view_mode": "Card View", + "list_mode": "List View", + "loading": "Loading..." + }, + "verify": { + "yes": "Yes", + "no": "No" + }, + "msg": { + "success": "Operation succeeded", + "create_success": "Created successfully", + "update_success": "Updated successfully", + "delete_success": "Deleted successfully", + "set_success": "Set successfully", + "init_success": "Initialized successfully", + "upload_success": "Uploaded successfully", + "upload_fail": "Upload failed", + "enable_success": "Started successfully", + "enable_fail": "Failed to start", + "disable_success": "Paused successfully", + "disable_fail": "Failed to pause", + "delete_fail": "Deletion failed", + "select_one": "Please select at least one item" + }, + "confirm": { + "delete": "Confirm delete?", + "delete_irrecoverable": "This action cannot be undone" + }, + "form": { + "required": "This field is required", + "max_12": "Max 12 characters", + "max_48": "Max 48 characters", + "max_128": "Max 128 characters" + } + }, + "graphspace": { + "title": "Graph Space Management", + "create": "Create Graph Space", + "search_placeholder": "Search by graph space name", + "set_default_confirm": "Confirm changing the default graph space?", + "delete_confirm": "Confirm delete?", + "delete_content": "This action cannot be undone", + "col": { + "name": "Name", + "auth": "Authentication", + "description": "Description", + "graph_service": "Graph Service", + "compute_task": "Compute Task", + "storage_limit": "Max Storage Limit", + "operation": "Actions" + }, + "auth_yes": "Yes", + "auth_no": "No", + "unit": { + "cpu": "vCPU", + "memory": "GB", + "unlimited": "Unlimited" + }, + "form": { + "title_edit": "Edit Graph Space", + "title_create": "Create Graph Space", + "id": "Graph Space ID", + "name": "Display Name", + "auth": "Enable Authentication", + "max_graph": "Max Graphs", + "max_role": "Max Roles", + "graph_service": "Graph Service:", + "compute_task": "Compute Task:", + "storage": "Storage Service:", + "cpu": "CPU Resources:", + "memory": "Memory Resources:", + "k8s_namespace": "K8s Namespace", + "operator_image": "Operator Image", + "algorithm_image": "Algorithm Image", + "storage_limit": "Max Storage Limit:", + "admin": "Space Admin", + "admin_placeholder": "Select space admin", + "description": "Description", + "description_placeholder": "Graph space description (optional)", + "cpu_placeholder": "vCPU", + "memory_placeholder": "GB", + "id_placeholder": "Start with a letter, lowercase letters/digits/underscore, max 48 chars", + "name_placeholder": "Letters, digits, underscore, max 12 chars", + "k8s_placeholder": "Start with a letter, lowercase letters/digits/hyphen, max 48 chars", + "image_format_error": "Please enter a valid image address (e.g. example.com/org_1/xx_img:1.0.0)", + "id_rule": "Start with a letter, lowercase letters/digits/underscore, max 48 chars", + "k8s_rule": "Start with a letter, lowercase letters/digits/hyphen, max 48 chars" + }, + "card": { + "enter": "Enter Graph Space", + "vertex": "Vertices", + "edge": "Edges", + "daily_update": "Updated daily", + "last_update": "Last updated: {{date}}", + "graph_id": "Graph ID: {{name}}", + "auth_label": "Auth: ", + "max_graph": "Max Graphs: ", + "cpu": "CPU: {{val}}", + "memory": "Memory: {{val}}", + "storage": "Max Storage: ", + "used": "Used: ", + "set_default": "Default Space", + "created": "created" + } + }, + "graph": { + "title": "Graph Management", + "create": "Create Graph", + "search_placeholder": "Search by graph name", + "col": { + "name": "Graph Name", + "auth": "Authentication", + "description": "Description", + "creator": "Creator", + "create_time": "Created At", + "operation": "Actions" + }, + "menu": { + "enter_analysis": "Open Graph Studio", + "meta_config": "Metadata Config", + "clear_schema_data": "Clear Schema & Data", + "clear_data": "Clear Data", + "set_default": "Set Default", + "view_schema": "View Schema", + "clone": "Clone Graph" + }, + "form": { + "title_create": "Create Graph", + "title_edit": "Edit Graph", + "name": "Graph ID", + "name_placeholder": "Lowercase letters, digits, underscore, max 48 chars", + "nickname": "Display Name", + "nickname_placeholder": "Letters, digits, underscore, max 12 chars", + "auth": "Enable Authentication", + "description": "Description", + "description_placeholder": "Graph description (optional)" + }, + "detail": { + "title": "Detail", + "name": "Graph Name", + "nickname": "Display Name", + "auth": "Authentication", + "graphspace": "Graph Space", + "creator": "Creator", + "create_time": "Created At", + "last_update": "Last Updated: ", + "update_data": "Update Data" + } + }, + "account": { + "title": "Account Management", + "create": "Create Account", + "delete_confirm": "Confirm deleting account {{name}}?", + "col": { + "id": "Account ID", + "name": "Account Name", + "remark": "Remark", + "resource": "Resource Permission", + "create_time": "Created At", + "is_superadmin": "Super Admin", + "permission": "Admin Permission" + }, + "form": { + "title_detail": "View Account", + "title_edit": "Edit Account", + "title_auth": "Assign Permission", + "title_create": "Create Account", + "id": "Account ID", + "id_placeholder": "Login username", + "name": "Display Name", + "name_placeholder": "Can be changed after creation", + "is_superadmin": "Super Admin", + "remark": "Remark", + "remark_placeholder": "Enter account remark", + "default_password": "Default Password", + "default_password_placeholder": "123456 (changeable in profile)", + "permission": "Admin Permission" + } + }, + "my": { + "title": "My Profile", + "col": { + "id": "Account ID", + "name": "Account Name", + "is_superadmin": "Super Admin", + "remark": "Remark", + "permission": "Admin Permission", + "create_time": "Created At" + }, + "edit": { + "title": "Change Password", + "old_password": "Old Password", + "new_password": "New Password", + "confirm_password": "Confirm Password" + } + }, + "role": { + "title": "Role Management", + "create": "Create Role", + "delete_confirm": "Confirm deleting role {{name}}?", + "col": { + "name": "Role Name", + "description": "Description", + "operation": "Actions" + }, + "form": { + "title_create": "Create Role", + "title_edit": "Edit Role", + "name": "Role Name", + "description": "Description", + "permissions": "Permissions" + }, + "auth": { + "title": "Assign Permission", + "graphspace": "Graph Space", + "graph": "Graph", + "permission": "Permission" + } + }, + "resource": { + "title": "Resource Management", + "create": "Create Resource", + "col": { + "name": "Resource Name", + "type": "Type", + "graphspace": "Graph Space", + "graph": "Graph", + "operation": "Actions" + }, + "form": { + "title_create": "Create Resource", + "title_edit": "Edit Resource", + "name": "Resource Name", + "type": "Resource Type", + "graphspace": "Graph Space", + "graph": "Graph" + } + }, + "task": { + "title": "Data Import", + "search_placeholder": "Search by task name", + "pause": "Pause", + "execute": "Run", + "edit_title_create": "Create Task", + "edit_title_edit": "Edit Task", + "col": { + "name": "Task Name", + "source_type": "Source Type", + "target_space": "Target Space", + "target_graph": "Target Graph", + "sync_type": "Sync Type", + "status": "Status", + "create_time": "Created At", + "operation": "Actions" + }, + "statistic": { + "total": "Total", + "running": "Running", + "success": "Completed", + "failed": "Failed" + }, + "detail": { + "title": "Task Detail", + "success": "Success", + "failed": "Failed", + "running": "Running" + }, + "view": { + "title": "View Task", + "name": "Task Name", + "source_type": "Source Type", + "target_space": "Target Space", + "target_graph": "Target Graph", + "sync_type": "Sync Type" + }, + "edit": { + "name": "Task Name", + "graphspace": "Graph Space", + "graph": "Graph", + "source": "Data Source", + "source_type": "Source Type", + "select_graphspace": "Select graph space", + "select_graph": "Select graph", + "select_source": "Select data source", + "select_source_type": "Select source type" + } + }, + "datasource": { + "title": "Data Source Management", + "create": "Add Data Source", + "search_placeholder": "Search by data source name", + "col": { + "name": "Name", + "type": "Type", + "host": "Host", + "port": "Port", + "username": "Username", + "operation": "Actions" + }, + "form": { + "upload": "Upload File", + "no_compress": "None" + } + }, + "schema": { + "title": "Metadata Management", + "tab": { + "property": "Property", + "vertex": "Vertex Type", + "edge": "Edge Type", + "vertex_index": "Vertex Index", + "edge_index": "Edge Index" + }, + "property": { + "create": "Create Property", + "col": { + "name": "Property Name", + "type": "Data Type", + "cardinality": "Cardinality", + "operation": "Actions" + }, + "form": { + "name": "Property Name: ", + "type": "Data Type: ", + "cardinality": "Cardinality: " + } + }, + "vertex": { + "create": "Create Vertex Type", + "delete_confirm": "Confirm deleting this vertex type?", + "delete_warning": "This action cannot be undone. Please proceed with caution.", + "delete_task_note": "Deleting metadata may take a while. Check Task Management for progress.", + "col": { + "name": "Vertex Type Name", + "id_strategy": "ID Strategy", + "properties": "Properties", + "primary_keys": "Primary Keys", + "label_index": "Label Index", + "property_index": "Property Index", + "operation": "Actions" + }, + "form": { + "title_create": "Create Vertex Type", + "title_edit": "Edit Vertex Type", + "name": "Vertex Type Name: ", + "id_strategy": "ID Strategy: ", + "style": "Vertex Style: ", + "display_fields": "Display Fields", + "label_index": "Label Index", + "property_index": "Property Index", + "properties": "Properties" + } + }, + "edge": { + "delete_confirm": "Confirm deleting this edge type?", + "delete_warning": "This action cannot be undone. Please proceed with caution.", + "delete_task_note": "Deleting metadata may take a while. Check Task Management for progress.", + "col": { + "name": "Edge Type Name", + "type": "Edge Type", + "source": "Source Type", + "target": "Target Type", + "properties": "Properties", + "sort_keys": "Sort Keys", + "label_index": "Label Index", + "property_index": "Property Index", + "operation": "Actions" + }, + "type": { + "NORMAL": "Normal", + "PARENT": "Parent", + "SUB": "Sub", + "parent_label": "Parent: " + }, + "form": { + "title_create": "Create Edge Type", + "title_edit": "Edit Edge Type", + "name": "Edge Type Name: ", + "type": "Type: ", + "type_normal": "Normal", + "type_parent": "Parent", + "type_sub": "Sub", + "parent": "Parent Edge Type: ", + "parent_placeholder": "Select parent edge", + "style": "Edge Style: ", + "source": "Source Type", + "target": "Target Type", + "multi_link": "Allow Multiple Links", + "properties": "Properties", + "sort_keys": "Sort Keys", + "display_fields": "Display Fields", + "label_index": "Label Index", + "property_index": "Property Index" + } + }, + "index": { + "vertex_title": "Vertex Index", + "edge_title": "Edge Index", + "create": "Create Index", + "col": { + "name": "Index Name", + "type": "Index Type", + "fields": "Fields", + "operation": "Actions" + } + }, + "image_view": { + "vertex": "Vertex Type", + "edge": "Edge Type" + } + }, + "navigation_page": { + "title": "Navigation", + "step1": "Create Data", + "step2": "Business Analysis", + "step3": "System Management", + "step4": "Business Management", + "create_graph": "Create Graph", + "create_schema": "Create Schema", + "load_data": "Load Data", + "graph_query": "Graph Query", + "graph_algorithm": "Graph Algorithm", + "graph_manage": "Graph Space Management", + "data_manage": "Data Management", + "account_manage": "Account Management", + "role_manage": "Role Management", + "resource_manage": "Resource Management", + "task_manage": "Task Management", + "datasource_manage": "Data Source Management" + }, + "login": { + "submit": "Sign In", + "username": "Username", + "password": "Password", + "title": "Sign in to HugeGraph" + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/index.js b/hugegraph-hubble/hubble-fe/src/i18n/resources/index.js new file mode 100644 index 000000000..c3ae8cf89 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/index.js @@ -0,0 +1,22 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import zhCNResources from './zh-CN'; +import enUSResources from './en-US'; + +export {zhCNResources, enUSResources}; diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/ERView.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/ERView.json new file mode 100644 index 000000000..80e98df8c --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/ERView.json @@ -0,0 +1,30 @@ +{ + "ERView": { + "edge": { + "name": "边", + "type": "边类型", + "start": "起点ID", + "end": "终点ID", + "create": "新增边", + "e1name": "边1", + "e2name": "边2", + "out": "出边", + "in": "入边", + "both": "双边" + }, + "vertex": { + "name": "顶点", + "type": "顶点类型", + "create": "新增顶点", + "v1name": "顶点1", + "v2name": "顶点2" + }, + "control": { + "zoom_in": "放大", + "zoom_out": "缩小", + "undo": "撤销", + "redo": "重做", + "auto_map": "自动映射" + } + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/board.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/board.json new file mode 100644 index 000000000..fd84c8a7f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/board.json @@ -0,0 +1,15 @@ +{ + "Topbar": { + "exit":{ + "name": "退出登录", + "confirm":"确定退出吗?", + "success":"退出成功" + } + }, + "selector": { + "placeholder": "请选择" + }, + "navigation": { + "name": "导航" + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/common.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/common.json new file mode 100644 index 000000000..c39c9151e --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/common.json @@ -0,0 +1,19 @@ +{ + "common" : { + "verify" : { + "ok": "确定", + "cancel": "取消", + "yes": "是", + "no": "否" + }, + "status": { + "new": "新建", + "running": "执行中", + "success": "完成", + "cancelling": "停止", + "cancelled": "停止", + "failed": "失败", + "undefined": "未知" + } + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/index.js b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/index.js new file mode 100644 index 000000000..30ff1ae6f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/components/index.js @@ -0,0 +1,26 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import Common from './common.json'; +import Board from './board.json'; +import ERView from './ERView.json'; +export { + Common, + Board, + ERView, +}; diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/AsyncTasks.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/AsyncTasks.json deleted file mode 100644 index ce2848f4c..000000000 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/AsyncTasks.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "async-tasks": { - "title": "任务管理", - "placeholders": { - "search": "请输入任务ID或名称搜索" - }, - "table-column-title": { - "task-id": "任务ID", - "task-name": "任务名称", - "task-type": "任务类型", - "create-time": "创建时间", - "time-consuming": "耗时", - "status": "状态", - "manipulation": "操作" - }, - "table-filters": { - "task-type": { - "all": "全部", - "gremlin": "Gremlin任务", - "algorithm": "算法任务", - "remove-schema": "删除元数据", - "create-index": "创建索引", - "rebuild-index": "重建索引" - }, - "status": { - "all": "全部", - "scheduling": "调度中", - "scheduled": "排队中", - "queued": "排队中", - "running": "运行中", - "restoring": "恢复中", - "success": "成功", - "failed": "失败", - "cancelling": "已取消", - "cancelled": "已取消" - } - }, - "table-selection": { - "selected": "已选{{number}}项", - "delete-batch": "批量删除" - }, - "manipulations": { - "abort": "终止", - "aborting": "终止中", - "delete": "删除", - "check-result": "查看结果", - "check-reason": "查看原因" - }, - "hint": { - "delete-confirm": "删除确认", - "delete-description": "是否确认删除该任务?删除后无法恢复,请谨慎操作", - "delete-succeed": "删除成功", - "delete-batch-confirm": "批量删除", - "delete-batch-description": "确认删除以下任务?删除后无法恢复,请谨慎操作", - "delete": "删除", - "cancel": "取消", - "no-data": "暂无数据", - "empty": "您暂时还没有任何任务", - "select-disabled": "任务{{id}}无法被选中删除", - "check-details": "查看详情", - "creation-failed": "创建失败" - } - } -} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/GraphManagementSidebar.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/GraphManagementSidebar.json deleted file mode 100644 index d6b2f5455..000000000 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/GraphManagementSidebar.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "data-import": "数据导入", - "import-task": "导入任务", - "map-templates": "映射模板" -} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/addition.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/addition.json deleted file mode 100644 index d137ee317..000000000 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/addition.json +++ /dev/null @@ -1,348 +0,0 @@ -{ - "addition": { - "function-parameter": { - "edge-type": "边类型", - "vertex-id": "顶点ID" - }, - "store": { - "required": "必填项", - "item-is-required": "此项为必填项", - "no-match-input-requirements": "不符合输入要求", - "rule1": "请输入字母、数字或特殊字符", - "rule2": "请输入范围在 1-65535 的数字", - "rule3": "必须同时填写用户名和密码", - "rule4": "必须为中英文,数字和下划线", - "illegal-data-format": "非法的数据格式", - "incorrect-time-format": "时间格式不正确", - "cannot-be-empty": "此项不能为空", - "cannot-be-empty1": "该项不能为空", - "same-edge-name-notice": "存在同名边,请输入其它名称", - "same-vertex-name-notice": "存在同名顶点,请输入其它名称", - "same-property-name-notice": "存在同名属性,请输入其它名称", - "same-index-name-notice": "存在同名属性索引,请输入其它名称", - "network-error": "网络异常,请稍后重试" - }, - "constant": { - "primary-key-id": "主键ID", - "automatic-generation": "自动生成", - "custom-string": "自定义字符串", - "custom-number": "自定义数字", - "custom-uuid": "自定义UUID", - "greater-than": "大于", - "greater-than-or-equal": "大于等于", - "less-than": "小于", - "less-than-or-equal": "小于等于", - "equal": "等于" - }, - "menu": { - "chart": "图", - "table": "表格", - "task-id": "任务ID", - "list-mode": "列表模式", - "chart-mode": "图模式", - "secondary-index": "二级索引", - "range-index": "范围索引", - "full-text-index": "全文索引", - "type-index": "类型索引", - "base-info": "基础信息", - "select-reuse-item": "选择复用项", - "confirm-reuse-item": "确认复用项", - "complete-reuse": "完成复用" - }, - "vertex": { - "type-detail": "顶点类型详情", - "edit-type": "编辑顶点类型", - "using-cannot-delete": "当前顶点类型正在使用中,不可删除。", - "using-cannot-delete-confirm": "使用中顶点类型不可删除,确认删除以下未使用顶点类型?", - "del-vertex-confirm": "确认删除此顶点类型?", - "del-vertex-confirm-again": "确认删除此顶点类型?删除后无法恢复,请谨慎操作", - "vertex-type-name": "顶点类型名称", - "vertex-style": "顶点样式", - "vertex-display-content": "顶点展示内容", - "select-vertex-display-content-placeholder": "请选择顶点展示内容", - "create-vertex-type": "创建顶点类型", - "vertex-index": "顶点索引", - "corresponding-vertex-type": "对应顶点类型", - "no-vertex-type-desc": "您暂时还没有任何顶点类型,立即创建" - }, - "edge": { - "display-content": "边展示内容", - "display-content-select-desc": "请选择边展示内容", - "index-info": "索引信息", - "index-name": "索引名称", - "index-type": "索引类型", - "edge-index": "边索引", - "index-type-select-desc": "请选择索引类型", - "property-select-desc": "请选择属性", - "add-group": "新增一组", - "confirm-del-edge-type": "确认删除此边类型?", - "confirm-del-edge-type-again": "确认删除边类型?删除后无法恢复,请谨慎操作", - "confirm-del-edge-careful-notice": "删除后无法恢复,请谨慎操作", - "no-edge-desc": "您暂时还没有任何边类型,立即创建", - "create-edge": "创建边类型", - "multiplexing-existing-type": "复用已有类型", - "multiplexing-edge-type": "复用边类型", - "multiplexing-edge-type-notice": "边类型关联的属性和属性索引、起点类型和终点类型及其关联的属性和属性索引将一同复用", - "verification-result": "校验结果", - "be-verified": "待校验", - "verified-again": "重新校验" - }, - "message": { - "no-can-delete-vertex-type": "无可删除顶点类型", - "no-index-notice": "您暂时还没有任何索引", - "property-create-desc": "您暂时还没有任何属性,立即创建", - "del-unused-property-notice": "使用中属性不可删除,确认删除以下未使用属性?", - "please-enter-keywords": "请输入搜索关键字", - "no-property-can-delete": "无可删除属性", - "no-metadata-notice": "您暂时还没有任何元数据", - "no-vertex-or-edge-notice": "您还未设置顶点类型或边类型", - "no-adjacency-points": "不存在邻接点", - "no-more-points": "不存在更多邻接点", - "please-enter-number": "请输入数字", - "please-enter-string": "请输入字符串", - "please-enter": "请输入", - "no-chart-desc": "无图结果,请查看表格或Json数据", - "no-data-desc": "暂无数据结果", - "data-loading": "数据加载中", - "submit-async-task": "提交异步任务中", - "submit-success": "提交成功", - "submit-fail": "提交失败", - "task-submit-fail": "任务提交失败", - "fail-reason": "失败原因", - "fail-position": "失败位置", - "selected": "已选", - "edge-del-confirm": "确认删除以下边?", - "long-time-notice": "删除元数据耗时较久,详情可在任务管理中查看。", - "index-long-time-notice": "创建索引可能耗时较久,详情可在任务管理中查看", - "property-del-confirm": "确认删除此属性?", - "property-del-confirm-again": "确认删除此属性?删除后无法恢复,请谨慎操作", - "index-del-confirm": "删除索引后,无法根据此属性索引进行查询,请谨慎操作。", - "edge-name-rule": "允许出现中英文、数字、下划线", - "source-type-select-placeholder": "请选择起点类型", - "target-type-select-placeholder": "请选择终点类型", - "select-distinguishing-key-property-placeholder": "请选择区分键属性", - "select-association-key-property-placeholder": "请先选择关联属性", - "index-open-notice": "开启索引会影响使用性能,请按需开启", - "duplicate-name": "有重名", - "dependency-conflict": "依赖冲突", - "already-exist": "已存在", - "pass": "通过", - "select-reuse-graph-placeholder": "请选择要复用的图", - "reuse-complete": "复用完成", - "vertex-type-reuse-success": "已成功复用顶点类型", - "property-using-cannot-delete": "当前属性数据正在使用中,不可删除。", - "reuse-property-success": "已成功复用属性", - "reuse-vertex-type-notice": "顶点类型关联的属性和属性索引将一同复用", - "illegal-vertex": "该顶点是非法顶点,可能是由悬空边导致" - }, - "operate": { - "reuse-vertex-type": "复用顶点类型", - "reuse-existing-property": "复用已有属性", - "reuse-property": "复用属性", - "create-property": "创建属性", - "continue-reuse": "继续复用", - "back-to-view": "返回查看", - "complete": "完成", - "next-step": "下一步", - "previous-step": "上一步", - "rename": "重命名", - "del-ing": "删除中", - "view-task-management": "去任务管理查看", - "batch-del": "批量删除", - "multiplexing": "复用", - "de-multiplexing": "取消复用", - "open": "开", - "close": "关", - "look": "查看", - "view-property": "查看属性", - "filter": "筛选", - "add-filter-item": "添加属性筛选", - "enlarge": "放大", - "narrow": "缩小", - "center": "居中", - "download": "下载", - "exit-full-screen": "退出全屏", - "full-screen": "全屏", - "load-background": "加载背景", - "load-spinner": "加载 spinner", - "rendering": "正在渲染", - "detail": "详情", - "favorite": "收藏", - "favorite-success": "收藏成功", - "load-statement": "加载语句", - "time": "时间", - "name": "名称", - "favorite-statement": "收藏语句", - "favorite-desc": "请输入收藏名称", - "operate": "操作", - "query": "查询", - "hidden": "隐藏", - "modify-name": "修改名称", - "execution-record": "执行记录", - "favorite-queries": "收藏的查询", - "favorite-search-desc": "搜索收藏名称或语句", - "expand-collapse": "展开/收起", - "expand": "展开", - "collapse": "收起", - "favorite-del-desc": "是否确认删除该条收藏语句?", - "input-query-statement": "请输入查询语句", - "query-statement-required": "查询语句不能为空", - "execute-query": "执行查询", - "execute-task": "执行任务", - "execute-ing": "执行中", - "clean": "清空", - "modify-success": "修改成功", - "query-result-desc": "查询模式适合30秒内可返回结果的小规模分析;任务模式适合较长时间返回结果的大规模分析,任务详情可在任务管理中查看" - }, - "common": { - "in-use": "使用中", - "not-used": "未使用", - "status": "状态", - "no-result": "无结果", - "cardinal-number": "基数", - "allow-null": "允许为空", - "allow-multiple-connections": "允许多次连接", - "multiple-connections-notice": "开启后两顶点间允许存在多条该类型的边", - "term": "项", - "in-edge": "入边", - "add-in-edge": "添加入边", - "out-edge": "出边", - "add-out-edge": "添加出边", - "add": "添加", - "value": "值", - "null-value": "空值", - "id-strategy": "ID策略", - "id-value": "ID值", - "id-input-desc": "请输入ID值", - "please-input": "请输入", - "add-success": "添加成功", - "add-fail": "添加失败", - "vertex-type": "顶点类型", - "selected-vertex-type": "已选顶点类型", - "vertex-id": "顶点ID", - "vertex-name": "顶点名称", - "illegal-vertex-desc": "该顶点是非法顶点,可能是由悬空边导致", - "add-vertex": "添加顶点", - "vertex-type-select-desc": "请选择顶点类型", - "edge-type": "边类型", - "selected-edge-type": "已选边类型", - "edge-style": "边样式", - "modify-edge-type": "编辑边类型", - "edge-type-detail": "边类型详情", - "edge-type-name": "边类型名称", - "edge-direction": "边方向", - "edge-type-select-desc": "请选择边类型", - "edge-id": "边ID", - "edge-name": "边名称", - "source": "起点", - "source-type": "起点类型", - "target": "终点", - "target-type": "终点类型", - "rule": "规则", - "property": "属性", - "selected-property": "已选属性", - "property-name": "属性名称", - "add-property": "添加属性", - "association-property": "关联属性", - "association-property-and-type": "关联属性及类型", - "property-index": "属性索引", - "selected-property-index": "已选属性索引", - "property-index-name": "属性索引名称", - "property-value": "属性值", - "required-property": "不可空属性", - "nullable-property": "可空属性", - "primary-key": "主键", - "primary-key-property": "主键属性", - "select-primary-key-property-placeholder": "请选择主键属性", - "distinguishing-key": "区分键", - "distinguishing-key-property": "区分键属性", - "property-input-desc": "请输入属性值", - "del-comfirm": "确认删除", - "ask": "吗?", - "confirm": "确认", - "del-success": "删除成功", - "save-scuccess": "保存成功", - "save-fail": "保存失败", - "save": "保存", - "cancel": "取消", - "more": "更多", - "edit": "编辑", - "del": "删除", - "fold": "折叠", - "open": "展开", - "close": "关闭", - "required": "必填项", - "format-error-desc": "必须以字母开头,允许出现英文、数字、下划线", - "no-matching-results": "无匹配结果", - "no-data": "暂无数据", - "data-type": "数据类型", - "corresponding-type": "对应类型" - }, - "appbar": { - "graph-manager": "图管理" - }, - "graphManagementHeader": { - "graph-manager": "图管理", - "community": "社区版", - "business": "商业版", - "limit-desc": "支持图上限", - "limit-desc1": "图磁盘上限", - "individual": "个", - "input-placeholder": "搜索图名称或ID", - "graph-create": "创建图" - }, - "graphManagementList": { - "save-scuccess": "保存成功", - "graph-del": "删除图", - "graph-del-comfirm-msg": "删除后该图所有配置均不可恢复", - "graph-edit": "编辑图", - "id": "图ID", - "id-desc": "为创建的图设置唯一标识的ID", - "name": "图名称", - "name-desc": "填写需要连接的图的名称", - "host": "主机名", - "port": "端口号", - "port-desc": "请输入端口号", - "username": "用户名", - "password": "密码", - "creation-time": "创建时间", - "visit": "访问" - }, - "graphManagementEmptyList": { - "graph-create": "创建图", - "graph-create-desc": "您暂时还没有任何图,立即创建", - "no-matching-results": "无匹配结果" - }, - "newGraphConfig": { - "graph-create": "创建图", - "create": "创建", - "create-scuccess": "创建成功", - "id": "图ID", - "id-desc": "为创建的图设置唯一标识的ID", - "name": "图名称", - "name-desc": "填写需要连接的图的名称", - "host": "主机名", - "host-desc": "请输入主机名", - "port": "端口号", - "port-desc": "请输入端口号", - "username": "用户名", - "password": "密码", - "not-required-desc": "未设置则无需填写" - }, - "graphManagementSidebar": { - "data-analysis": "数据分析", - "graph-select": "选择图", - "metadata-config": "元数据配置", - "data-import": "数据导入", - "task-management": "任务管理" - }, - "dataAnalyze": { - "cannot-access": "无法访问", - "return-home": "返回首页" - }, - "dataAnalyzeInfoDrawer": { - "edit-details": "编辑详情", - "data-details": "数据详情" - } - } -} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/common.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/common.json deleted file mode 100644 index 98d821703..000000000 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/graph-managment/common.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "common": { - "loading-data": "数据加载中" - } -} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/index.js b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/index.js new file mode 100644 index 000000000..55af6087b --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/index.js @@ -0,0 +1,46 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {merge} from 'lodash-es'; +import { + Board, + Common, + ERView, +} from './components'; +import { + Home, + Manage, + Analysis, + Modules, + Pages, +} from './modules'; + +const translation = { + translation: merge( + Board, + Common, + Home, + Manage, + ERView, + Analysis, + Modules, + Pages + ), +}; + +export default translation; diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/analysis.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/analysis.json new file mode 100644 index 000000000..67d013abd --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/analysis.json @@ -0,0 +1,192 @@ +{ + "analysis": { + "name": "业务分析", + "query": { + "name": "图语言分析", + "placeholder": "请输入查询语句" + }, + "algorithm": { + "name": "图算法", + "placeholder": "算法查询", + "common": { + "instance_num": "实例数", + "input_limit_edges_per_vertex": "最大出边限制", + "max_iter_step": "最大迭代次数", + "worker_num": "worker计算线程数", + "sample_rate": "边的采样率,由于此算法是指数型增长的算法,算力要求非常高,需要根据业务需求设置合理的采样率,得到一个近似结果", + "weight_property": "权重属性名", + "property_filter": "点边属性过滤条件", + "min_ring_length": "输出环路的最小长度", + "max_ring_length": "输出环路的最大长度", + "max_step": "最大迭代步数", + "request_memory": "计算节点最小内存需求", + "JVM_memory": "jvm环境内存大小,默认为32g", + "source": "起始点ID", + "query_tooltip": "仅当选择的图数据加载完成后,才可以使用OLAP算法。" + }, + "mode": { + "OLTP": "OLTP算法", + "OLAP": "OLAP算法" + }, + "capacity_item": { + "tooltip": "遍历过程中最大的访问的顶点数目" + }, + "direction_item": { + "tooltip": "顶点向外发散的方向" + }, + "label_item": { + "tooltip": "边的类型(默认代表所有edge label)" + }, + "max_degree_item": { + "tooltip": "查询过程中,单个顶点遍历的最大邻接边数目" + }, + "max_depth_item": { + "tooltip": "步数" + }, + "nearest_item": { + "tooltip": "nearest为true时,代表起始顶点到达结果顶点的最短路径长度为depth,不存在更短的路径;near\n est为false时,代表起始顶点到结果顶点有一条长度为depth的路径(未必最短且可以有环)", + "placeholder": "最短路径长度" + }, + "olap": { + "betweenness_centrality": { + "desc": "中介中心性算法(Betweenness Centrality)判断一个节点具有\"桥梁\"节点的值, 值越大说明它作为图中两点间必经路径的可能性越大, 典型的例子包括社交网络中的共同关注的人", + "sample_rate": "边的采样率", + "sample_rate_long": "边的采样率,由于此算法是指数型增长的算法,算力要求非常高,需要根据业务需求设置合理的采样率,得到一个近似结果", + "use_endpoint": "是否计算最后一个点" + }, + "closeness_centrality": { + "desc": "计算一个节点到所有其他可达节点的最短距离的倒数,进行累积后归一化的值。用于计算图中每个节点的度中心性值,支持无向图和有向图。", + "weight_property": "权重属性名", + "sample_rate": "边的采样率", + "wf_improved": "是否使用 Wasserman and Faust 紧密中心性公式" + }, + "cluster_coefficient": { + "desc": "聚集系数,计算每个点局部的聚集系数, 暂时未提供全局聚集系数。", + "minimum_edges_use_superedge_cache": "利用内存减少消息量,如果内存不够,可以从100改成1000,但聚集系数可能计算不完" + }, + "degree_centrality": { + "desc": "用于计算图中每个节点的度中心性值,支持无向图和有向图。", + "direction": "方向,in/out/both 入边/出边/双边" + }, + "filtered_rings_detection": { + "desc": "带过滤条件的环路检测算法(Filtered Rings Detection)用于检测图中的环路,\n 环路的路径由环路中最小id的顶点来记录。可通过指定点、边属性过滤规则让算法选择性的做路径传播。" + }, + "filter_subgraph_matching": { + "desc": "带属性过滤的子图匹配算法。用户可以传入一个带属性过滤的查询图结构,算法会在图中匹配所有与该查询图同构的子图。", + "query_graph_config": "查询图配置,json数组字符串" + }, + "k_core": { + "desc": "K-Core算法,标记所有度数为K的顶点。", + "k": "K-Core算法的k值,非必需,有默认值", + "degree_k": "最小度数阈值" + }, + "label_propagation_algorithm": { + "desc": "标签传递算法,是一种图聚类算法,常用在社交网络中。" + }, + "links": { + "desc": "链路追踪算法,通过指定的一批开始顶点,按照指定的传播规则进行传播,到指定的结束条件后停止并记录下路径。", + "analyze_config": "链路传播条件配置" + }, + "louvain": { + "desc": "Louvain 算法是基于模块度的社区发现算法。由于Louvain算法的特殊性,只用一个worker instance运行。" + }, + "computer_item": { + "computer_cpu": "master最大CPU", + "worker_cpu": "worker最大CPU", + "master_request_memory": "master最小内存,不满足最小内存则分配不成功", + "worker_request_memory": "worker最小内存,不满足最小内存则分配不成功", + "master_memory": "master最大内存,超过最大内存则会被k8s中止", + "worker_memory": "worker最大内存,超过最大内存则会被k8s中止" + }, + "item": { + "PAGE_RANK": "PageRank", + "WEAKLY_CONNECTED_COMPONENT": "Weakly Connected Component", + "DEGREE_CENTRALIT": "Degree Centrality", + "CLOSENESS_CENTRALITY": "Closeness Centrality", + "TRIANGLE_COUNT": "Triangle Count", + "K_NEIGHBOR": "K-neighbor(GET,基础版)", + "K_OUT": "K-out API(GET,基础版)", + "SAME_NEIGHBORS": "Same Neighbors", + "RINGS": "Rings", + "SHORTEST_PATH": "Shortest Path", + "ALLPATHS": "查找所有路径(POST,高级版)", + "JACCARD_SIMILARITY": "Jaccard Similarity(GET)", + "CROSSPOINTS": "Crosspoints", + "RINGS_DETECTION": "Rings Detection", + "FILTERED_RINGS_DETECTION": "Filtered Rings Detection", + "LINKS": "Links", + "CLUSTER_COEFFICIENT": "Cluster Coefficient", + "BETWEENNESS_CENTRALITY": "Betweenness Centrality", + "LABEL_PROPAGATION_ALGORITHM": "Label Propagation Algorithm", + "LOUVAIN": "Louvain", + "FILTER_SUBGRAPH_MATCHING": "Filter SubGraph Matching", + "K_CORE": "K-Core", + "PERSONAL_PAGE_RANK": "PersonalPageRank", + "KOUT_POST": "K-out API(POST, 高级版)", + "KNEIGHBOR_POST": "K-neighbor API(POST,高级版)", + "JACCARD_SIMILARITY_POST": "Jaccard Similarity(POST)", + "RANK_API": "rank API", + "NEIGHBOR_RANK_API": "Neighbor Rank API", + "FINDSHORTESTPATH": "查找最短路径", + "FINDSHORTESTPATHWITHWEIGHT": "查找带权重的最短路径", + "SINGLESOURCESHORTESTPATH": "(从一个顶点出发)查找最短路径", + "MULTINODESSHORTESTPATH": "(指定顶点集)查找最短路径", + "CUSTOMIZEDPATHS": "自定义路径查询", + "TEMPLATEPATHS": "模版路径查询", + "CUSTOMIZED_CROSSPOINTS": "Customized Crosspoints", + "RAYS": "Rays", + "PATHS": "查找所有路径(GET,基础版)", + "FUSIFORM_SIMILARITY": "Fusiform Similarity", + "ADAMIC_ADAR": "Adamic Adar", + "RESOURCE_ALLOCATION": "Resource Allocation", + "SAME_NEIGHBORS_BATCH": "Same Neighbors Batch", + "EGONET": "Egonet", + "SSSP": "SSSP(单元最短路径)" + }, + "page_rank": { + "desc": "PageRank算法又称网页排名算法,是一种由搜索引擎根据网页(节点)之间相互的超链接进行计算的技术,用来体现网页(节点)的相关性和重要性。", + "alpha": "权重系数(又称阻尼系数)", + "l1": "收敛精度,为每次迭代各个点相较于上次迭代变化的绝对值累加和上限,当小于这个值时认为计算收敛,算法停止。", + "damping": "阻尼系数,传导到下个点的百分比", + "diff": "收敛精度,为每次迭代各个点相较于上次迭代变化的绝对值累加和上限,当小于这个值时认为计算收敛,算法停止。" + }, + "personal_page_bank": { + "desc": "PersonalPageRank 算法又称个性化推荐算法,是一种由搜索引擎根据网页(节点)之间相互的超链接进行计算的技术,用来体现网页(节点)的相关性和重要性", + "source": "起始顶点", + "alpha": "权重系数(又称阻尼系数)", + "l1": "收敛精度", + "use_id_fixlength": "true时,系统采用自增id运算", + "use_id_fixlength_query": "是否采用自增id运算" + }, + "ring_detection": { + "desc": "环路检测算法(Rings Detection),用于检测图中的环路,环路的路径由环路中最小id的顶点来记录。" + }, + "SSSPVermeer": { + "desc": "单元最短路径算法,求一个点到其他所有点的最短距离" + }, + "triangle_count": { + "desc": "三角形计数算法,用于计算通过每个顶点的三角形个数。", + "limit_edges_in_one_vertex": "最大出边限制", + "minimum_edges_use_superedge_cache": "利用内存减少消息量,如果内存不够,可以从100改成1000,但三角计数可能计算不完" + }, + "weakly_connected_component": { + "desc": "弱连通分量,计算无向图中所有联通的子图,输出各顶点所属的弱联通子图id" + } + }, + "oltp": { + "adamic_adar": { + "desc": "主要用于社交网络中判断两点紧密度的算法, 用来求两点间共同邻居密集度的一个系数", + "vertex": "起始顶点", + "other": "终点顶点", + "direction": "起始顶点到目的顶点的方向,目的地到起始点是反方向,BOTH时不考虑方向", + "label": "默认代表所有edge label", + "max_degree": "查询过程中,单个顶点遍历的最大邻接边数目", + "select_direction": "顶点向外发散的方向" + } + } + }, + "async_task": { + "name": "任务管理" + } + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/home.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/home.json new file mode 100644 index 000000000..e698fc4fb --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/home.json @@ -0,0 +1,9 @@ +{ + "home": { + "name":"系统管理" , + "my": "个人中心", + "account": "账号管理", + "resource": "资源管理", + "role": "角色管理" + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/index.js b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/index.js new file mode 100644 index 000000000..9155cab6f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/index.js @@ -0,0 +1,30 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import Home from './home.json'; +import Manage from './manage.json'; +import Analysis from './analysis.json'; +import Modules from './modules.json'; +import Pages from './pages.json'; +export { + Home, + Analysis, + Manage, + Modules, + Pages, +}; diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/manage.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/manage.json new file mode 100644 index 000000000..9ec249de0 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/manage.json @@ -0,0 +1,8 @@ +{ + "manage": { + "name": "数据管理", + "graphspace": "图管理", + "source": "数据源管理", + "task": "数据导入" + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/modules.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/modules.json new file mode 100644 index 000000000..71c52e517 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/modules.json @@ -0,0 +1,262 @@ +{ + "topbar": { + "current_graphspace": "当前图空间:", + "current_graph": "当前图:", + "graph_select_placeholder": "请选择", + "status": { + "loaded": "已加载", + "loading": "加载中", + "error": "加载失败", + "created": "未加载" + }, + "last_load_time": "最近加载时间:", + "reload_to_vermeer": "重加载到Vermeer", + "load_to_vermeer": "加载到Vermeer", + "meta_config": "元数据配置", + "meta_config_tooltip": "点击可跳转到对应图的元数据配置的页面", + "olap_switch": "是否查询OLAP结果:", + "olap_on": "开启", + "olap_off": "关闭", + "load_fail": "加载Vermeer任务失败" + }, + "execute_log": { + "col": { + "time": "时间", + "type": "执行类型", + "content": "执行内容", + "status": "状态", + "duration": "耗时", + "operation": "操作" + }, + "type": { + "GREMLIN": "GREMLIN查询", + "GREMLIN_ASYNC": "GREMLIN任务", + "ALGORITHM": "算法任务", + "CYPHER": "CYPHER查询" + }, + "status": { + "SUCCESS": "成功", + "ASYNC_TASK_SUCCESS": "提交成功", + "ASYNC_TASK_RUNNING": "提交运行中", + "RUNNING": "运行中", + "FAILED": "失败", + "ASYNC_TASK_FAILED": "提交失败" + }, + "favorite": "收藏", + "load_statement": "加载语句", + "favorite_title": "收藏语句", + "favorite_placeholder": "请输入收藏名称" + }, + "favorite": { + "col": { + "name": "收藏名称", + "content": "执行内容", + "create_time": "收藏时间", + "operation": "操作" + }, + "edit_title": "修改名称", + "edit_placeholder": "请输入收藏名称", + "load_statement": "加载语句", + "delete_confirm": "确定删除?", + "search_placeholder": "搜索收藏名称" + }, + "query_bar": { + "tab_execute": "执行记录", + "tab_favorite": "收藏", + "gremlin_placeholder": "请输入查询语句", + "execute": "执行", + "async_execute": "异步执行", + "clear": "清空" + }, + "query_result": { + "tab_graph": "图结果", + "tab_table": "表格结果", + "tab_json": "JSON结果", + "empty": "无结果", + "vertex_count": "顶点数: {{count}}", + "edge_count": "边数: {{count}}" + }, + "async_task": { + "col": { + "id": "任务ID", + "type": "任务类型", + "status": "状态", + "create_time": "创建时间", + "update_time": "更新时间", + "operation": "操作" + }, + "detail": { + "title": "异步任务", + "id": "任务ID", + "type": "类型", + "status": "状态", + "create_time": "创建时间", + "update_time": "更新时间", + "content": "执行内容", + "result": "执行结果" + }, + "cancel": "取消任务", + "cancel_confirm": "确定取消此任务?" + }, + "graph_component": { + "search": { + "placeholder": "请输入顶点ID或属性值", + "search_btn": "搜索", + "vertex_id": "顶点ID", + "property": "属性", + "result_count": "找到 {{count}} 个结果" + }, + "edit_element": { + "title_vertex": "编辑顶点", + "title_edge": "编辑边", + "id": "ID", + "label": "类型", + "properties": "属性", + "save": "保存", + "cancel": "取消", + "delete": "删除" + }, + "export": { + "title": "导出数据", + "json": "导出JSON", + "csv": "导出CSV", + "image": "导出图片" + }, + "menu": { + "expand": "展开", + "hide": "隐藏", + "show_properties": "显示属性", + "hide_properties": "隐藏属性", + "fix": "固定", + "unfix": "取消固定" + }, + "status": { + "vertex_count": "顶点: {{count}}", + "edge_count": "边: {{count}}" + }, + "clear": "清空图", + "clear_confirm": "确定清空图?", + "fit_center": "适配画布", + "fix_node": "固定节点", + "full_screen": "全屏", + "zoom_in": "放大", + "zoom_out": "缩小", + "redo": "重做", + "undo": "撤销", + "refresh": "刷新", + "zero_degree": "显示孤立节点", + "legend": "图例", + "3d_mode": "3D模式", + "2d_mode": "2D模式" + }, + "filter": { + "title": "过滤器", + "add": "添加过滤条件", + "vertex_filter": "顶点过滤", + "edge_filter": "边过滤", + "property": "属性", + "operator": "操作符", + "value": "值", + "apply": "应用", + "reset": "重置", + "and": "且", + "or": "或" + }, + "layout": { + "title": "布局配置", + "type": "布局类型", + "force": "力导向", + "circular": "环形", + "radial": "放射", + "dagre": "层次", + "grid": "网格", + "concentric": "同心圆", + "apply": "应用", + "node_size": "节点大小", + "link_distance": "边距离", + "node_strength": "节点强度", + "edge_strength": "边强度", + "gravity": "引力", + "speed": "速度", + "iterations": "迭代次数", + "radius_ratio": "半径比例", + "node_sep": "节点间距", + "rank_sep": "层间距", + "direction": "方向", + "LR": "左到右", + "RL": "右到左", + "TB": "上到下", + "BT": "下到上", + "start_radius": "起始半径", + "end_radius": "终止半径", + "sweep": "旋转角度", + "equal_node_spacing": "等间距", + "min_node_spacing": "最小间距", + "start_angle": "起始角度", + "clockwise": "顺时针", + "prevent_overlap": "防止重叠", + "node_spacing": "节点间距", + "cols": "列数", + "rows": "行数" + }, + "style_config": { + "title": "样式配置", + "vertex_style": "顶点样式", + "edge_style": "边样式", + "color": "颜色", + "size": "大小", + "label": "标签", + "icon": "图标", + "line_type": "线型", + "line_width": "线宽", + "arrow": "箭头", + "display_field": "展示字段", + "apply": "应用", + "reset": "重置" + }, + "statistics": { + "title": "图统计", + "vertex_count": "顶点数", + "edge_count": "边数", + "vertex_types": "顶点类型", + "edge_types": "边类型", + "loading": "加载中..." + }, + "dynamic_add": { + "vertex": { + "title": "新增顶点", + "id": "顶点ID", + "type": "顶点类型", + "properties": "属性", + "submit": "提交", + "cancel": "取消" + }, + "edge": { + "title": "新增边", + "type": "边类型", + "source": "起点", + "target": "终点", + "properties": "属性", + "submit": "提交", + "cancel": "取消" + } + }, + "navigation_module": { + "create_data": { + "title": "创建数据", + "graph_management": "图管理", + "meta_management": "元数据管理", + "data_import": "数据导入" + }, + "analysis": { + "title": "业务分析", + "graph_query": "图查询", + "algorithm": "图算法" + }, + "system": { + "title": "系统管理", + "user_management": "用户管理", + "role_management": "角色管理" + } + } +} diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json new file mode 100644 index 000000000..72907997a --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json @@ -0,0 +1,470 @@ +{ + "common": { + "action": { + "create": "创建", + "save": "保存", + "edit": "编辑", + "delete": "删除", + "cancel": "取消", + "confirm": "确认", + "add": "添加", + "search": "搜索", + "reset": "重置", + "view": "查看", + "detail": "详情", + "upload": "上传", + "download": "下载", + "refresh": "刷新", + "submit": "提交", + "back": "返回", + "close": "关闭", + "apply": "应用", + "assign_permission": "分配权限", + "set_default": "设为默认", + "schema_manage": "schema管理", + "init": "初始化", + "clone": "克隆" + }, + "label": { + "default": "默认", + "unlimited": "未限制", + "unknown": "未知", + "yes": "是", + "no": "否", + "view_mode": "图模式", + "list_mode": "列表模式", + "loading": "加载中..." + }, + "verify": { + "yes": "是", + "no": "否" + }, + "msg": { + "success": "操作成功", + "create_success": "创建成功", + "update_success": "更新成功", + "delete_success": "删除成功", + "set_success": "设置成功", + "init_success": "初始化成功", + "upload_success": "上传成功", + "upload_fail": "上传失败", + "enable_success": "启动成功", + "enable_fail": "启动失败", + "disable_success": "暂停成功", + "disable_fail": "暂停失败", + "delete_fail": "删除失败", + "select_one": "请至少选择一项" + }, + "confirm": { + "delete": "确定删除?", + "delete_irrecoverable": "删除后不可恢复" + }, + "form": { + "required": "此项为必填项", + "max_12": "字符长度最多12位", + "max_48": "字符长度最多48位", + "max_128": "最多字符128位" + } + }, + "graphspace": { + "title": "图空间管理", + "create": "创建图空间", + "search_placeholder": "请输入图空间名称", + "set_default_confirm": "确认更改图空间的默认设置?", + "delete_confirm": "确定删除?", + "delete_content": "删除空间后不可恢复", + "col": { + "name": "名称", + "auth": "是否开启鉴权", + "description": "描述", + "graph_service": "图服务", + "compute_task": "计算任务", + "storage_limit": "最大存储空间限制", + "operation": "操作" + }, + "auth_yes": "是", + "auth_no": "否", + "unit": { + "cpu": "核", + "memory": "G", + "unlimited": "未限制" + }, + "form": { + "title_edit": "编辑图空间", + "title_create": "创建图空间", + "id": "图空间ID", + "name": "图空间名称", + "auth": "是否开启鉴权", + "max_graph": "最大图数", + "max_role": "最大角色数", + "graph_service": "图服务:", + "compute_task": "计算任务:", + "storage": "存储服务:", + "cpu": "cpu资源:", + "memory": "内存资源:", + "k8s_namespace": "k8s命名空间", + "operator_image": "Operator镜像地址", + "algorithm_image": "算法镜像地址", + "storage_limit": "最大存储空间限制:", + "admin": "图空间管理员", + "admin_placeholder": "选择图空间管理员", + "description": "描述", + "description_placeholder": "图空间描述,可选", + "cpu_placeholder": "核", + "memory_placeholder": "G", + "id_placeholder": "以字母开头,只能包含小写字母、数字、_, 最长48位", + "name_placeholder": "只能包含中文、字母、数字、_,最长12位", + "k8s_placeholder": "以字母开头,只能包含小写字母、数字、-,最长48位", + "image_format_error": "请输入正确的镜像地址格式(ie: example.com/org_1/xx_img:1.0.0)!", + "id_rule": "以字母开头,只能包含小写字母、数字、_, 最长48位", + "k8s_rule": "以字母开头,只能包含小写字母、数字、-,最长48位" + }, + "card": { + "enter": "进入图空间", + "vertex": "顶点", + "edge": "边", + "daily_update": "点边数每日更新", + "last_update": "本次数据更新于 {{date}}", + "graph_id": "图ID:{{name}}", + "auth_label": "是否鉴权:", + "max_graph": "最大图数:", + "cpu": "cpu资源:{{val}}", + "memory": "内存资源:{{val}}", + "storage": "最大存储空间限制:", + "used": "已使用:", + "set_default": "默认图空间", + "created": "创建" + } + }, + "graph": { + "title": "图管理", + "create": "创建图", + "search_placeholder": "请输入图名称", + "col": { + "name": "图名称", + "auth": "是否开启鉴权", + "description": "描述", + "creator": "创建者", + "create_time": "创建时间", + "operation": "操作" + }, + "menu": { + "enter_analysis": "进入图分析平台", + "meta_config": "元数据配置", + "clear_schema_data": "清空schema+数据", + "clear_data": "清空数据", + "set_default": "设为默认", + "view_schema": "查看schema", + "clone": "克隆图" + }, + "form": { + "title_create": "创建图", + "title_edit": "编辑图", + "name": "图ID", + "name_placeholder": "只能包含小写字母、数字、_,最长48位", + "nickname": "图名", + "nickname_placeholder": "只能包含中文、字母、数字、_,最长12位", + "auth": "是否开启鉴权", + "description": "描述", + "description_placeholder": "图描述,可选" + }, + "detail": { + "title": "详情", + "name": "图名称", + "nickname": "图昵称", + "auth": "是否鉴权", + "graphspace": "所属图空间", + "creator": "创建者", + "create_time": "创建时间", + "last_update": "最近更新时间:", + "update_data": "数据更新" + } + }, + "account": { + "title": "账号管理", + "create": "创建账号", + "delete_confirm": "确定要删除账号 {{name}}吗?", + "col": { + "id": "账号ID", + "name": "账号名", + "remark": "备注", + "resource": "资源权限", + "create_time": "创建时间", + "is_superadmin": "是否为超级管理员", + "permission": "管理权限" + }, + "form": { + "title_detail": "查看账号", + "title_edit": "编辑账号", + "title_auth": "分配权限", + "title_create": "创建账号", + "id": "账号ID", + "id_placeholder": "用户登录", + "name": "账号名", + "name_placeholder": "账号名设置后可更改", + "is_superadmin": "是否为超级管理员", + "remark": "备注", + "remark_placeholder": "输入账号备注", + "default_password": "默认密码", + "default_password_placeholder": "123456(创建后可前往个人中心更改)", + "permission": "管理权限" + } + }, + "my": { + "title": "个人中心", + "col": { + "id": "账号ID", + "name": "账号名", + "is_superadmin": "是否为超级管理员", + "remark": "备注", + "permission": "管理权限", + "create_time": "创建时间" + }, + "edit": { + "title": "更改密码", + "old_password": "旧密码", + "new_password": "新密码", + "confirm_password": "确认密码" + } + }, + "role": { + "title": "角色管理", + "create": "创建角色", + "delete_confirm": "确定删除角色{{name}}吗?", + "col": { + "name": "角色名称", + "description": "描述", + "operation": "操作" + }, + "form": { + "title_create": "创建角色", + "title_edit": "编辑角色", + "name": "角色名称", + "description": "描述", + "permissions": "权限" + }, + "auth": { + "title": "分配权限", + "graphspace": "图空间", + "graph": "图", + "permission": "权限" + } + }, + "resource": { + "title": "资源管理", + "create": "创建资源", + "col": { + "name": "资源名称", + "type": "类型", + "graphspace": "图空间", + "graph": "图", + "operation": "操作" + }, + "form": { + "title_create": "创建资源", + "title_edit": "编辑资源", + "name": "资源名称", + "type": "资源类型", + "graphspace": "图空间", + "graph": "图" + } + }, + "task": { + "title": "数据导入", + "search_placeholder": "请输入任务名称", + "pause": "暂停", + "execute": "执行", + "edit_title_create": "创建任务", + "edit_title_edit": "编辑任务", + "col": { + "name": "任务名称", + "source_type": "源数据类型", + "target_space": "目标图空间", + "target_graph": "目标图", + "sync_type": "同步类型", + "status": "状态", + "create_time": "创建时间", + "operation": "操作" + }, + "statistic": { + "total": "总任务", + "running": "运行中", + "success": "已完成", + "failed": "失败" + }, + "detail": { + "title": "任务详情", + "success": "完成", + "failed": "失败", + "running": "运行中" + }, + "view": { + "title": "查看任务", + "name": "任务名称", + "source_type": "源数据类型", + "target_space": "目标图空间", + "target_graph": "目标图", + "sync_type": "同步类型" + }, + "edit": { + "name": "任务名称", + "graphspace": "图空间", + "graph": "图", + "source": "数据源", + "source_type": "源数据类型", + "select_graphspace": "请选择图空间", + "select_graph": "请选择图", + "select_source": "请选择数据源", + "select_source_type": "请选择源数据类型" + } + }, + "datasource": { + "title": "数据源管理", + "create": "新增数据源", + "search_placeholder": "请输入数据源名称", + "col": { + "name": "数据源名称", + "type": "数据源类型", + "host": "主机", + "port": "端口", + "username": "用户名", + "operation": "操作" + }, + "form": { + "upload": "上传文件", + "no_compress": "无" + } + }, + "schema": { + "title": "元数据管理", + "tab": { + "property": "属性", + "vertex": "顶点类型", + "edge": "边类型", + "vertex_index": "顶点索引", + "edge_index": "边索引" + }, + "property": { + "create": "创建属性", + "col": { + "name": "属性名称", + "type": "数据类型", + "cardinality": "基数", + "operation": "操作" + }, + "form": { + "name": "属性名称:", + "type": "数据类型:", + "cardinality": "基数:" + } + }, + "vertex": { + "create": "创建顶点类型", + "delete_confirm": "确认删除此顶点类型?", + "delete_warning": "删除后无法恢复,请谨慎操作", + "delete_task_note": "删除元数据耗时较久,详情可在任务管理中查看", + "col": { + "name": "顶点类型名称", + "id_strategy": "ID策略", + "properties": "关联属性", + "primary_keys": "主键属性", + "label_index": "类型索引", + "property_index": "属性索引", + "operation": "操作" + }, + "form": { + "title_create": "创建顶点类型", + "title_edit": "编辑顶点类型", + "name": "顶点类型名称:", + "id_strategy": "ID策略:", + "style": "顶点样式:", + "display_fields": "顶点展示内容", + "label_index": "类型索引", + "property_index": "属性索引", + "properties": "关联属性" + } + }, + "edge": { + "delete_confirm": "确认删除此边类型?", + "delete_warning": "删除后无法恢复,请谨慎操作", + "delete_task_note": "删除元数据耗时较久,详情可在任务管理中查看", + "col": { + "name": "边类型名称", + "type": "边类型", + "source": "起点类型", + "target": "终点类型", + "properties": "关联属性", + "sort_keys": "区分键", + "label_index": "类型索引", + "property_index": "属性索引", + "operation": "操作" + }, + "type": { + "NORMAL": "普通类型", + "PARENT": "父类型", + "SUB": "子类型", + "parent_label": "父边:" + }, + "form": { + "title_create": "创建边", + "title_edit": "编辑边", + "name": "边类型名称:", + "type": "类型:", + "type_normal": "普通类型", + "type_parent": "父边类型", + "type_sub": "子边类型", + "parent": "父边类型:", + "parent_placeholder": "请选择父边", + "style": "顶点样式:", + "source": "起点类型", + "target": "终点类型", + "multi_link": "允许多次连接", + "properties": "关联属性", + "sort_keys": "区分键", + "display_fields": "边展示内容", + "label_index": "类型索引", + "property_index": "属性索引" + } + }, + "index": { + "vertex_title": "顶点索引", + "edge_title": "边索引", + "create": "创建索引", + "col": { + "name": "索引名称", + "type": "索引类型", + "fields": "属性", + "operation": "操作" + } + }, + "image_view": { + "vertex": "顶点类型", + "edge": "边类型" + } + }, + "navigation_page": { + "title": "导航", + "step1": "创建数据", + "step2": "业务分析", + "step3": "系统管理", + "step4": "业务管理", + "create_graph": "创建图", + "create_schema": "创建Schema", + "load_data": "数据入库", + "graph_query": "图语言分析", + "graph_algorithm": "图算法分析", + "graph_manage": "图空间管理", + "data_manage": "数据管理", + "account_manage": "账号管理", + "role_manage": "角色管理", + "resource_manage": "资源管理", + "task_manage": "任务管理", + "datasource_manage": "数据源管理" + }, + "login": { + "submit": "登录", + "username": "用户名", + "password": "密码", + "title": "登录 HugeGraph" + } +} diff --git a/hugegraph-hubble/hubble-fe/src/index.css b/hugegraph-hubble/hubble-fe/src/index.css new file mode 100644 index 000000000..54af9a485 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/index.css @@ -0,0 +1,36 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +body { + margin: 0; + font-family: + PingFangSC-Regular, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + 'Roboto', + 'Oxygen', + 'Ubuntu', + 'Cantarell', + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/hugegraph-hubble/hubble-fe/src/index.js b/hugegraph-hubble/hubble-fe/src/index.js new file mode 100644 index 000000000..9782a09de --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/index.js @@ -0,0 +1,45 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import {BrowserRouter} from 'react-router-dom'; +import {ConfigProvider} from 'antd'; +import 'moment/locale/zh-cn'; +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; +import zhCN from 'antd/lib/locale/zh_CN'; +import enUS from 'antd/lib/locale/en_US'; +import './i18n'; + +const languageType = localStorage.getItem('languageType') === 'en-US' ? enUS : zhCN; +const root = ReactDOM.createRoot(document.getElementById('root')); + +root.render( + + + + + +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/hugegraph-hubble/hubble-fe/src/layout.ant.js b/hugegraph-hubble/hubble-fe/src/layout.ant.js new file mode 100644 index 000000000..f953b9c53 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/layout.ant.js @@ -0,0 +1,41 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {Layout} from 'antd'; +import Sidebar from './components/Sidebar/index.ant'; +import Topbar from './components/Topbar/index.ant'; +import {Outlet} from 'react-router-dom'; +import 'antd/dist/antd.css'; + +const LayoutAnt = () => { + return ( + + + + + + + + + + + + ); +}; + +export default LayoutAnt; diff --git a/hugegraph-hubble/hubble-fe/src/logo.svg b/hugegraph-hubble/hubble-fe/src/logo.svg new file mode 100644 index 000000000..eb0b8d315 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/logo.svg @@ -0,0 +1,19 @@ + + + diff --git a/hugegraph-hubble/hubble-fe/src/modules/Context/index.js b/hugegraph-hubble/hubble-fe/src/modules/Context/index.js new file mode 100644 index 000000000..c985d4cbc --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/Context/index.js @@ -0,0 +1,37 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 图分析部分Context + * @author gouzixing@ + */ + + +import React from 'react'; + +const defaultContext = { + graphSpace: null, + graph: null, + graphLoadTime: null, + graphStatus: null, + isVermeer: false, +}; + +const GraphAnalysisContext = React.createContext(defaultContext); + +export default GraphAnalysisContext; diff --git a/hugegraph-hubble/hubble-fe/src/modules/GraphAnalysis/index.js b/hugegraph-hubble/hubble-fe/src/modules/GraphAnalysis/index.js new file mode 100644 index 000000000..d0140ba50 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/GraphAnalysis/index.js @@ -0,0 +1,149 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import React, {useState, useCallback, useEffect} from 'react'; +import {PageHeader, message} from 'antd'; +import AnalysisHome from '../analysis/Home'; +import AlgorithmHome from '../algorithm/Home'; +import AsyncTaskHome from '../asyncTasks/Home'; +import GraphAnalysisContext from '../Context'; +import TopBar from '../component/TopBar'; +import {GRAPH_ANALYSIS_MODULE} from '../../utils/constants'; +import _ from 'lodash'; +import * as api from '../../api'; + +const {GREMLIN, ALGORITHMS, ASYNCTASKS} = GRAPH_ANALYSIS_MODULE; + +const pageHeaderName = { + [GREMLIN]: '图语言分析', + [ALGORITHMS]: '图算法', + [ASYNCTASKS]: '任务管理', +}; + +const GraphAnalysisHome = props => { + const {moduleName} = props; + + const [currentOlapMode, setCurrentOlapMode] = useState(false); + const [isOlapModeLoading, setOlapModeLoading] = useState(false); + const [context, setContext] = useState( + { + graphSpace: null, + graph: null, + graphLoadTime: null, + graphStatus: null, + isVermeer: false, + } + ); + + const renderModule = () => { + switch (moduleName) { + case GREMLIN: + return ; + case ALGORITHMS: + return ; + case ASYNCTASKS: + return ; + default: + break; + } + }; + + const onOlapModeChange = useCallback( + async open => { + const {graphSpace, graph} = context; + setOlapModeLoading(true); + const response = await api.analysis.switchOlapMode(graphSpace, graph, open ? 0 : 1); + if (response.status === 200) { + setCurrentOlapMode(open); + } + setOlapModeLoading(false); + }, + [context] + ); + + const getCurrentOlapMode = useCallback( + async (graphSpace, graph) => { + setOlapModeLoading(true); + const response = await api.analysis.getOlapMode(graphSpace, graph); + const {status, data} = response; + if (status === 200) { + const {status: currentOlapStatus} = data; + setCurrentOlapMode(currentOlapStatus === '0'); + } + setOlapModeLoading(false); + }, + [] + ); + + const onGraphInfoChange = useCallback( + (graphSpace, graph) => { + const {name: currentGraph, last_load_time, status} = graph; + if (graphSpace && !_.isEmpty(graph)) { + getCurrentOlapMode(graphSpace, currentGraph); + } + setContext(context => ({ + ...context, + graphSpace, + graph: currentGraph, + graphLoadTime: last_load_time, + graphStatus: status, + })); + }, + [getCurrentOlapMode] + ); + + useEffect( + () => { + (async () => { + const response = await api.auth.getVermeer(); + const {status, data, message: errMsg} = response || {}; + const {enable} = data || {}; + if (status === 200) { + setContext(context => ( + { + ...context, + isVermeer: enable || false, + } + )); + } + else { + !errMsg && message.error('获取vermeer状态失败'); + } + })(); + }, + [] + ); + + return ( + + + + + {renderModule()} + + ); +}; + +export default GraphAnalysisHome; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/AlgorithmSearch/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/AlgorithmSearch/index.js new file mode 100644 index 000000000..a89867e2b --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/AlgorithmSearch/index.js @@ -0,0 +1,55 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 图算法 搜索 + * @author + */ + +import React, {useMemo} from 'react'; +import {Input} from 'antd'; +import _ from 'lodash'; +import c from './index.module.scss'; +import {useTranslation} from 'react-i18next'; + +const AlgorithmSearch = props => { + const {t} = useTranslation(); + const {onSearch} = props; + + const debounceOnChange = useMemo( + () => { + return _.debounce(e => { + const {value} = e.target; + onSearch(value); + }, 200); + }, + [onSearch] + ); + + return ( +
+ +
+ ); +}; + +export default AlgorithmSearch; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/AlgorithmSearch/index.module.scss b/hugegraph-hubble/hubble-fe/src/modules/algorithm/AlgorithmSearch/index.module.scss new file mode 100644 index 000000000..405f98417 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/AlgorithmSearch/index.module.scss @@ -0,0 +1,27 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.algorithmSearch{ + :global(.ant-input-affix-wrapper){ + width: 250px; + height: 40px; + border: 1px solid #E7E8E9; + margin: -1px 0 0 -1px; + padding: 4px 10px; + } +} diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/GraphMenuBar/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/GraphMenuBar/index.js new file mode 100644 index 000000000..58c6a6a6d --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/GraphMenuBar/index.js @@ -0,0 +1,188 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file GraphMenuBar(图算法) + * @author + */ + +import React, {useCallback} from 'react'; +import MenuBar from '../../../component/MenuBar'; +import ImportData from '../../../component/ImportData'; +import ExportData from '../../../component/ExportData'; +import StyleConfig from '../../../component/styleConfig/Home'; +import FilterHome from '../../../component/filter/Home'; +import LayoutConfig from '../../../component/LayoutConfig'; +import SettingConfig from '../../../component/SettingConfig'; +import NewConfig from '../../../component/NewConfig'; +import Statistics from '../../../component/Statistics'; +import RenderModeSwitcher from '../../../component/GraphRenderModeSwitcher'; +import {PANEL_TYPE, GRAPH_RENDER_MODE, MENUBAR_TOOLTIPS_2D, MENUBAR_TOOLTIPS_3D} from '../../../../utils/constants'; +import {formatToDownloadData} from '../../../../utils/formatGraphResultData'; +import useDownloadJson from '../../../../customHook/useDownloadJson'; + +const {LAYOUT, SETTING, STATISTICS} = PANEL_TYPE; +const {CANVAS2D} = GRAPH_RENDER_MODE; + +const GraphMenuBar = props => { + const { + styleConfigData, + graphData, + handleImportData, + handleExportPng, + handleGraphStyleChange, + handleFilterChange, + handleTogglePanel, + handleClickNewAddNode, + handleClickNewAddEdge, + handleSwitchRenderMode, + refreshExcuteCount, + showCanvasInfo, + graphRenderMode, + } = props; + + const {downloadJsonHandler} = useDownloadJson(); + + const isCanvas2D = graphRenderMode === CANVAS2D; + const buttonEnableForCanvas2D = showCanvasInfo && isCanvas2D; + const buttonEnableForImport = !showCanvasInfo && isCanvas2D; + + const handleExportJson = useCallback( + fileName => { + downloadJsonHandler(fileName, formatToDownloadData(graphData)); + }, + [downloadJsonHandler, graphData] + ); + + const menubarContent = [ + { + key: 1, + content: ( + + ), + }, + { + key: 2, + content: ( + ), + }, + { + key: 3, + content: ( + ), + }, + { + key: 4, + content: ( + + ), + }, + { + key: 5, + content: ( + { + handleTogglePanel(LAYOUT); + }} + tooltip={isCanvas2D ? MENUBAR_TOOLTIPS_2D.LAYOUT : MENUBAR_TOOLTIPS_3D.LAYOUT} + />), + }, + { + key: 6, + content: ( + { + handleTogglePanel(SETTING); + }} + tooltip={isCanvas2D ? MENUBAR_TOOLTIPS_2D.SETTING : MENUBAR_TOOLTIPS_3D.SETTING} + />), + }, + { + key: '7', + content: ( + ), + }, + { + key: 8, + content: ( + { + handleTogglePanel(STATISTICS); + }} + tooltip={isCanvas2D ? MENUBAR_TOOLTIPS_2D.STATISTICS : MENUBAR_TOOLTIPS_3D.STATISTICS} + />), + }, + // { + // key: 8, + // content: ( + // { + // handleTogglePanel(STATISTICS); + // }} + // tooltip={isCanvas2D ? MENUBAR_TOOLTIPS_2D.STATISTICS : MENUBAR_TOOLTIPS_3D.STATISTICS} + // />), + // }, + ]; + + const menubarExtras = [{ + key: 1, + content: ( + + ), + }]; + + return ( + + ); +}; + +export default GraphMenuBar; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/GraphToolBar/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/GraphToolBar/index.js new file mode 100644 index 000000000..73578c1e1 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/GraphToolBar/index.js @@ -0,0 +1,72 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file GraphToolBar + * @author + */ + +import React, {useState, useCallback} from 'react'; +import ToolBar from '../../../component/ToolBar'; +import ZeroDegreeNodeSearch from '../../../component/ZeroDegreeNode'; +import RedoUndo from '../../../component/RedoUndo'; +import FitCenter from '../../../component/FitCenter'; +import ZoomGraph from '../../../component/ZoomGraph'; +import ClearGraph from '../../../component/ClearGraph'; +import FullScreen from '../../../component/FullScreen'; +import RefreshGraph from '../../../component/RefreshGraph'; +import FixNode from '../../../component/FixNode'; +import {PANEL_TYPE} from '../../../../utils/constants'; + +const {CLOSED} = PANEL_TYPE; + +const GraphToolBar = props => { + const { + handleRedoUndoChange, + handleClearGraph, + panelType, + updatePanelType, + } = props; + + const [isFullScreen, setFullScreen] = useState(false); + + const handleChangeFullScreen = useCallback( + () => { + setFullScreen(pre => !pre); + updatePanelType(CLOSED); + }, + [updatePanelType] + ); + + const toolBarExtras = [ + {key: '1', content: ()}, + {key: '2', content: ()}, + {key: '3', content: ()}, + {key: '45', content: ()}, + {key: '6', content: ()}, + {key: '7', content: ()}, + {key: '89', content: ()}, + {key: '10', content: ()}, + ]; + + return ( + + ); +}; + +export default GraphToolBar; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/Home/index.js new file mode 100644 index 000000000..2371e6da8 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/Home/index.js @@ -0,0 +1,542 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 图分析画布 Home + * @author + */ +import React, {useCallback, useEffect, useState, useContext, useMemo, useRef} from 'react'; +import GraphAnalysisContext from '../../../Context'; +import Graph from '../../../component/Graph'; +import Legend from '../../../component/Legend'; +import MiniMap from '../../../component/MiniMap'; +import GraphMenuBar from '../GraphMenuBar'; +import Tooltip from '../../../component/Tooltip'; +import GraphToolBar from '../GraphToolBar'; +import Menu from '../../../component/Menu'; +import NumberCard from '../../../component/NumberCard'; +import EditElement from '../../../component/EditElement'; +import Search from '../../../component/Search'; +import SettingConfigPanel from '../../../component/SettingConfigPanel'; +import LayoutConfigPanel from '../../../component/layoutConfigPanel/Home'; +import PanelControlButton from '../../../component/ClosePanelButton'; +import DynamicAddNode from '../../../component/DynamicAddNode'; +import DynamicAddEdge from '../../../component/DynamicAddEdge'; +import NeighborRankApiView from '../NeighborRankView'; +import StatisticPanel from '../../../component/StatisticsPanel/Home'; +import RankApiView from '../RankApiView'; +import JaccView from '../JaccView'; +import GraphStatusView from '../../../component/GraphStatusView'; +import TaskNavigateView from '../../../component/TaskNavigateView'; +import Canvas3D from '../../../component/Canvas3D'; +import {filterData} from '../../../../utils/filter'; +import {formatToGraphData, formatToOptionedGraphData, formatToStyleData, + formatToDownloadData, updateGraphDataStyle, formatToLegendData} from '../../../../utils/formatGraphResultData'; +import {fetchExpandInfo, handleAddGraphNode, handleAddGraphEdge, handleExpandGraph} from '../utils'; +import {mapLayoutNameToLayoutDetails} from '../../../../utils/graph'; +import { + GRAPH_STATUS, PANEL_TYPE, GRAPH_RENDER_MODE, useTranslatedConstants, +} from '../../../../utils/constants'; +import c from './index.module.scss'; +import _ from 'lodash'; + +const GraphResult = props => { + const { + data = {vertexs: [], edges: []}, + metaData, + options, + asyncTaskId, + queryStatus, + queryMessage, + isQueryMode, + algorithm: algorithmName, + resetGraphStatus, + panelType, + updatePanelType, + graphNums, + propertyKeysRecords, + graphRenderMode, + onGraphRenderModeChange, + } = props; + const {ALGORITHM_NAME, Algorithm_Layout} = useTranslatedConstants(); + + const {STANDBY, LOADING, SUCCESS, FAILED, UPLOAD_FAILED} = GRAPH_STATUS; + const {JACCARD_SIMILARITY, JACCARD_SIMILARITY_POST, RANK_API, + NEIGHBOR_RANK_API, ADAMIC_ADAR, RESOURCE_ALLOCATION} = ALGORITHM_NAME; + const noneGraphAlgorithm = [JACCARD_SIMILARITY, JACCARD_SIMILARITY_POST, RANK_API, + NEIGHBOR_RANK_API, ADAMIC_ADAR, RESOURCE_ALLOCATION]; + const {CLOSED, LAYOUT, SETTING, STATISTICS} = PANEL_TYPE; + const {CANVAS2D} = GRAPH_RENDER_MODE; + + + const graphSpaceInfo = useContext(GraphAnalysisContext); + const {edgeMeta, vertexMeta} = metaData || {}; + const [graphData, setGraphData] = useState({nodes: [], edges: []}); + const [styleConfigData, setStyleConfigData] = useState({nodes: {}, edges: {}}); + const [showAddNodeDrawer, setShowAddNodeDrawer] = useState(false); + const [showAddEdgeDrawer, setShowAddEdgeDrawer] = useState(false); + const [isClickNew, setIsClickNew] = useState(false); + const [searchVisible, setSearchVisible] = useState(false); + const [searchVertex, setSearchVertex] = useState({}); + const [addEdgeDrawerInfo, setAddEdgeDrawerInfo] = useState({}); + const [isOutEdge, setOutEdge] = useState(false); + const [showEditElement, setShowEditElement] = useState(false); + const [editElementInfo, setEditElementInfo] = useState(); + const [graph, setGraph] = useState(); + const [graphAllInfo, setGraphAllInfo] = useState(); + const excuteStyleChangeCount = useRef(0); + const {jaccardsimilarity, rankObj, rankArray} = options || {}; + const showCanvasInfo = (_.size(data.vertices) !== 0 || _.size(data.edges) !== 0) && queryStatus === SUCCESS; + const layoutInfo = useMemo( + () => mapLayoutNameToLayoutDetails({layout: Algorithm_Layout[algorithmName], startId: options?.startId}), + [algorithmName, options?.startId] + ); + + const onGraphRender = useCallback(graph => { + setGraph(graph); + }, []); + + useEffect(() => { + setGraphAllInfo(graphNums); + }, [graphNums]); + + useEffect( + () => { + const rawGraphData = formatToGraphData(data, metaData, {}); + const finalGraphData = formatToOptionedGraphData(rawGraphData, options, algorithmName); + const styleConfigData = formatToStyleData(rawGraphData); + setGraphData(finalGraphData); + setStyleConfigData(styleConfigData); + }, + [algorithmName, data, metaData, options] + ); + + const handleUpdateStatus = useCallback( + (status, message, result) => { + resetGraphStatus && resetGraphStatus(status, message, result); + }, + [resetGraphStatus] + ); + + const handleExportPng = useCallback( + fileName => { + graph.downloadFullImage(fileName, 'image/png', {backgroundColor: '#FFF', padding: 30}); + }, + [graph] + ); + + const handleGraphStyleChange = useCallback( + styleConfigData => { + try { + const styledData = updateGraphDataStyle(graphData, styleConfigData); + const newGraphData = formatToOptionedGraphData(styledData, options, algorithmName); + graph.changeData(_.cloneDeep(newGraphData), true); + graph.getNodes().forEach(item => { + graph.refreshItem(item); + if (item.hasLocked()) { + graph.setItemState(item, 'customFixed', true); + } + }); + setGraphData({...styledData}); + setStyleConfigData(styleConfigData); + } + catch (err) { + if (excuteStyleChangeCount.current > 2) { + throw new Error(err); + } + else { + excuteStyleChangeCount.current++; + handleGraphStyleChange(styleConfigData); + } + } + }, + [algorithmName, graph, graphData, options] + ); + + const handleRefreshExcuteCount = useCallback(() => { + excuteStyleChangeCount.current = 0; + }, []); + + const handleFilterChange = useCallback( + values => { + const {filter} = values; + const newData = filterData(props.data, filter.rules, filter.logic); + const newRawGraphData = formatToGraphData(newData || {}, metaData, styleConfigData); + const newGraphData = formatToOptionedGraphData(newRawGraphData, options, algorithmName); + graph.changeData(newGraphData, true); + graph.refresh(); + setGraphData(newGraphData); + setStyleConfigData(formatToStyleData(newRawGraphData)); + }, + [algorithmName, graph, metaData, options, props.data, styleConfigData] + ); + + const handleTogglePanel = useCallback( + type => { + if (panelType === type) { + updatePanelType(CLOSED); + } + else { + updatePanelType(type); + } + }, [panelType, updatePanelType] + ); + + const handleLayoutChange = useCallback( + layout => { + graph.destroyLayout(); + graph.updateLayout(layout, 'center', undefined, false); + }, + [graph] + ); + + const handleSettingChange = useCallback( + changedData => { + graph.changeData(_.cloneDeep(changedData), false); + graph.refresh(); + setGraphData({...changedData}); + }, [graph] + ); + + const handleClickNewAddNode = useCallback( + () => { + setShowAddNodeDrawer(true); + }, []); + + const handleClickNewAddEdge = useCallback( + isOut => { + setIsClickNew(true); + setShowAddEdgeDrawer(true); + setOutEdge(isOut); + }, []); + + const handleClickGraphNode = useCallback( + value => { + setShowEditElement(true); + setEditElementInfo(value.getModel()); + }, []); + + const handleExpand = useCallback( + (newData, graphInstance) => { + const newGraphData = handleExpandGraph(newData, metaData, + styleConfigData, options, algorithmName, graphInstance); + setGraphData(newGraphData); + setStyleConfigData(formatToStyleData(newGraphData)); + }, [algorithmName, metaData, options, styleConfigData]); + + const getExpandInfo = useCallback( + async (params, graphInstance) => { + const searchResultRaw = await fetchExpandInfo(params, graphInstance, graphSpaceInfo); + handleExpand(searchResultRaw, graphInstance); + }, [graphSpaceInfo, handleExpand]); + + const handleClickGraphEdge = useCallback( + value => { + const drawerInfo = value.getModel(); + setShowEditElement(true); + setEditElementInfo(drawerInfo); + }, [] + ); + + const handledbClickNode = useCallback( + (node, graphInstance) => { + const model = node.getModel(); + const params = {vertex_id: model.id, vertex_label: model.itemType}; + getExpandInfo(params, graphInstance); + }, + [getExpandInfo] + ); + + const handleAddNode = useCallback( + data => { + const newItem = handleAddGraphNode(data, metaData, styleConfigData, graph); + const {nodes, edges} = graphData; + setGraphData({edges, nodes: [...nodes, newItem]}); + setGraphAllInfo({...graphAllInfo, vertexCount: Number(graphAllInfo.vertexCount) + 1}); + }, + [graph, graphAllInfo, graphData, metaData, styleConfigData] + ); + + const handleAddEdge = useCallback( + data => { + const newGraphData = handleAddGraphEdge(data, metaData, graphData, styleConfigData, graph); + setGraphData(newGraphData); + setGraphAllInfo({...graphAllInfo, edgeCount: Number(graphAllInfo.edgeCount) + 1}); + }, + [graph, graphAllInfo, graphData, metaData, styleConfigData] + ); + + const toggleAddNodeDrawer = useCallback( + () => { + setShowAddNodeDrawer(pre => !pre); + }, [] + ); + + const toggleAddEdgeDrawer = useCallback( + () => { + setShowAddEdgeDrawer(pre => !pre); + }, [] + ); + + const handleClosePanel = useCallback( + () => { + updatePanelType(CLOSED); + }, + [updatePanelType] + ); + + const handleRedoUndoChange = useCallback( + (type, values) => { + let changedData; + if (type === 'changedata') { + changedData = values; + } + else { + changedData = graph.cfg.data; + } + setGraphData({...changedData}); + }, + [graph] + ); + + const handleClearGraph = useCallback( + () => { + resetGraphStatus && resetGraphStatus(STANDBY, undefined, {}); + updatePanelType(CLOSED); + }, + [resetGraphStatus, updatePanelType] + ); + + const handleClickAddNode = useCallback(() => { + setShowAddNodeDrawer(true); + }, []); + + const handleClickAddEdge = useCallback( + (info, isOutEdge) => { + setIsClickNew(false); + setShowAddEdgeDrawer(true); + setAddEdgeDrawerInfo(info); + setOutEdge(isOutEdge); + }, + [] + ); + + const handleClickMenuExpand = useCallback( + params => { + getExpandInfo(params, graph); + }, + [getExpandInfo, graph] + ); + + const handleSearch = useCallback( + vertex => { + setSearchVisible(true); + setSearchVertex(vertex); + }, + [] + ); + + const onCloseEditElement = useCallback( + () => { + setShowEditElement(false); + }, + [] + ); + + const onEditElementChange = useCallback( + (type, item, itemData) => { + const {id} = item.getModel(); + const updatedInfo = graphData[type].map( + item => { + if (item.id === id) { + return {...item, ...itemData}; + } + return item; + } + ); + const updatedGraphData = {...graphData, [type]: updatedInfo}; + setGraphData(updatedGraphData); + }, + [graphData] + ); + + const handleCloseSearch = useCallback( + () => { + setSearchVisible(false); + }, + [] + ); + + const handleChangeSearch = useCallback( + params => { + getExpandInfo(params, graph); + handleCloseSearch(); + }, + [getExpandInfo, graph, handleCloseSearch] + ); + const renderCanvas2D = () => ( + + + + + + + + + + + + + + + + ); + + const renderCanvas3D = () => (); + + const statusMessage = useMemo(() => ({ + [STANDBY]: '暂无数据结果', + [LOADING]: '程序运行中,请稍候...', + [FAILED]: queryMessage || '运行失败', + [UPLOAD_FAILED]: queryMessage || '导入失败', + }), [queryMessage]); + + const renderMainContent = () => { + if (queryStatus === SUCCESS) { + if (!isQueryMode) { + return ( + + ); + } + if (!showCanvasInfo && !noneGraphAlgorithm.includes(algorithmName)) { + return ; + } + switch (algorithmName) { + case JACCARD_SIMILARITY: + case ADAMIC_ADAR: + case RESOURCE_ALLOCATION: + return ; + case JACCARD_SIMILARITY_POST: + case RANK_API: + return ; + case NEIGHBOR_RANK_API: + return ; + }; + return graphRenderMode === CANVAS2D ? renderCanvas2D() : renderCanvas3D(); + } + return ; + }; + + const handleSwitchRenderMode = useCallback( + value => { + onGraphRenderModeChange(value); + updatePanelType(CLOSED); + }, + [onGraphRenderModeChange, updatePanelType] + ); + + return ( +
+ + {renderMainContent()} + +
+ ); +}; + +export default GraphResult; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/Home/index.module.scss b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/Home/index.module.scss new file mode 100644 index 000000000..90197732f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/Home/index.module.scss @@ -0,0 +1,29 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.graphResult { + position: relative; + width: calc(100% - 250px); + background-color: #fff; + + .graphContainer { + display: flex; + justify-content: flex-start; + flex: 1 1 0; + } +} diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/JaccView/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/JaccView/index.js new file mode 100644 index 000000000..b3b511ffe --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/JaccView/index.js @@ -0,0 +1,41 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file JACCARD_SIMILARITY等算法展示 + * @author + */ + +import React from 'react'; +import JaccRankView from '../../../component/JaccRankView'; +import c from './index.module.scss'; + +const JaccView = props => { + const {jaccardsimilarity} = props; + return ( +
+ +
+ ); + +}; + +export default JaccView; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/JaccView/index.module.scss b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/JaccView/index.module.scss new file mode 100644 index 000000000..265afee53 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/JaccView/index.module.scss @@ -0,0 +1,31 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.noneGraphContent{ + display: flex; + padding-top: 10%; + padding-bottom: 100px; + align-items: center; + flex-direction: column; + width: 100%; + height: calc(100vh - 40px); + border: 1px solid #E7E8E9; + margin-left: -1px; + word-break: break-all; + overflow-y: auto; +} diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/NeighborRankView/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/NeighborRankView/index.js new file mode 100644 index 000000000..5e427c43a --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/NeighborRankView/index.js @@ -0,0 +1,63 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file NeighborRankApi算法展示 + * @author + */ + +import React from 'react'; +import {colors} from '../../../../utils/constants'; +import JaccRankView from '../../../component/JaccRankView'; +import _ from 'lodash'; +import c from './index.module.scss'; + +const NeighborRankApiView = props => { + const {rankArray} = props; + const colorsNum = colors.length; + return ( +
+ {rankArray.map((item, index) => { + return ( +
+
分类{index + 1}
+ {_.isEmpty(item) ? ( +
本场景下没有第{index + 1}度邻居
+ ) : (Object.entries(item)?.map(item2 => { + const [key, value] = item2; + return ( + + ); + }) + )} +
+ ); + })} +
+ ); +}; + +export default NeighborRankApiView; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/NeighborRankView/index.module.scss b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/NeighborRankView/index.module.scss new file mode 100644 index 000000000..f852dd6b9 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/NeighborRankView/index.module.scss @@ -0,0 +1,43 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.noneGraphContent{ + display: flex; + padding-top: 10%; + padding-bottom: 100px; + align-items: center; + flex-direction: column; + width: 100%; + height: calc(100vh - 40px); + border: 1px solid #E7E8E9; + margin-left: -1px; + word-break: break-all; + overflow-y: auto; + + .noneGraphContentTitle{ + font-weight: bold; + margin-top: 20px; + } + + .emptyDesc { + display: flex; + align-items: center; + margin-top: 20px; + width: 380px + } +} diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/RankApiView/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/RankApiView/index.js new file mode 100644 index 000000000..a91421adb --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/RankApiView/index.js @@ -0,0 +1,63 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file RankApi算法展示 + * @author + */ + +import React from 'react'; +import {GRAPH_STATUS} from '../../../../utils/constants'; +import JaccRankView from '../../../component/JaccRankView'; +import GraphStatusView from '../../../component/GraphStatusView'; +import _ from 'lodash'; +import c from './index.module.scss'; + +const RankApiView = props => { + const {rankObj} = props; + if (_.isEmpty(rankObj)) { + return ( + + ); + } + return ( +
+ { + Object.entries(rankObj)?.map( + item => { + const [key, value] = item; + return ( + + ); + } + ) + } +
+ ); + +}; + +export default RankApiView; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/RankApiView/index.module.scss b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/RankApiView/index.module.scss new file mode 100644 index 000000000..265afee53 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/RankApiView/index.module.scss @@ -0,0 +1,31 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.noneGraphContent{ + display: flex; + padding-top: 10%; + padding-bottom: 100px; + align-items: center; + flex-direction: column; + width: 100%; + height: calc(100vh - 40px); + border: 1px solid #E7E8E9; + margin-left: -1px; + word-break: break-all; + overflow-y: auto; +} diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/utils/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/utils/index.js new file mode 100644 index 000000000..236ef4001 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/GraphResult/utils/index.js @@ -0,0 +1,134 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import * as api from '../../../../api/index'; +import {message} from 'antd'; +import {formatToDownloadData, formatToGraphData, + formatToOptionedGraphData} from '../../../../utils/formatGraphResultData'; +import {processParallelEdges} from '../../../../utils/graph'; +import {clearSelectedStates} from '../../../../utils/handleGraphState'; +import _ from 'lodash'; + +const fetchExpandInfo = async (params, graphInstance, graphSpaceInfo) => { + const {graphSpace, graph} = graphSpaceInfo; + const response = await api.analysis.putExecutionQuery(graphSpace, graph, params); + if (response.status !== 200) { + message.error('展开失败'); + return; + } + const {vertices, edges} = response.data.graph_view; + if (vertices.length === 0) { + message.warning('不存在更多邻接点'); + return; + } + const tmp = {vertices: [], edges: []}; + const rawGraphData = formatToDownloadData(graphInstance.save()); + const verticesIds = rawGraphData.vertices.map(item => item.id); + const edgesIds = rawGraphData.edges.map(item => item.id); + for (let item of vertices) { + if (!verticesIds.includes(item.id)) { + tmp.vertices.push(item); + } + } + for (let item of edges) { + if (!edgesIds.includes(item.id)) { + tmp.edges.push(item); + } + } + if (tmp.vertices.length === 0) { + message.warning('不存在更多邻接点'); + return; + } + const searchResultRaw = tmp; + return searchResultRaw; +}; + +const handleAddGraphNode = (data, metaData, styleConfigData, graph) => { + const addItem = data.vertices; + const {id} = addItem[0]; + const newStyledData = formatToGraphData(data, metaData, styleConfigData); + const styledItem = newStyledData.nodes[0]; + graph.addItem('node', styledItem, false); + const {layout} = graph.cfg; + if (layout) { + graph.destroyLayout(); + graph.updateLayout(layout); + graph.refresh(); + } + clearSelectedStates(graph); + const instance = graph.findById(id); + graph.setItemState(instance, 'addActive', true); + return styledItem; +}; + +const handleAddGraphEdge = (data, metaData, graphData, styleConfigData, graph) => { + const addItem = data.edges; + const {id} = addItem[0]; + const {nodes, edges} = graphData; + const newStyledData = formatToGraphData(data, metaData, styleConfigData); + const processedEdges = processParallelEdges([...edges, newStyledData.edges[0]]); + const styledItem = _.find(processedEdges, {id: id}); + graph.addItem('edge', styledItem, false); + const newGraphData = {edges: processedEdges, nodes}; + clearSelectedStates(graph); + const instance = graph.findById(id); + graph.setItemState(instance, 'addActive', true); + return newGraphData; +}; + +const handleExpandGraph = (newData, metaData, styleConfigData, options, algorithmName, graphInstance) => { + const newRawGraphData = formatToGraphData(newData, metaData, styleConfigData); + const newGraphData = formatToOptionedGraphData(newRawGraphData, options, algorithmName); + const saveData = graphInstance.save(); + const nodes = []; + const edges = []; + const saveNodeIds = saveData.nodes.map(item => { + const {id, icon, label, labelCfg, itemType, metaConfig, properties, size, style, comboId} = item; + nodes.push({id, icon, label, labelCfg, + itemType, metaConfig, properties, size, style, legendType: itemType, comboId}); + return id; + }); + const saveEdgesIds = saveData.edges.map(item => { + const {id, label, labelCfg, itemType, loopCfg, metaConfig, properties, + source, stateStyles, style, target, type} = item; + edges.push({id, label, labelCfg, itemType, loopCfg, metaConfig, properties, + source, stateStyles, style, target, type, legendType: itemType}); + return id; + }); + newGraphData.nodes.map(item => { + if (!saveNodeIds.includes(saveData)) { + nodes.push(item); + } + }); + newGraphData.edges.map(item => { + if (!saveEdgesIds.includes(saveData)) { + edges.push(item); + } + }); + graphInstance.changeData({nodes, edges, combos: saveData?.combos}, true); + graphInstance.refresh(); + return {nodes, edges, combos: saveData?.combos}; +}; + + +export { + fetchExpandInfo, + handleAddGraphNode, + handleAddGraphEdge, + handleExpandGraph, +}; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/Home/index.js new file mode 100644 index 000000000..eb4cfb906 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/Home/index.js @@ -0,0 +1,319 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 图算法 Home + * @author + */ + +import React, {useCallback, useState, useEffect, useContext} from 'react'; +import AlgorithmFormHome from '../algorithmsForm/Home'; +import GraphResult from '../GraphResult/Home'; +import LogsDetail from '../LogsDetail/Home'; +import GraphAnalysisContext from '../../Context'; +import {GRAPH_STATUS, PANEL_TYPE, GRAPH_RENDER_MODE, useTranslatedConstants} from '../../../utils/constants'; +import * as api from '../../../api'; +import _ from 'lodash'; +import c from './index.module.scss'; + + + +const AlgorithmHome = () => { + const {ALGORITHM_MODE} = useTranslatedConstants(); + + const {STANDBY} = GRAPH_STATUS; + const {CLOSED} = PANEL_TYPE; + const {OLTP, OLAP} = ALGORITHM_MODE; + const {CANVAS2D} = GRAPH_RENDER_MODE; + const defaultPageParams = {page: 1, pageSize: 10}; + const TYPE = {GREMLIN: '0', ALGORITHM: '1', CYPHER: '2'}; + + const {graphSpace, graph} = useContext(GraphAnalysisContext); + + const [metaData, setMetaData] = useState(); + const [propertyKeysRecords, setPropertyKeysRecords] = useState(); + const [graphNums, setGraphNums] = useState({vertexCount: -1, edgeCount: -1}); + const [algorithmMode, setAlgorithmMode] = useState(); + const [queryStatus, setQueryStatus] = useState(STANDBY); + const [queryMessage, setQueryMessage] = useState(); + const [queryResult, setQueryResult] = useState(); + const [asyncTaskResult, setAsyncTaskResult] = useState(); + const [graphOptions, setGraphOptions] = useState(); + const [panelType, setPanelType] = useState(CLOSED); + const [algorithmOnCanvas, setAlgorithmOnCanvas] = useState(); + const [pageExecute, setExecutePage] = useState(defaultPageParams.page); + const [pageFavorite, setFavoritePage] = useState(defaultPageParams.page); + const [pageSize, setPageSize] = useState(defaultPageParams.pageSize); + const [isLoading, setLoading] = useState(false); + const [favorSearch, setFavorSearch] = useState(); + const [sortMode, setSortMode] = useState(); + const [favoriteQueriesData, setFavoriteQueriesData] = useState({}); + const [executionLogsData, setExecutionLogsData] = useState({}); + const [graphRenderMode, setGraphRenderMode] = useState(CANVAS2D); + + const initQueryResult = useCallback( + () => { + setQueryStatus(STANDBY); + setQueryMessage(); + setQueryResult({}); + setPanelType(CLOSED); + }, + [] + ); + + const getMetaData = useCallback( + async () => { + let edgeMeta; + let vertexMeta; + const edgeMetaResponse = await api.manage.getMetaEdgeList(graphSpace, graph, {page_size: -1}); + if (edgeMetaResponse.status === 200) { + edgeMeta = edgeMetaResponse.data.records; + } + const vertexMetaResponse = await api.manage.getMetaVertexList(graphSpace, graph, {page_size: -1}); + if (vertexMetaResponse.status === 200) { + vertexMeta = vertexMetaResponse.data.records; + } + setMetaData({edgeMeta, vertexMeta}); + }, + [graph, graphSpace] + ); + + const getPropertykeys = useCallback( + async () => { + const response = await api.manage.getMetaPropertyList(graphSpace, graph, {page_size: -1}); + if (response.status === 200) { + setPropertyKeysRecords(response?.data?.records ?? []); + } + }, + [graph, graphSpace] + ); + + const getGraphNumsInfo = useCallback( + async () => { + const response = await api.analysis.getGraphData(graphSpace, graph); + const {status, data} = response || {}; + if (status === 200) { + const {vertexcount, edgecount} = data || {}; + setGraphNums({vertexCount: vertexcount, edgeCount: edgecount}); + } + }, + [graph, graphSpace] + ); + + const getFavoriteQueriesList = useCallback( + async () => { + const params = { + 'page_size': pageSize, + 'page_no': pageFavorite, + 'content': favorSearch, + 'time_order': sortMode, + 'type': 'ALGORITHM', + }; + setLoading(true); + const response = await api.analysis.fetchFavoriteQueries(graphSpace, graph, params); + setLoading(false); + const {status, message, data} = response || {}; + if (status !== 200 && !message) { + message.error('获取收藏记录失败'); + } + else { + setFavoriteQueriesData({records: data.records, total: data.total}); + } + }, + [favorSearch, graph, graphSpace, pageFavorite, pageSize, sortMode] + ); + + const getExecutionLogsList = useCallback( + async () => { + const params = {'page_size': pageSize, 'page_no': pageExecute, 'type': TYPE.ALGORITHM}; + setLoading(true); + const response = await api.analysis.getExecutionLogs(graphSpace, graph, params); + setLoading(false); + const {status, message, data} = response || {}; + if (status !== 200 && !message) { + message.error('获取图算法的执行记录失败'); + } + else { + setExecutionLogsData({records: data.records, total: data.total}); + } + }, + [graph, graphSpace, pageExecute, pageSize] + ); + + const onFavoriteRefresh = useCallback(() => { + getFavoriteQueriesList(); + }, [getFavoriteQueriesList]); + + useEffect( + () => { + getExecutionLogsList(); + getFavoriteQueriesList(); + }, + [getExecutionLogsList, getFavoriteQueriesList] + ); + + useEffect( + () => { + if (pageFavorite > 1 && _.isEmpty(setFavoriteQueriesData.records)) { + setFavoritePage(pageFavorite - 1); + } + }, + [favoriteQueriesData, pageFavorite, pageSize] + ); + + const resetGraphInfo = useCallback( + () => { + getMetaData(); + getPropertykeys(); + getGraphNumsInfo(); + }, + [getGraphNumsInfo, getMetaData, getPropertykeys] + ); + + const onResetPage = useCallback( + () => { + setExecutePage(defaultPageParams.page); + setFavoritePage(defaultPageParams.page); + }, [] + ); + + useEffect(() => { + if (graphSpace && graph) { + resetGraphInfo(); + } + initQueryResult(); + onResetPage(); + }, [graph, graphSpace, initQueryResult, onResetPage, resetGraphInfo]); + + + const handleUpdateCurrentAlgorithm = useCallback(value => { + setAlgorithmOnCanvas(value); + }, []); + + const handleOltpFormSubmit = useCallback( + (status, data, message, options) => { + setPanelType(CLOSED); + setGraphRenderMode(CANVAS2D); + setAlgorithmMode(OLTP); + setAsyncTaskResult(); + setQueryStatus(status); + setQueryResult(data); + setQueryMessage(message); + options && setGraphOptions(options); + getExecutionLogsList(); + }, + [getExecutionLogsList] + ); + + const handleOlapFormSubmit = useCallback( + (status, data, message) => { + setPanelType(CLOSED); + setAlgorithmMode(OLAP); + setQueryResult({}); + setQueryStatus(status); + setAsyncTaskResult(data); + setQueryMessage(message || ''); + }, + [] + ); + + const resetGraphStatus = useCallback( + (status, message, data) => { + setPanelType(CLOSED); + setAlgorithmMode(OLTP); + setAlgorithmOnCanvas(); + setGraphOptions(); + status && setQueryStatus(status); + message && setQueryMessage(message); + data && setQueryResult(data); + }, []); + + const updatePanelType = useCallback(type => { + setPanelType(type); + }, []); + + const onExecutePageChange = useCallback((page, pageSize) => { + setExecutePage(page); + setPageSize(pageSize); + }, []); + + const onFavoritePageChange = useCallback((page, pageSize) => { + setFavoritePage(page); + setPageSize(pageSize); + }, []); + + const onChangeFavorSearch = useCallback(values => { + setFavorSearch(values); + }, []); + + const onSortChange = useCallback((pagination, filters, sort) => { + setSortMode(sort.order === 'ascend' ? 'asc' : 'desc'); + }, []); + + const onGraphRenderModeChange = useCallback( + value => { + setGraphRenderMode(value); + }, + [] + ); + + return ( + <> +
+ + +
+ + + ); +}; + +export default AlgorithmHome; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/Home/index.module.scss b/hugegraph-hubble/hubble-fe/src/modules/algorithm/Home/index.module.scss new file mode 100644 index 000000000..8ee5b304a --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/Home/index.module.scss @@ -0,0 +1,24 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.algorithmContent { + display: flex; + flex-direction: row; + margin-top: 10px; + height: calc(100vh - 1px); +} diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.js new file mode 100644 index 000000000..6fdea84c4 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.js @@ -0,0 +1,185 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 图算法 执行记录 + * @author + */ + +import React, {useState, useCallback} from 'react'; +import {Table, Space, Tag, Input, Popconfirm} from 'antd'; +import ExecutionContent from '../../../../components/ExecutionContent'; +import c from './index.module.scss'; + +const ExecuteLog = props => { + const { + isLoading, + pageExecute, + pageSize, + onExecutePageChange, + onAddCollection, + executionLogsDataRecords, + executionLogsDataTotal, + } = props; + + const [favoriteName, setFavoriteName] = useState(); + const [disabledFavorite, setDisabledFavorite] = useState(true); + + const onFavoraiteName = useCallback( + e => { + setFavoriteName(e.target.value); + e.target.value ? setDisabledFavorite(false) : setDisabledFavorite(true); + }, []); + + const onFavoriteCard = useCallback(() => { + setFavoriteName(''); + setDisabledFavorite(true); + }, []); + + const updateAddCollection = useCallback( + content => { + onAddCollection(content, favoriteName); + }, + [favoriteName, onAddCollection] + ); + + const onAddFavorite = useCallback( + content => { + updateAddCollection(content); + }, [updateAddCollection]); + + const favoriteContent = rowData => ( + <> +
收藏语句
+ + + ); + + const typeDesc = { + GREMLIN: 'GREMLIN查询', + GREMLIN_ASYNC: 'GREMLIN任务', + ALGORITHM: '算法任务', + CYPHER: 'CYPHER查询', + }; + + const statusDesc = { + SUCCESS: '成功', + ASYNC_TASK_SUCCESS: '提交成功', + ASYNC_TASK_RUNNING: '提交运行中', + RUNNING: '运行中', + FAILED: '失败', + ASYNC_TASK_FAILED: '提交失败', + }; + + const statusColor = { + SUCCESS: 'green', + ASYNC_TASK_SUCCESS: 'green', + RUNNING: 'geekblue', + FAILED: 'volcano', + ASYNC_TASK_FAILED: 'volcano', + }; + + const executeLogColumns = [ + { + title: '时间', + dataIndex: 'create_time', + width: '20%', + }, + { + title: '执行类型', + dataIndex: 'type', + width: '15%', + render: type => typeDesc[type] || type, + }, + { + title: '执行内容', + dataIndex: 'content', + width: '30%', + render: (text, rowData, index) => { + return text.split('\n')[1] ? + :
{text}
; + }, + }, + { + title: '状态', + dataIndex: 'status', + width: '10%', + render: status => { + return ( + + + {statusDesc[status] || status} + + + ); + }, + }, + { + title: '耗时', + dataIndex: 'duration', + width: '10%', + }, + { + title: '操作', + dataIndex: 'manipulation', + width: '15%', + render: (text, rowData, index) => { + return ( +
+ onAddFavorite(rowData.content)} + okButtonProps={{disabled: disabledFavorite}} + okText="收藏" + cancelText="取消" + > + 收藏 + +
+ ); + }, + }, + ]; + + return ( + item.id} + pagination={{ + onChange: onExecutePageChange, + position: ['bottomRight'], + total: executionLogsDataTotal, + showSizeChanger: executionLogsDataTotal > 10, + current: pageExecute, + pageSize: pageSize, + }} + loading={isLoading} + /> + ); +}; + +export default ExecuteLog; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.module.scss b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.module.scss new file mode 100644 index 000000000..e33f1e9d1 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.module.scss @@ -0,0 +1,24 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + + +.breakWord { + cursor: pointer; + word-wrap: break-word; + word-break: break-word; +} diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.js new file mode 100644 index 000000000..d6a407710 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.js @@ -0,0 +1,226 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 图算法 收藏 + * @author + */ + +import React, {useState, useCallback} from 'react'; +import Highlighter from 'react-highlight-words'; +import {Table, Input, Popconfirm, Modal} from 'antd'; +import ExecutionContent from '../../../../components/ExecutionContent'; +import c from './index.module.scss'; + +const Favorite = props => { + const { + isLoading, + pageFavorite, + pageSize, + onFavoritePageChange, + onChangeFavorSearch, + onSortChange, + onEditCollection, + onDel, + favoriteQueriesDataRecords, + favoriteQueriesDataTotal, + } = props; + + const [favoriteName, setFavoriteName] = useState(); + const [searchCache, setSearchCache] = useState(''); + const [search, setSearch] = useState(''); + const [isDisabledName, setDisabledName] = useState(false); + + const changeCollection = useCallback( + rowData => { + onEditCollection(rowData, favoriteName); + }, + [favoriteName, onEditCollection] + ); + + const onSaveEditFavorite = useCallback( + rowData => { + setFavoriteName(''); + changeCollection(rowData); + }, [changeCollection]); + + const onEditFavorite = useCallback( + rowData => { + const {name} = rowData; + setFavoriteName(name); + }, []); + + const onChangeFavoraiteName = useCallback( + e => { + setFavoriteName(e.target.value); + e.target.value ? setDisabledName(false) : setDisabledName(true); + }, []); + + const onConfirm = id => { + Modal.confirm({ + title: '确认删除', + content: '是否确认删除该条收藏语句?', + okText: '确定', + cancelText: '取消', + onOk: () => onDel(id), + }); + }; + + const editFavoriteForm = ( + <> +
修改名称
+ + + ); + + const queryFavoriteColumns = [ + { + title: '时间', + dataIndex: 'create_time', + width: '25%', + sorter: true, + }, + { + title: '名称', + dataIndex: 'name', + width: '15%', + sorter: true, + render: text => { + return ( + + ); + }, + }, + { + title: '收藏语句', + dataIndex: 'content', + width: '40%', + render(text, rowData) { + return text.split('\n')[1] ? ( + + ) : ( +
+ +
+ ); + }, + }, + { + title: '操作', + dataIndex: 'manipulation', + width: '20%', + render(_, rowData, index) { + return ( +
+ onSaveEditFavorite(rowData)} + okText="保存" + okButtonProps={{disabled: isDisabledName}} + cancelText="取消" + > + onEditFavorite(rowData)} + > + 修改名称 + + + onConfirm(rowData.id)}>删除 +
+ ); + }, + }, + ]; + + const onSearchChange = useCallback( + e => { + const value = e.target.value; + setSearchCache(value); + if (!value) { + setSearch(value); + } + onChangeFavorSearch(value); + }, + [onChangeFavorSearch] + ); + + const onSearch = useCallback( + () => { + if (searchCache !== search) { + setSearch(searchCache); + } + onChangeFavorSearch(searchCache); + }, + [search, searchCache, onChangeFavorSearch] + ); + + return ( + <> +
+ +
+
item.id} + onChange={onSortChange} + pagination={{ + onChange: onFavoritePageChange, + position: ['bottomRight'], + total: favoriteQueriesDataTotal, + showSizeChanger: favoriteQueriesDataTotal > 10, + current: pageFavorite, + pageSize: pageSize, + }} + loading={isLoading} + /> + + ); +}; + +export default Favorite; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.module.scss b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.module.scss new file mode 100644 index 000000000..5a2c0c15f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.module.scss @@ -0,0 +1,40 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + + +.searchFavorite { + float: right; + margin:16px 20px; +} + +.breakWord { + cursor: pointer; + word-wrap: break-word; + word-break: break-word; +} + +.highlight { + color: #1890ff; + background-color: #fff; +} + +.searchBar { + margin-bottom: 16px; + text-align: right; +} + diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Home/index.js new file mode 100644 index 000000000..84a6e40b7 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Home/index.js @@ -0,0 +1,177 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 图算法表格 Home + * @author + */ + +import React, {useCallback, useContext} from 'react'; +import GraphAnalysisContext from '../../../Context'; +import {Tabs, message} from 'antd'; +import ExecuteLog from '../ExecuteLog'; +import Favorite from '../Favorite'; +import * as api from '../../../../api/index'; +import c from './index.module.scss'; + +const LogsDetail = props => { + const { + isLoading, + pageExecute, + pageFavorite, + pageSize, + onExecutePageChange, + onFavoritePageChange, + onChangeFavorSearch, + onSortChange, + onRefresh, + favoriteQueriesData, + executionLogsData, + } = props; + + const {graphSpace: currentGraphSpace, graph: currentGraph} = useContext(GraphAnalysisContext); + const {records: favoriteQueriesDataRecords, total: favoriteQueriesDataTotal} = favoriteQueriesData; + const {records: executionLogsDataRecords, total: executionLogsDataTotal} = executionLogsData; + + const addItemByName = useCallback( + (content, favoriteName) => { + const params = { + 'content': content, + 'name': favoriteName, + 'type': 'ALGORITHM', + }; + api.analysis.addFavoriate(currentGraphSpace, currentGraph, params) + .then(res => { + const {status, message: errMsg} = res; + if (status === 200) { + message.success('收藏成功'); + onRefresh(); + } + else { + !errMsg && message.error('收藏失败'); + } + }).catch(err => { + console.error(err); + }); + }, [currentGraph, currentGraphSpace, onRefresh]); + + const onAddHandler = useCallback( + (content, favoriteName) => { + addItemByName(content, favoriteName); + }, + [addItemByName] + ); + + const delItemByRowId = useCallback( + favoriteId => { + api.analysis.deleteQueryCollection(currentGraphSpace, currentGraph, favoriteId) + .then(res => { + const {status, message: errMsg} = res; + if (status === 200) { + message.success('删除成功'); + onRefresh(); + } + else { + !errMsg && message.error('删除失败'); + } + }).catch(err => { + console.error(err); + }); + }, [currentGraph, currentGraphSpace, onRefresh]); + + const onDelHandler = useCallback( + id => { + delItemByRowId(id); + }, + [delItemByRowId] + ); + + const editItemByRow = useCallback( + (rowData, favoriteName) => { + const params = { + id: rowData.id, + content: rowData.content, + name: favoriteName, + 'type': 'ALGORITHM', + }; + api.analysis.editQueryCollection(currentGraphSpace, currentGraph, params) + .then(res => { + const {status, message: errMsg} = res; + if (status === 200) { + message.success('修改成功'); + onRefresh(); + } + else { + !errMsg && message.error('修改失败'); + } + }).catch(err => { + console.error(err); + }); + }, [currentGraph, currentGraphSpace, onRefresh]); + + const onEditHandler = useCallback( + (rowData, favoriteName) => { + editItemByRow(rowData, favoriteName); + }, + [editItemByRow] + ); + + const tabItems = [ + { + label: '执行记录', + key: 'excutes', + children: ( + + ), + }, + { + label: '收藏', + key: 'favorites', + children: ( + + ), + }, + ]; + + return ( +
+ +
+ ); +}; + +export default LogsDetail; diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Home/index.module.scss b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Home/index.module.scss new file mode 100644 index 000000000..b004b8884 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Home/index.module.scss @@ -0,0 +1,46 @@ +/*! + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +.footerTabs { + background-color: #fff; + margin-top: 10px; + + :global { + .ant-table-wrapper { + word-break: break-all; + } + + .ant-tabs-nav { + background-color: #f0f2f5; + } + + .ant-tabs-card .ant-tabs-nav .ant-tabs-tab { + background: #f0f2f5; + border: 0; + } + + .ant-tabs-card .ant-tabs-nav .ant-tabs-tab-active { + background: #fff; + } + + .ant-tabs-content-holder{ + padding: 16px; + } + } +} + diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/AlgorithmNameHeader/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/AlgorithmNameHeader/index.js new file mode 100644 index 000000000..b380b6be8 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/AlgorithmNameHeader/index.js @@ -0,0 +1,154 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +/** + * @file 图分析组件 算法标题 + * @author + */ + +import React from 'react'; +import Highlighter from 'react-highlight-words'; +import {Typography, Tooltip, Button} from 'antd'; +import c from './index.module.scss'; +import classnames from 'classnames'; + +const {Text} = Typography; + +import { + QuestionCircleOutlined, + CaretRightOutlined, +} from '@ant-design/icons'; + +const AlgorithmNameHeader = props => { + const { + icon, + name, + searchValue, + description, + isRunning, + isDisabled, + handleRunning, + highlightName, + } = props; + + const iconClassName = classnames( + c.panelHeaderIcon, + {[c.panelHeaderIconHighlight]: highlightName} + + ); + + const renderAlgorithmName = name => { + let res; + if (name.includes(searchValue)) { + res = ( + + + + ); + } + else { + res = ( + + {name} + + ); + } + if (highlightName) { + res = ( + + + + ); + } + return res; + }; + + const renderRunningButton = () => { + if (!isDisabled) { + return ( + 运行} + color={'#fff'} + > + - - ) : ( - - - - )} - - - )} - - ); -}); - -export const AlgorithmQuery: React.FC = observer(() => { - const dataAnalyzeStore = useContext(DataAnalyzeStoreContext); - const { algorithmAnalyzerStore } = dataAnalyzeStore; - const { t } = useTranslation(); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateShortestPathParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.shortestPathAlgorithmParams.source !== '' && - algorithmAnalyzerStore.shortestPathAlgorithmParams.target !== '' && - algorithmAnalyzerStore.shortestPathAlgorithmParams.max_depth !== ''; - - const handleChangeAlgorithm = (algorithm: string) => () => { - algorithmAnalyzerStore.changeCurrentAlgorithm(algorithm); - }; - - const handleExpandClick = () => { - algorithmAnalyzerStore.switchCollapse(!algorithmAnalyzerStore.isCollapse); - }; - - const renderForms = () => { - switch (algorithmAnalyzerStore.currentAlgorithm) { - case Algorithm.loopDetection: - return ; - case Algorithm.focusDetection: - return ; - case Algorithm.shortestPath: - return ; - case Algorithm.shortestPathAll: - return ; - case Algorithm.allPath: - return ; - case Algorithm.modelSimilarity: - return ; - case Algorithm.neighborRank: - return ; - case Algorithm.kStepNeighbor: - return ; - case Algorithm.kHop: - return ; - case Algorithm.customPath: - return ; - case Algorithm.radiographicInspection: - return ; - case Algorithm.sameNeighbor: - return ; - case Algorithm.weightedShortestPath: - return ; - case Algorithm.singleSourceWeightedShortestPath: - return ; - case Algorithm.jaccard: - return ; - case Algorithm.personalRankRecommendation: - return ; - } - }; - - useEffect(() => { - return () => { - algorithmAnalyzerStore.dispose(); - }; - }, []); - - return ( -
-
- {algorithmAnalyzerStore.currentAlgorithm === '' ? ( - {t('data-analyze.algorithm-list.title')} - ) : ( -
- go-back { - algorithmAnalyzerStore.switchCollapse(false); - algorithmAnalyzerStore.changeCurrentAlgorithm(''); - }} - /> - - {t( - `data-analyze.algorithm-list.${algorithmAnalyzerStore.currentAlgorithm}` - )} - -
- )} -
- expand-collpase -
- {algorithmAnalyzerStore.isCollapse ? null : algorithmAnalyzerStore.currentAlgorithm === - '' ? ( - <> -
- {[ - Algorithm.loopDetection, - Algorithm.focusDetection, - Algorithm.shortestPath, - Algorithm.shortestPathAll, - Algorithm.allPath - ].map((algorithm) => ( - - {t(`data-analyze.algorithm-list.${algorithm}`)} - - ))} -
-
- {[ - Algorithm.modelSimilarity, - Algorithm.neighborRank, - Algorithm.kStepNeighbor, - Algorithm.kHop, - Algorithm.customPath - ].map((algorithm) => ( - - {t(`data-analyze.algorithm-list.${algorithm}`)} - - ))} -
-
- {[ - Algorithm.radiographicInspection, - Algorithm.sameNeighbor, - Algorithm.weightedShortestPath, - Algorithm.singleSourceWeightedShortestPath, - Algorithm.jaccard - ].map((algorithm) => ( - - {t(`data-analyze.algorithm-list.${algorithm}`)} - - ))} -
-
- {[Algorithm.personalRankRecommendation].map((algorithm) => ( - - {t(`data-analyze.algorithm-list.${algorithm}`)} - - ))} -
- - ) : ( - renderForms() - )} -
- ); -}); - -export default QueryAndAlgorithmLibrary; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/AllPath.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/AllPath.tsx deleted file mode 100644 index 8695bb8cf..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/AllPath.tsx +++ /dev/null @@ -1,407 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { GraphManagementStoreContext } from '../../../../stores'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; - -const AllPath = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateAllPathParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.allPathParams.source !== '' && - algorithmAnalyzerStore.allPathParams.target !== '' && - algorithmAnalyzerStore.allPathParams.max_depth !== ''; - - return ( -
-
-
-
- * - - {t('data-analyze.algorithm-forms.all-path.options.source')} - -
- { - algorithmAnalyzerStore.mutateAllPathParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateAllPathParams('source'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateAllPathParams('source'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.all-path.options.label')} - -
- -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.all-path.options.target')} - -
- { - algorithmAnalyzerStore.mutateAllPathParams( - 'target', - e.value as string - ); - - algorithmAnalyzerStore.validateAllPathParams('target'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateAllPathParams('target'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.all-path.options.max_degree')} - - -
- { - algorithmAnalyzerStore.mutateAllPathParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateAllPathParams('max_degree'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateAllPathParams('max_degree'); - } - }} - /> -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.all-path.options.direction')} - -
- ) => { - algorithmAnalyzerStore.mutateAllPathParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - {t('data-analyze.algorithm-forms.all-path.options.capacity')} - -
- { - algorithmAnalyzerStore.mutateAllPathParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateAllPathParams('capacity'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateAllPathParams('capacity'); - } - }} - /> -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.all-path.options.max_depth')} - - -
- { - algorithmAnalyzerStore.mutateAllPathParams( - 'max_depth', - e.value as string - ); - - algorithmAnalyzerStore.validateAllPathParams('max_depth'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateAllPathParams('max_depth'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.all-path.options.limit')} - -
- { - algorithmAnalyzerStore.mutateAllPathParams( - 'limit', - e.value as string - ); - - algorithmAnalyzerStore.validateAllPathParams('limit'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateAllPathParams('limit'); - } - }} - /> -
-
-
- - -
-
- ); -}); - -export default AllPath; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/CustomPath.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/CustomPath.tsx deleted file mode 100644 index e57b2ed59..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/CustomPath.tsx +++ /dev/null @@ -1,1115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { - size, - flatten, - flattenDeep, - uniq, - isEmpty, - cloneDeep, - fromPairs -} from 'lodash-es'; -import { Button, Radio, Input, Select } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { styles } from '../QueryAndAlgorithmLibrary'; -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import { isDataTypeNumeric, calcAlgorithmFormWidth } from '../../../../utils'; - -const CustomPath = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const { t } = useTranslation(); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 390 - ); - - const formWidthInStep = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 310, - 380 - ); - - const formSmallWidthInStep = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 150, - 160 - ); - - const sourceType = algorithmAnalyzerStore.customPathParams.method; - - const allowAddNewProperty = !flatten( - algorithmAnalyzerStore.customPathParams.vertexProperty - ).some((value) => value === ''); - - const addNewPropertyClassName = - allowAddNewProperty && - dataAnalyzeStore.requestStatus.fetchGraphs !== 'pending' - ? 'query-tab-content-internal-expand-manipulation-enable' - : 'query-tab-content-internal-expand-manipulation-disabled'; - - const allowAddNewRuleProperty = !flattenDeep( - algorithmAnalyzerStore.customPathParams.steps.map( - ({ properties }) => properties - ) - ).some((value) => value === ''); - - const addNewRulePropertyClassName = - allowAddNewRuleProperty && - dataAnalyzeStore.requestStatus.fetchGraphs !== 'pending' - ? 'query-tab-content-internal-expand-manipulation-enable' - : 'query-tab-content-internal-expand-manipulation-disabled'; - - const isValidSourceId = - algorithmAnalyzerStore.customPathParams.method === 'id' && - algorithmAnalyzerStore.customPathParams.source !== ''; - - const isValidProperty = - algorithmAnalyzerStore.customPathParams.method === 'property' && - !( - isEmpty(algorithmAnalyzerStore.customPathParams.vertexType) && - flatten( - algorithmAnalyzerStore.customPathParams.vertexProperty - ).every((value) => isEmpty(value)) - ) && - algorithmAnalyzerStore.customPathParams.vertexProperty.every( - ([key, value]) => (!isEmpty(key) ? !isEmpty(value) : true) - ); - - const isValidateRuleProperties = algorithmAnalyzerStore.customPathParams.steps.every( - ({ properties }) => { - if (size(properties) === 1) { - return ( - (isEmpty(properties[0][0]) && isEmpty(properties[0][1])) || - (!isEmpty(properties[0][0]) && !isEmpty(properties[0][1])) - ); - } else { - return properties.every(([, value]) => !isEmpty(value)); - } - } - ); - - const isValidRuleWeight = algorithmAnalyzerStore.customPathParams.steps.every( - ({ weight_by, default_weight }) => - algorithmAnalyzerStore.customPathParams.sort_by === 'NONE' || - (weight_by === '__CUSTOM_WEIGHT__' && default_weight !== '') || - (weight_by !== '__CUSTOM_WEIGHT__' && !isEmpty(weight_by)) - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateCustomPathParmasErrorMessage - ).every((value) => Array.isArray(value) || value === '') && - algorithmAnalyzerStore.validateCustomPathParmasErrorMessage.steps.every( - (step) => Object.values(step).every((value) => value === '') - ) && - (algorithmAnalyzerStore.customPathParams.method === 'id' - ? algorithmAnalyzerStore.customPathParams.source !== '' - : true) && - (isValidSourceId || isValidProperty) && - isValidateRuleProperties && - isValidRuleWeight; - - const isValidAddRule = algorithmAnalyzerStore.validateCustomPathParmasErrorMessage.steps.every( - (step) => Object.values(step).every((value) => value === '') - ); - - return ( -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.custom-path.options.method')} - -
- ) => { - algorithmAnalyzerStore.switchCustomPathMethod(e.target.value); - }} - > - - {t( - 'data-analyze.algorithm-forms.custom-path.radio-value.specific-id' - )} - - - {t( - 'data-analyze.algorithm-forms.custom-path.radio-value.filtered-type-property' - )} - - -
-
- - {sourceType === 'id' && ( -
-
-
- * - - {t('data-analyze.algorithm-forms.custom-path.options.source')} - -
- - { - algorithmAnalyzerStore.mutateCustomPathParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateCustomPathParams('source'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateCustomPathParams('source'); - } - }} - /> -
-
- )} - - {sourceType !== 'id' && ( - <> -
-
-
- - {t( - 'data-analyze.algorithm-forms.custom-path.options.vertex-type' - )} - -
- -
-
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.custom-path.options.vertex-property' - )} - -
- -
- {algorithmAnalyzerStore.customPathParams.vertexProperty.map( - ([key, value], propertyIndex) => { - const currentVertexType = dataAnalyzeStore.vertexTypes.find( - ({ name }) => - name === - algorithmAnalyzerStore.customPathParams.vertexType - ); - - return ( -
- -
- { - const vertexProperty = cloneDeep( - algorithmAnalyzerStore.customPathParams - .vertexProperty - ); - - vertexProperty[propertyIndex][1] = e.value; - - algorithmAnalyzerStore.mutateCustomPathParams( - 'vertexProperty', - vertexProperty - ); - - algorithmAnalyzerStore.validateCustomPathParams( - 'vertexProperty' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateCustomPathParams( - 'vertexProperty' - ); - } - }} - /> -
- {size( - algorithmAnalyzerStore.customPathParams - .vertexProperty - ) > 1 && ( -
{ - algorithmAnalyzerStore.removeCustomPathVertexProperty( - propertyIndex - ); - }} - > - {t( - 'data-analyze.algorithm-forms.custom-path.delete' - )} -
- )} -
- ); - } - )} -
-
-
- {algorithmAnalyzerStore.customPathParams.vertexType === '' && - !allowAddNewProperty && - size(algorithmAnalyzerStore.customPathParams.vertexProperty) === - 1 ? ( -
- - {t( - 'data-analyze.algorithm-forms.custom-path.hint.vertex_type_or_property' - )} - -
- ) : ( -
- { - if ( - allowAddNewProperty && - dataAnalyzeStore.requestStatus.fetchGraphs !== 'pending' - ) { - algorithmAnalyzerStore.addCustomPathVertexProperty(); - } - }} - > - {t('data-analyze.algorithm-forms.custom-path.add')} - -
- )} - - )} - -
-
-
- * - - {t('data-analyze.algorithm-forms.custom-path.options.sort_by')} - -
- ) => { - algorithmAnalyzerStore.mutateCustomPathParams( - 'sort_by', - e.target.value - ); - - if (e.target.value === 'NONE') { - algorithmAnalyzerStore.customPathParams.steps.forEach( - (_, ruleIndex) => { - algorithmAnalyzerStore.mutateCustomPathRuleParams( - 'weight_by', - '', - ruleIndex - ); - - algorithmAnalyzerStore.mutateCustomPathRuleParams( - 'default_weight', - '', - ruleIndex - ); - } - ); - } - }} - > - - {t('data-analyze.algorithm-forms.custom-path.radio-value.none')} - - - {t( - 'data-analyze.algorithm-forms.custom-path.radio-value.ascend' - )} - - - {t( - 'data-analyze.algorithm-forms.custom-path.radio-value.descend' - )} - - -
-
-
-
-
- - {t('data-analyze.algorithm-forms.custom-path.options.capacity')} - -
- { - algorithmAnalyzerStore.mutateCustomPathParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateCustomPathParams('capacity'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateCustomPathParams('capacity'); - } - }} - /> -
-
-
-
-
- - {t('data-analyze.algorithm-forms.custom-path.options.limit')} - -
- { - algorithmAnalyzerStore.mutateCustomPathParams( - 'limit', - e.value as string - ); - - algorithmAnalyzerStore.validateCustomPathParams('limit'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateCustomPathParams('limit'); - } - }} - /> -
-
-
- - -
-
- -
- {algorithmAnalyzerStore.customPathParams.steps.map( - ( - { - uuid, - direction, - labels, - degree, - sample, - properties, - weight_by, - default_weight - }, - ruleIndex - ) => { - return ( -
-
-
- * - - {t( - 'data-analyze.algorithm-forms.custom-path.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateCustomPathRuleParams( - 'direction', - e.target.value, - ruleIndex - ); - }} - > - both - out - in - - {size(algorithmAnalyzerStore.customPathParams.steps) > 1 && ( -
{ - algorithmAnalyzerStore.removeCustomPathRule(ruleIndex); - }} - > - 删除 -
- )} -
-
-
- - {t( - 'data-analyze.algorithm-forms.custom-path.options.labels' - )} - -
- -
- -
-
- - {t( - 'data-analyze.algorithm-forms.custom-path.options.properties' - )} - -
-
- <> - {properties.map(([key, value], propertyIndex) => { - return ( -
-
- -
- -
- { - const clonedRuleProperties = cloneDeep( - properties - ); - - clonedRuleProperties[propertyIndex][1] = - e.value; - - algorithmAnalyzerStore.mutateCustomPathRuleParams( - 'properties', - clonedRuleProperties, - ruleIndex - ); - }} - /> -
- - {size(properties) > 1 && ( -
{ - algorithmAnalyzerStore.removeCustomPathRuleProperty( - ruleIndex, - propertyIndex - ); - }} - > - {t( - 'data-analyze.algorithm-forms.custom-path.delete' - )} -
- )} -
- ); - })} - -
- { - if ( - allowAddNewRuleProperty && - dataAnalyzeStore.requestStatus.fetchGraphs !== - 'pending' - ) { - algorithmAnalyzerStore.addCustomPathRuleProperty( - ruleIndex - ); - } - }} - > - {t('data-analyze.algorithm-forms.custom-path.add')} - -
- -
-
- - {algorithmAnalyzerStore.customPathParams.sort_by !== 'NONE' && ( -
-
- * - - {t( - 'data-analyze.algorithm-forms.custom-path.options.weight_by' - )} - -
- -
- )} - {algorithmAnalyzerStore.customPathParams.steps[ruleIndex] - .weight_by === '__CUSTOM_WEIGHT__' && ( -
-
- -
- { - algorithmAnalyzerStore.mutateCustomPathRuleParams( - 'default_weight', - e.value as string, - ruleIndex - ); - - algorithmAnalyzerStore.validateCustomPathRules( - 'default_weight', - ruleIndex - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateCustomPathRules( - 'default_weight', - ruleIndex - ); - } - }} - /> -
- )} -
-
- - {t( - 'data-analyze.algorithm-forms.custom-path.options.degree' - )} - -
- { - algorithmAnalyzerStore.mutateCustomPathRuleParams( - 'degree', - e.value as string, - ruleIndex - ); - - algorithmAnalyzerStore.validateCustomPathRules( - 'degree', - ruleIndex - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateCustomPathRules( - 'degree', - ruleIndex - ); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.custom-path.options.sample' - )} - -
- { - algorithmAnalyzerStore.mutateCustomPathRuleParams( - 'sample', - e.value as string, - ruleIndex - ); - - algorithmAnalyzerStore.validateCustomPathRules( - 'sample', - ruleIndex - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateCustomPathRules( - 'sample', - ruleIndex - ); - } - }} - /> -
-
- ); - } - )} -
- { - if (isValidAddRule) { - algorithmAnalyzerStore.addCustomPathRule(); - } - }} - > - {t('data-analyze.algorithm-forms.custom-path.add-new-rule')} - -
-
-
- ); -}); - -export default CustomPath; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/FocusDetection.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/FocusDetection.tsx deleted file mode 100644 index 58a37782c..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/FocusDetection.tsx +++ /dev/null @@ -1,423 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, createContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select, Switch } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { GraphManagementStoreContext } from '../../../../stores'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -const FocusDetection = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateFocusDetectionParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.focusDetectionParams.source !== '' && - algorithmAnalyzerStore.focusDetectionParams.target !== '' && - algorithmAnalyzerStore.focusDetectionParams.max_depth !== ''; - - return ( -
-
-
-
- * - - {t('data-analyze.algorithm-forms.focus-detection.options.source')} - -
- { - algorithmAnalyzerStore.mutateFocusDetectionParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateFocusDetectionParams('source'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateFocusDetectionParams('source'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.focus-detection.options.label')} - -
- -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.focus-detection.options.target')} - -
- { - algorithmAnalyzerStore.mutateFocusDetectionParams( - 'target', - e.value as string - ); - - algorithmAnalyzerStore.validateFocusDetectionParams('target'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateFocusDetectionParams('target'); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.focus-detection.options.max_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateFocusDetectionParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateFocusDetectionParams('max_degree'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateFocusDetectionParams( - 'max_degree' - ); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.focus-detection.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateFocusDetectionParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - {t( - 'data-analyze.algorithm-forms.focus-detection.options.capacity' - )} - -
- { - algorithmAnalyzerStore.mutateFocusDetectionParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateFocusDetectionParams('capacity'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateFocusDetectionParams('capacity'); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.focus-detection.options.max_depth' - )} - - -
- { - algorithmAnalyzerStore.mutateFocusDetectionParams( - 'max_depth', - e.value as string - ); - - algorithmAnalyzerStore.validateFocusDetectionParams('max_depth'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateFocusDetectionParams( - 'max_depth' - ); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.focus-detection.options.limit')} - -
- { - algorithmAnalyzerStore.mutateFocusDetectionParams( - 'limit', - e.value as string - ); - - algorithmAnalyzerStore.validateFocusDetectionParams('limit'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateFocusDetectionParams('limit'); - } - }} - /> -
-
-
- - -
-
- ); -}); - -export default FocusDetection; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/Jaccard.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/Jaccard.tsx deleted file mode 100644 index 8dcb148f4..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/Jaccard.tsx +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; - -const Jaccard = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const { t } = useTranslation(); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateJaccardParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.jaccardParams.vertex !== '' && - algorithmAnalyzerStore.jaccardParams.other !== ''; - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - return ( -
-
-
-
- * - - {t('data-analyze.algorithm-forms.jaccard.options.vertex')} - -
- { - algorithmAnalyzerStore.mutateJaccardParams( - 'vertex', - e.value as string - ); - - algorithmAnalyzerStore.validateJaccardParams('vertex'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateJaccardParams('vertex'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.jaccard.options.label')} - -
- -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.jaccard.options.other')} - -
- { - algorithmAnalyzerStore.mutateJaccardParams( - 'other', - e.value as string - ); - - algorithmAnalyzerStore.validateJaccardParams('other'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateJaccardParams('other'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.jaccard.options.max_degree')} - - -
- { - algorithmAnalyzerStore.mutateJaccardParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateJaccardParams('max_degree'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateJaccardParams('max_degree'); - } - }} - /> -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.jaccard.options.direction')} - -
- ) => { - algorithmAnalyzerStore.mutateJaccardParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - -
-
- ); -}); - -export default Jaccard; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/KHop.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/KHop.tsx deleted file mode 100644 index bd12e6f83..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/KHop.tsx +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select, Switch } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; -import { styles } from '../QueryAndAlgorithmLibrary'; - -import { Tooltip as CustomTooltip } from '../../../common'; -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; - -const KHop = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - const isValidExec = - Object.values(algorithmAnalyzerStore.validateKHopParamsErrorMessage).every( - (value) => value === '' - ) && - algorithmAnalyzerStore.kHopParams.source !== '' && - algorithmAnalyzerStore.kHopParams.max_depth !== ''; - - return ( -
-
-
-
- * - - {t('data-analyze.algorithm-forms.k-hop.options.source')} - -
- { - algorithmAnalyzerStore.mutateKHopParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateKHopParams('source'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateKHopParams('source'); - } - }} - /> -
-
-
- {t('data-analyze.algorithm-forms.k-hop.options.label')} -
- -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.k-hop.options.direction')} - -
- ) => { - algorithmAnalyzerStore.mutateKHopParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - {t('data-analyze.algorithm-forms.k-hop.options.max_degree')} - - -
- { - algorithmAnalyzerStore.mutateKHopParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateKHopParams('max_degree'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateKHopParams('max_degree'); - } - }} - /> -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.k-hop.options.max_depth')} - - -
- { - algorithmAnalyzerStore.mutateKHopParams( - 'max_depth', - e.value as string - ); - - algorithmAnalyzerStore.validateKHopParams('max_depth'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateKHopParams('max_depth'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.k-hop.options.capacity')} - -
- { - algorithmAnalyzerStore.mutateKHopParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateKHopParams('capacity'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateKHopParams('capacity'); - } - }} - /> -
-
-
-
-
- - {t('data-analyze.algorithm-forms.k-hop.options.nearest')} - - -
- { - algorithmAnalyzerStore.mutateKHopParams('nearest', checked); - }} - /> -
-
-
- {t('data-analyze.algorithm-forms.k-hop.options.limit')} -
- { - algorithmAnalyzerStore.mutateKHopParams( - 'limit', - e.value as string - ); - - algorithmAnalyzerStore.validateKHopParams('limit'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateKHopParams('limit'); - } - }} - /> -
-
-
- - -
-
- ); -}); - -export default KHop; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/KStepNeighbor.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/KStepNeighbor.tsx deleted file mode 100644 index 6b46cd94a..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/KStepNeighbor.tsx +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; - -const KStepNeighbor = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateKStepNeighborParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.kStepNeighborParams.source !== '' && - algorithmAnalyzerStore.kStepNeighborParams.max_depth !== ''; - - return ( -
-
-
-
- * - - {t('data-analyze.algorithm-forms.k-step-neighbor.options.source')} - -
- { - algorithmAnalyzerStore.mutateKStepNeighborParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateKStepNeighborParams('source'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateKStepNeighborParams('source'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.k-step-neighbor.options.label')} - -
- -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.k-step-neighbor.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateKStepNeighborParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - {t( - 'data-analyze.algorithm-forms.k-step-neighbor.options.max_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateKStepNeighborParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateKStepNeighborParams('max_degree'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateKStepNeighborParams( - 'max_degree' - ); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.k-step-neighbor.options.max_depth' - )} - - -
- { - algorithmAnalyzerStore.mutateKStepNeighborParams( - 'max_depth', - e.value as string - ); - - algorithmAnalyzerStore.validateKStepNeighborParams('max_depth'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateKStepNeighborParams('max_depth'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.k-step-neighbor.options.limit')} - -
- { - algorithmAnalyzerStore.mutateKStepNeighborParams( - 'limit', - e.value as string - ); - - algorithmAnalyzerStore.validateKStepNeighborParams('limit'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateKStepNeighborParams('limit'); - } - }} - /> -
-
-
- - -
-
- ); -}); - -export default KStepNeighbor; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/LoopDetection.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/LoopDetection.tsx deleted file mode 100644 index 49b134db7..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/LoopDetection.tsx +++ /dev/null @@ -1,407 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select, Switch } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import { GraphManagementStoreContext } from '../../../../stores'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; - -const LoopDetection = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateLoopDetectionParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.loopDetectionParams.source !== '' && - algorithmAnalyzerStore.loopDetectionParams.max_depth !== ''; - - return ( -
-
-
-
- * - - {t('data-analyze.algorithm-forms.loop-detection.options.source')} - -
- { - algorithmAnalyzerStore.mutateLoopDetectionParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateLoopDetectionParams('source'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateLoopDetectionParams('source'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.loop-detection.options.label')} - -
- -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.loop-detection.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateLoopDetectionParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - {t( - 'data-analyze.algorithm-forms.loop-detection.options.max_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateLoopDetectionParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateLoopDetectionParams('max_degree'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateLoopDetectionParams( - 'max_degree' - ); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.loop-detection.options.max_depth' - )} - - -
- { - algorithmAnalyzerStore.mutateLoopDetectionParams( - 'max_depth', - e.value as string - ); - - algorithmAnalyzerStore.validateLoopDetectionParams('max_depth'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateLoopDetectionParams('max_depth'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.loop-detection.options.limit')} - -
- { - algorithmAnalyzerStore.mutateLoopDetectionParams( - 'limit', - e.value as string - ); - - algorithmAnalyzerStore.validateLoopDetectionParams('limit'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateLoopDetectionParams('limit'); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.loop-detection.options.source_in_ring' - )} - -
- { - algorithmAnalyzerStore.mutateLoopDetectionParams( - 'source_in_ring', - checked - ); - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.loop-detection.options.capacity' - )} - -
- { - algorithmAnalyzerStore.mutateLoopDetectionParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateLoopDetectionParams('capacity'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateLoopDetectionParams('capacity'); - } - }} - /> -
-
-
- - -
-
- ); -}); - -export default LoopDetection; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ModelSimilarity.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ModelSimilarity.tsx deleted file mode 100644 index 4ad2ed7ab..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ModelSimilarity.tsx +++ /dev/null @@ -1,1166 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { flatten, cloneDeep, size, isEmpty } from 'lodash-es'; -import { Button, Radio, Input, Select, Switch } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; - -const ModelSimilarity = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 390 - ); - - const sourceType = algorithmAnalyzerStore.modelSimilarityParams.method; - - const allowAddNewProperty = !flatten( - algorithmAnalyzerStore.modelSimilarityParams.vertexProperty - ).some((value) => value === ''); - - const addNewPropertyClassName = - allowAddNewProperty && - dataAnalyzeStore.requestStatus.fetchGraphs !== 'pending' - ? 'query-tab-content-internal-expand-manipulation-enable' - : 'query-tab-content-internal-expand-manipulation-disabled'; - - const isValidSourceId = - algorithmAnalyzerStore.modelSimilarityParams.method === 'id' && - algorithmAnalyzerStore.modelSimilarityParams.source !== ''; - - const isValidProperty = - algorithmAnalyzerStore.modelSimilarityParams.method === 'property' && - !( - isEmpty(algorithmAnalyzerStore.modelSimilarityParams.vertexType) && - flatten( - algorithmAnalyzerStore.modelSimilarityParams.vertexProperty - ).every((value) => isEmpty(value)) - ) && - algorithmAnalyzerStore.modelSimilarityParams.vertexProperty.every( - ([key, value]) => (!isEmpty(key) ? !isEmpty(value) : true) - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateModelSimilartiyParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.modelSimilarityParams.least_neighbor !== '' && - algorithmAnalyzerStore.modelSimilarityParams.similarity !== '' && - (!isEmpty(algorithmAnalyzerStore.modelSimilarityParams.property_filter) - ? algorithmAnalyzerStore.modelSimilarityParams.least_property_number !== - '' - : true) && - (isValidSourceId || isValidProperty); - - return ( -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.model-similarity.options.method' - )} - -
- ) => { - algorithmAnalyzerStore.switchModelSimilarityMethod( - e.target.value - ); - }} - > - - {t( - 'data-analyze.algorithm-forms.model-similarity.radio-value.specific-id' - )} - - - {t( - 'data-analyze.algorithm-forms.model-similarity.radio-value.filtered-type-property' - )} - - -
-
- - {sourceType === 'id' && ( -
-
-
- * - - {t( - 'data-analyze.algorithm-forms.model-similarity.options.source' - )} - -
- - { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateModelSimilarityParams( - 'source' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateModelSimilarityParams( - 'source' - ); - } - }} - /> -
-
- )} - - {sourceType !== 'id' && ( - <> -
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.vertex-type' - )} - -
- -
-
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.vertex-property' - )} - -
- -
- {algorithmAnalyzerStore.modelSimilarityParams.vertexProperty.map( - ([key, value], propertyIndex) => { - const currentVertexType = dataAnalyzeStore.vertexTypes.find( - ({ name }) => - name === - algorithmAnalyzerStore.modelSimilarityParams - .vertexType - ); - - return ( -
- -
- { - const vertexProperty = cloneDeep( - algorithmAnalyzerStore.modelSimilarityParams - .vertexProperty - ); - - vertexProperty[propertyIndex][1] = e.value; - - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'vertexProperty', - vertexProperty - ); - - algorithmAnalyzerStore.validateModelSimilarityParams( - 'vertexProperty' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateModelSimilarityParams( - 'vertexProperty' - ); - } - }} - /> -
- {size( - algorithmAnalyzerStore.modelSimilarityParams - .vertexProperty - ) > 1 && ( -
{ - algorithmAnalyzerStore.removeModelSimilarityVertexProperty( - propertyIndex - ); - }} - > - {t( - 'data-analyze.algorithm-forms.model-similarity.delete' - )} -
- )} -
- ); - } - )} -
-
-
- {algorithmAnalyzerStore.modelSimilarityParams.vertexType === '' && - !allowAddNewProperty && - size( - algorithmAnalyzerStore.modelSimilarityParams.vertexProperty - ) === 1 ? ( -
- - {t( - 'data-analyze.algorithm-forms.model-similarity.hint.vertex_type_or_property' - )} - -
- ) : ( -
- { - if ( - allowAddNewProperty && - dataAnalyzeStore.requestStatus.fetchGraphs !== 'pending' - ) { - algorithmAnalyzerStore.addModelSimilarityVertexProperty(); - } - }} - > - {t('data-analyze.algorithm-forms.model-similarity.add')} - -
- )} - - )} - -
-
-
- * - - {t( - 'data-analyze.algorithm-forms.model-similarity.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
- -
-
-
- * - - {t( - 'data-analyze.algorithm-forms.model-similarity.options.least_neighbor' - )} - - -
- { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'least_neighbor', - e.value as string - ); - - algorithmAnalyzerStore.validateModelSimilarityParams( - 'least_neighbor' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateModelSimilarityParams( - 'least_neighbor' - ); - } - }} - /> -
-
- -
-
-
- * - - {t( - 'data-analyze.algorithm-forms.model-similarity.options.similarity' - )} - - -
- - { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'similarity', - e.value as string - ); - - algorithmAnalyzerStore.validateModelSimilarityParams( - 'similarity' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateModelSimilarityParams( - 'similarity' - ); - } - }} - /> -
-
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.label' - )} - -
- -
-
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.max_similar' - )} - - -
- { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'max_similar', - e.value as string - ); - - algorithmAnalyzerStore.validateModelSimilarityParams( - 'max_similar' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateModelSimilarityParams( - 'max_similar' - ); - } - }} - /> -
-
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.least_similar' - )} - -
- { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'least_similar', - e.value as string - ); - - algorithmAnalyzerStore.validateModelSimilarityParams( - 'least_similar' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateModelSimilarityParams( - 'least_similar' - ); - } - }} - /> -
-
- -
- - -
-
- -
-
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.property_filter' - )} - -
- -
-
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.least_property_number' - )} - - -
- { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'least_property_number', - e.value as string - ); - - algorithmAnalyzerStore.validateModelSimilarityParams( - 'least_property_number' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateModelSimilarityParams( - 'least_property_number' - ); - } - }} - /> -
-
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.max_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateModelSimilarityParams( - 'max_degree' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateModelSimilarityParams( - 'max_degree' - ); - } - }} - /> -
-
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.capacity' - )} - -
- { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateModelSimilarityParams( - 'capacity' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateModelSimilarityParams( - 'capacity' - ); - } - }} - /> -
-
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.limit' - )} - -
- { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'limit', - e.value as string - ); - - algorithmAnalyzerStore.validateModelSimilarityParams('limit'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateModelSimilarityParams('limit'); - } - }} - /> -
-
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.return_common_connection' - )} - - -
-
- { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'return_common_connection', - checked - ); - }} - /> -
-
-
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.model-similarity.options.return_complete_info' - )} - -
-
- { - algorithmAnalyzerStore.mutateModelSimilarityParams( - 'return_complete_info', - checked - ); - }} - /> -
-
-
-
-
- ); -}); - -export default ModelSimilarity; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/NeighborRank.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/NeighborRank.tsx deleted file mode 100644 index 845fd268f..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/NeighborRank.tsx +++ /dev/null @@ -1,500 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { size } from 'lodash-es'; -import { useTranslation } from 'react-i18next'; -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Button, Radio, Input, Select } from 'hubble-ui'; - -import { Tooltip as CustomTooltip } from '../../../common'; -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; - -const NeighborRank = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - const formWidthInStep = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 310, - 380 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateNeighborRankParamsParamsErrorMessage - ).every((value) => Array.isArray(value) || value === '') && - algorithmAnalyzerStore.validateNeighborRankParamsParamsErrorMessage.steps.every( - (step) => Object.values(step).every((value) => value === '') - ) && - algorithmAnalyzerStore.neighborRankParams.source !== '' && - algorithmAnalyzerStore.neighborRankParams.alpha !== ''; - - const isValidAddRule = algorithmAnalyzerStore.validateNeighborRankParamsParamsErrorMessage.steps.every( - (step) => Object.values(step).every((value) => value === '') - ); - - return ( -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.neighbor-rank.options.source')} - -
- { - algorithmAnalyzerStore.mutateNeighborRankParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateNeighborRankParams('source'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateNeighborRankParams('source'); - } - }} - /> -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.neighbor-rank.options.alpha')} - -
- { - algorithmAnalyzerStore.mutateNeighborRankParams( - 'alpha', - e.value as string - ); - - algorithmAnalyzerStore.validateNeighborRankParams('alpha'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateNeighborRankParams('alpha'); - } - }} - /> -
-
-
-
-
- - {t( - 'data-analyze.algorithm-forms.neighbor-rank.options.capacity' - )} - -
- { - algorithmAnalyzerStore.mutateNeighborRankParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateNeighborRankParams('capacity'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateNeighborRankParams('capacity'); - } - }} - /> -
-
-
- - -
-
- -
- {algorithmAnalyzerStore.neighborRankParams.steps.map( - ({ uuid, direction, labels, degree, top }, ruleIndex) => { - return ( -
-
-
- * - - {t( - 'data-analyze.algorithm-forms.neighbor-rank.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateNeighborRankRuleParams( - 'direction', - e.target.value, - ruleIndex - ); - }} - > - both - out - in - - {size(algorithmAnalyzerStore.neighborRankParams.steps) > - 1 && ( -
{ - algorithmAnalyzerStore.removeNeighborRankRule( - ruleIndex - ); - }} - > - {t('addition.common.del')} -
- )} -
-
-
- - {t( - 'data-analyze.algorithm-forms.neighbor-rank.options.label' - )} - -
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.neighbor-rank.options.degree' - )} - - -
- { - algorithmAnalyzerStore.mutateNeighborRankRuleParams( - 'degree', - e.value as string, - ruleIndex - ); - - algorithmAnalyzerStore.validateNeighborRankRules( - 'degree', - ruleIndex - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateNeighborRankRules( - 'degree', - ruleIndex - ); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.neighbor-rank.options.top' - )} - - -
- { - algorithmAnalyzerStore.mutateNeighborRankRuleParams( - 'top', - e.value as string, - ruleIndex - ); - - algorithmAnalyzerStore.validateNeighborRankRules( - 'top', - ruleIndex - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateNeighborRankRules( - 'top', - ruleIndex - ); - } - }} - /> -
-
- ); - } - )} -
- { - if (isValidAddRule) { - algorithmAnalyzerStore.addNeighborRankRule(); - } - }} - > - {t('data-analyze.algorithm-forms.neighbor-rank.add-new-rule')} - -
-
-
- ); -}); - -export default NeighborRank; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/PersonalRank.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/PersonalRank.tsx deleted file mode 100644 index 866b8dbfd..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/PersonalRank.tsx +++ /dev/null @@ -1,451 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select, Switch } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; - -const PersonalRank = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validatePersonalRankErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.personalRankParams.source !== '' && - algorithmAnalyzerStore.personalRankParams.alpha !== '' && - algorithmAnalyzerStore.personalRankParams.label !== '' && - algorithmAnalyzerStore.personalRankParams.max_depth !== ''; - - return ( -
-
-
-
- * - - {t('data-analyze.algorithm-forms.personal-rank.options.source')} - -
- { - algorithmAnalyzerStore.mutatePersonalRankParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validatePersonalRankParams('source'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validatePersonalRankParams('source'); - } - }} - /> -
-
-
- * - - {t('data-analyze.algorithm-forms.personal-rank.options.label')} - -
- -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.personal-rank.options.alpha')} - -
- { - algorithmAnalyzerStore.mutatePersonalRankParams( - 'alpha', - e.value as string - ); - - algorithmAnalyzerStore.validatePersonalRankParams('alpha'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validatePersonalRankParams('alpha'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.personal-rank.options.degree')} - - -
- { - algorithmAnalyzerStore.mutatePersonalRankParams( - 'degree', - e.value as string - ); - - algorithmAnalyzerStore.validatePersonalRankParams('degree'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validatePersonalRankParams('degree'); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.personal-rank.options.max_depth' - )} - -
- { - algorithmAnalyzerStore.mutatePersonalRankParams( - 'max_depth', - e.value as string - ); - - algorithmAnalyzerStore.validatePersonalRankParams('max_depth'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validatePersonalRankParams('max_depth'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.personal-rank.options.limit')} - -
- { - algorithmAnalyzerStore.mutatePersonalRankParams( - 'limit', - e.value as string - ); - - algorithmAnalyzerStore.validatePersonalRankParams('limit'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validatePersonalRankParams('limit'); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.personal-rank.options.with_label' - )} - - -
- ) => { - algorithmAnalyzerStore.mutatePersonalRankParams( - 'with_label', - e.target.value - ); - }} - > - - {t( - 'data-analyze.algorithm-forms.personal-rank.with-label-radio-value.same_label' - )} - - - {t( - 'data-analyze.algorithm-forms.personal-rank.with-label-radio-value.other_label' - )} - - - {t( - 'data-analyze.algorithm-forms.personal-rank.with-label-radio-value.both_label' - )} - - -
-
-
- - {t('data-analyze.algorithm-forms.personal-rank.options.sorted')} - - -
-
- { - algorithmAnalyzerStore.mutatePersonalRankParams( - 'sorted', - checked - ); - }} - /> -
-
-
-
- - -
-
- ); -}); - -export default PersonalRank; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/RadiographicInspection.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/RadiographicInspection.tsx deleted file mode 100644 index 682424fd3..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/RadiographicInspection.tsx +++ /dev/null @@ -1,422 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; - -const RadiographicInspection = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateRadiographicInspectionParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.radiographicInspectionParams.source !== '' && - algorithmAnalyzerStore.radiographicInspectionParams.max_depth !== ''; - - return ( -
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.radiographic-inspection.options.source' - )} - -
- { - algorithmAnalyzerStore.mutateRadiographicInspectionParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateRadiographicInspectionParams( - 'source' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateRadiographicInspectionParams( - 'source' - ); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.radiographic-inspection.options.label' - )} - -
- -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.radiographic-inspection.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateRadiographicInspectionParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - {t( - 'data-analyze.algorithm-forms.radiographic-inspection.options.max_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateRadiographicInspectionParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateRadiographicInspectionParams( - 'max_degree' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateRadiographicInspectionParams( - 'max_degree' - ); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.radiographic-inspection.options.max_depth' - )} - - -
- { - algorithmAnalyzerStore.mutateRadiographicInspectionParams( - 'max_depth', - e.value as string - ); - - algorithmAnalyzerStore.validateRadiographicInspectionParams( - 'max_depth' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateRadiographicInspectionParams( - 'max_depth' - ); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.radiographic-inspection.options.capacity' - )} - -
- { - algorithmAnalyzerStore.mutateRadiographicInspectionParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateRadiographicInspectionParams( - 'capacity' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateRadiographicInspectionParams( - 'capacity' - ); - } - }} - /> -
-
-
-
-
-
- - {t( - 'data-analyze.algorithm-forms.radiographic-inspection.options.limit' - )} - -
- { - algorithmAnalyzerStore.mutateRadiographicInspectionParams( - 'limit', - e.value as string - ); - - algorithmAnalyzerStore.validateRadiographicInspectionParams( - 'limit' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateRadiographicInspectionParams( - 'limit' - ); - } - }} - /> -
-
-
- - -
-
- ); -}); - -export default RadiographicInspection; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/SameNeighbor.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/SameNeighbor.tsx deleted file mode 100644 index 84496448d..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/SameNeighbor.tsx +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; - -const SameNeighbor = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateSameNeighborParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.sameNeighborParams.vertex !== '' && - algorithmAnalyzerStore.sameNeighborParams.other !== ''; - - return ( -
-
-
-
- * - - {t('data-analyze.algorithm-forms.same-neighbor.options.vertex')} - -
- { - algorithmAnalyzerStore.mutateSameNeighborParams( - 'vertex', - e.value as string - ); - - algorithmAnalyzerStore.validateSameNeighborParams('vertex'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateSameNeighborParams('vertex'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.same-neighbor.options.label')} - -
- -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.same-neighbor.options.other')} - -
- { - algorithmAnalyzerStore.mutateSameNeighborParams( - 'other', - e.value as string - ); - - algorithmAnalyzerStore.validateSameNeighborParams('other'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateSameNeighborParams('other'); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.same-neighbor.options.max_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateSameNeighborParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateSameNeighborParams('max_degree'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateSameNeighborParams('max_degree'); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.same-neighbor.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateSameNeighborParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - {t('data-analyze.algorithm-forms.same-neighbor.options.limit')} - -
- { - algorithmAnalyzerStore.mutateSameNeighborParams( - 'limit', - e.value as string - ); - - algorithmAnalyzerStore.validateSameNeighborParams('limit'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateSameNeighborParams('limit'); - } - }} - /> -
-
-
- - -
-
- ); -}); - -export default SameNeighbor; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ShortestPath.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ShortestPath.tsx deleted file mode 100644 index 1df1a02ce..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ShortestPath.tsx +++ /dev/null @@ -1,454 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; - -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -const ShortestPath = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateShortestPathParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.shortestPathAlgorithmParams.source !== '' && - algorithmAnalyzerStore.shortestPathAlgorithmParams.target !== '' && - algorithmAnalyzerStore.shortestPathAlgorithmParams.max_depth !== ''; - - return ( -
-
-
-
- * - - {t('data-analyze.algorithm-forms.shortest-path.options.source')} - -
- { - algorithmAnalyzerStore.mutateShortestPathParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathParams('source'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathParams('source'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.shortest-path.options.label')} - -
- -
-
-
-
-
- * - - {t('data-analyze.algorithm-forms.shortest-path.options.target')} - -
- { - algorithmAnalyzerStore.mutateShortestPathParams( - 'target', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathParams('target'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathParams('target'); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.shortest-path.options.max_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateShortestPathParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathParams('max_degree'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathParams('max_degree'); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.shortest-path.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateShortestPathParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - {t( - 'data-analyze.algorithm-forms.shortest-path.options.skip_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateShortestPathParams( - 'skip_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathParams('skip_degree'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathParams( - 'skip_degree' - ); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.shortest-path.options.max_depth' - )} - - -
- { - algorithmAnalyzerStore.mutateShortestPathParams( - 'max_depth', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathParams('max_depth'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathParams('max_depth'); - } - }} - /> -
-
-
- - {t('data-analyze.algorithm-forms.shortest-path.options.capacity')} - -
- { - algorithmAnalyzerStore.mutateShortestPathParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathParams('capacity'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathParams('capacity'); - } - }} - /> -
-
-
- - -
-
- ); -}); - -export default ShortestPath; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ShortestPathAll.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ShortestPathAll.tsx deleted file mode 100644 index aa206b120..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/ShortestPathAll.tsx +++ /dev/null @@ -1,469 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, createContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select, Switch } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; - -const ShortestPathAll = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 400 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateShortestPathAllParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.shortestPathAllParams.source !== '' && - algorithmAnalyzerStore.shortestPathAllParams.target !== '' && - algorithmAnalyzerStore.shortestPathAllParams.max_depth !== ''; - - return ( -
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.shortest-path-all.options.source' - )} - -
- { - algorithmAnalyzerStore.mutateShortestPathAllParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathAllParams('source'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathAllParams('source'); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.shortest-path-all.options.label' - )} - -
- -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.shortest-path-all.options.target' - )} - -
- { - algorithmAnalyzerStore.mutateShortestPathAllParams( - 'target', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathAllParams('target'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathAllParams('target'); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.shortest-path-all.options.max_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateShortestPathAllParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathAllParams( - 'max_degree' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathAllParams( - 'max_degree' - ); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.shortest-path-all.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateShortestPathAllParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - {t( - 'data-analyze.algorithm-forms.shortest-path-all.options.capacity' - )} - -
- { - algorithmAnalyzerStore.mutateShortestPathAllParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathAllParams('capacity'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathAllParams( - 'capacity' - ); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.shortest-path-all.options.max_depth' - )} - - -
- { - algorithmAnalyzerStore.mutateShortestPathAllParams( - 'max_depth', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathAllParams('max_depth'); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathAllParams( - 'max_depth' - ); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.shortest-path-all.options.skip_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateShortestPathAllParams( - 'skip_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateShortestPathAllParams( - 'skip_degree' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateShortestPathAllParams( - 'skip_degree' - ); - } - }} - /> -
-
-
- - -
-
- ); -}); - -export default ShortestPathAll; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/SingleSourceWeightedShortestPath.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/SingleSourceWeightedShortestPath.tsx deleted file mode 100644 index 3a84bf16b..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/SingleSourceWeightedShortestPath.tsx +++ /dev/null @@ -1,522 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select, Switch } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; - -import { GraphManagementStoreContext } from '../../../../stores'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { isDataTypeNumeric, calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; - -const SingleSourceWeightedShortestPath = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 340, - 380 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateSingleSourceWeightedShortestPathParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.singleSourceWeightedShortestPathParams.source !== ''; - - return ( -
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.options.source' - )} - -
- { - algorithmAnalyzerStore.mutateSingleSourceWeightedShortestPathParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateSingleSourceWeightedShortestPathParams( - 'source' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateSingleSourceWeightedShortestPathParams( - 'source' - ); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.options.label' - )} - -
- -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateSingleSourceWeightedShortestPathParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - {t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.options.max_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateSingleSourceWeightedShortestPathParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateSingleSourceWeightedShortestPathParams( - 'max_degree' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateSingleSourceWeightedShortestPathParams( - 'max_degree' - ); - } - }} - /> -
-
-
-
-
- - {t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.options.weight' - )} - -
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.options.skip_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateSingleSourceWeightedShortestPathParams( - 'skip_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateSingleSourceWeightedShortestPathParams( - 'skip_degree' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateSingleSourceWeightedShortestPathParams( - 'skip_degree' - ); - } - }} - /> -
-
-
-
-
- - {t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.options.with_vertex' - )} - -
- { - algorithmAnalyzerStore.mutateSingleSourceWeightedShortestPathParams( - 'with_vertex', - checked - ); - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.options.capacity' - )} - -
- { - algorithmAnalyzerStore.mutateSingleSourceWeightedShortestPathParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateSingleSourceWeightedShortestPathParams( - 'capacity' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateSingleSourceWeightedShortestPathParams( - 'capacity' - ); - } - }} - /> -
-
-
-
-
-
- - {t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.options.limit' - )} - -
- { - algorithmAnalyzerStore.mutateSingleSourceWeightedShortestPathParams( - 'limit', - e.value as string - ); - - algorithmAnalyzerStore.validateSingleSourceWeightedShortestPathParams( - 'limit' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateSingleSourceWeightedShortestPathParams( - 'limit' - ); - } - }} - /> -
-
-
- - -
-
- ); -}); - -export default SingleSourceWeightedShortestPath; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/WeightedShortestPath.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/WeightedShortestPath.tsx deleted file mode 100644 index 26098f650..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/algorithm/WeightedShortestPath.tsx +++ /dev/null @@ -1,500 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Radio, Input, Select, Switch } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; -import { styles } from '../QueryAndAlgorithmLibrary'; -import { Tooltip as CustomTooltip } from '../../../common'; - -import { GraphManagementStoreContext } from '../../../../stores'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import { isDataTypeNumeric, calcAlgorithmFormWidth } from '../../../../utils'; - -import QuestionMarkIcon from '../../../../assets/imgs/ic_question_mark.svg'; - -const WeightedShortestPath = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const algorithmAnalyzerStore = dataAnalyzeStore.algorithmAnalyzerStore; - const { t } = useTranslation(); - - const formWidth = calcAlgorithmFormWidth( - graphManagementStore.isExpanded, - 320, - 390 - ); - - const isValidExec = - Object.values( - algorithmAnalyzerStore.validateWeightedShortestPathParamsErrorMessage - ).every((value) => value === '') && - algorithmAnalyzerStore.weightedShortestPathParams.source !== '' && - algorithmAnalyzerStore.weightedShortestPathParams.target !== '' && - algorithmAnalyzerStore.weightedShortestPathParams.weight !== ''; - - return ( -
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.weighted-shortest-path.options.source' - )} - -
- { - algorithmAnalyzerStore.mutateWeightedShortestPathParams( - 'source', - e.value as string - ); - - algorithmAnalyzerStore.validateWeightedShortestPathParams( - 'source' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateWeightedShortestPathParams( - 'source' - ); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.weighted-shortest-path.options.label' - )} - -
- -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.weighted-shortest-path.options.target' - )} - -
- { - algorithmAnalyzerStore.mutateWeightedShortestPathParams( - 'target', - e.value as string - ); - - algorithmAnalyzerStore.validateWeightedShortestPathParams( - 'target' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateWeightedShortestPathParams( - 'target' - ); - } - }} - /> -
-
-
- - {t( - 'data-analyze.algorithm-forms.weighted-shortest-path.options.max_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateWeightedShortestPathParams( - 'max_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateWeightedShortestPathParams( - 'max_degree' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateWeightedShortestPathParams( - 'max_degree' - ); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.weighted-shortest-path.options.direction' - )} - -
- ) => { - algorithmAnalyzerStore.mutateWeightedShortestPathParams( - 'direction', - e.target.value - ); - }} - > - both - out - in - -
-
-
- - {t( - 'data-analyze.algorithm-forms.weighted-shortest-path.options.skip_degree' - )} - - -
- { - algorithmAnalyzerStore.mutateWeightedShortestPathParams( - 'skip_degree', - e.value as string - ); - - algorithmAnalyzerStore.validateWeightedShortestPathParams( - 'skip_degree' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateWeightedShortestPathParams( - 'skip_degree' - ); - } - }} - /> -
-
-
-
-
- * - - {t( - 'data-analyze.algorithm-forms.weighted-shortest-path.options.weight' - )} - -
- -
-
-
- - {t( - 'data-analyze.algorithm-forms.weighted-shortest-path.options.capacity' - )} - -
- { - algorithmAnalyzerStore.mutateWeightedShortestPathParams( - 'capacity', - e.value as string - ); - - algorithmAnalyzerStore.validateWeightedShortestPathParams( - 'capacity' - ); - }} - originInputProps={{ - onBlur() { - algorithmAnalyzerStore.validateWeightedShortestPathParams( - 'capacity' - ); - } - }} - /> -
-
-
-
-
- - {t( - 'data-analyze.algorithm-forms.weighted-shortest-path.options.with_vertex' - )} - -
- { - algorithmAnalyzerStore.mutateWeightedShortestPathParams( - 'with_vertex', - checked - ); - }} - /> -
-
-
- - -
-
- ); -}); - -export default WeightedShortestPath; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/common/Favorite.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/common/Favorite.tsx deleted file mode 100644 index 11ea43224..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/common/Favorite.tsx +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useState, useContext, useCallback } from 'react'; -import { observer } from 'mobx-react'; -import { Button, Input, Message } from 'hubble-ui'; - -import { DataAnalyzeStoreContext } from '../../../../stores'; -import { useTranslation } from 'react-i18next'; - -export interface FavoriteProps { - handlePop: (flag: boolean) => void; - queryStatement?: string; - isEdit?: boolean; - id?: number; - name?: string; -} - -const styles = { - primaryButton: { - width: 72, - marginRight: 12 - }, - alert: { - width: 320, - fontSize: 12, - marginTop: 4, - color: '#f5535b' - } -}; - -const Favorite: React.FC = observer( - ({ handlePop, queryStatement = '', isEdit = false, id, name = '' }) => { - const dataAnalyzeStore = useContext(DataAnalyzeStoreContext); - const { t } = useTranslation(); - const initialText = isEdit ? name : ''; - const [inputValue, setInputValue] = useState(initialText); - - const handleChange = useCallback(({ value }) => { - setInputValue(value); - }, []); - - const handleAddQueryCollection = useCallback(async () => { - await dataAnalyzeStore.addQueryCollection(inputValue, queryStatement); - - if (dataAnalyzeStore.requestStatus.addQueryCollection === 'success') { - dataAnalyzeStore.setFavoritePopUp(''); - handlePop(false); - setInputValue(''); - - Message.success({ - content: isEdit - ? t('addition.operate.modify-success') - : t('addition.operate.favorite-success'), - size: 'medium', - showCloseIcon: false - }); - - dataAnalyzeStore.fetchFavoriteQueries(); - } - }, [dataAnalyzeStore, handlePop, inputValue, isEdit, queryStatement]); - - const handleEditQueryCollection = useCallback(async () => { - await dataAnalyzeStore.editQueryCollection( - id as number, - inputValue, - queryStatement - ); - - if (dataAnalyzeStore.requestStatus.editQueryCollection === 'success') { - dataAnalyzeStore.setFavoritePopUp(''); - handlePop(false); - setInputValue(''); - - Message.success({ - content: t('addition.operate.modify-success'), - size: 'medium', - showCloseIcon: false - }); - - dataAnalyzeStore.fetchFavoriteQueries(); - } - }, [dataAnalyzeStore, handlePop, id, inputValue, queryStatement]); - - const handleCancel = useCallback( - (type: 'add' | 'edit') => () => { - handlePop(false); - dataAnalyzeStore.setFavoritePopUp(''); - setInputValue(initialText); - dataAnalyzeStore.resetFavoriteRequestStatus(type); - }, - [dataAnalyzeStore, handlePop, initialText] - ); - - return ( -
-
- - {isEdit - ? t('addition.operate.modify-name') - : t('addition.operate.favorite-statement')} - - - {dataAnalyzeStore.requestStatus.addQueryCollection === 'failed' && - isEdit === false && ( -
- {dataAnalyzeStore.errorInfo.addQueryCollection.message} -
- )} - {dataAnalyzeStore.requestStatus.editQueryCollection === 'failed' && - isEdit === true && ( -
- {dataAnalyzeStore.errorInfo.editQueryCollection.message} -
- )} -
- - -
-
-
- ); - } -); - -export default Favorite; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/index.ts deleted file mode 100644 index dffd5e2e7..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import DataAnalyze from './DataAnalyze'; - -export { DataAnalyze }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/GraphPopOver.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/GraphPopOver.tsx deleted file mode 100644 index 26be682e4..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/GraphPopOver.tsx +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useEffect, useRef, useCallback } from 'react'; -import { observer } from 'mobx-react'; -import { Message } from 'hubble-ui'; -import { isUndefined, size, isEmpty } from 'lodash-es'; - -import { DataAnalyzeStoreContext } from '../../../../stores'; -import { addGraphNodes, addGraphEdges } from '../../../../stores/utils'; -import { useTranslation } from 'react-i18next'; - -interface GraphPopOverProps { - x: number; - y: number; - switchIsPopover: (state: boolean) => void; - isAfterDragging: boolean; - switchAfterDragging: (state: boolean) => void; -} - -const GraphPopOver: React.FC = observer( - ({ x, y, isAfterDragging, switchAfterDragging, switchIsPopover }) => { - const dataAnalyzeStore = useContext(DataAnalyzeStoreContext); - const popoverWrapperRef = useRef(null); - const { t } = useTranslation(); - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - // if clicked element is not on dropdown, collpase it - if ( - popoverWrapperRef.current && - !popoverWrapperRef.current.contains(e.target as Element) - ) { - if (isAfterDragging) { - switchAfterDragging(false); - return; - } - - switchIsPopover(false); - } - }, - [switchIsPopover, isAfterDragging] - ); - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - return ( -
e.preventDefault()} - style={{ top: y, left: x }} - ref={popoverWrapperRef} - > - {dataAnalyzeStore.rightClickedGraphData.id === '' ? ( -
{ - switchIsPopover(false); - dataAnalyzeStore.setDynamicAddGraphDataStatus('vertex'); - }} - > - {t('addition.common.add-vertex')} -
- ) : ( - <> -
{ - const node = dataAnalyzeStore.graphData.data.graph_view.vertices.find( - ({ id }) => id === dataAnalyzeStore.rightClickedGraphData.id - ); - - if (isUndefined(node)) { - return; - } - - if (node.label === '~undefined') { - Message.info({ - content: t('addition.message.illegal-vertex'), - size: 'medium', - showCloseIcon: false, - duration: 1 - }); - } - - if ( - isUndefined( - dataAnalyzeStore.vertexTypes.find( - ({ name }) => name === node.label - ) - ) - ) { - return; - } - - await dataAnalyzeStore.expandGraphNode(); - - if ( - dataAnalyzeStore.requestStatus.expandGraphNode === 'success' - ) { - // prompt if there's no extra node - if ( - size( - dataAnalyzeStore.expandedGraphData.data.graph_view - .vertices - ) === 0 - ) { - if ( - isEmpty( - dataAnalyzeStore.visNetwork?.getConnectedNodes(node.id) - ) - ) { - Message.info({ - content: t('addition.message.no-adjacency-points'), - size: 'medium', - showCloseIcon: false, - duration: 1 - }); - } else { - Message.info({ - content: t('addition.message.no-more-points'), - size: 'medium', - showCloseIcon: false, - duration: 1 - }); - } - - return; - } - - addGraphNodes( - dataAnalyzeStore.expandedGraphData.data.graph_view.vertices, - dataAnalyzeStore.visDataSet?.nodes, - dataAnalyzeStore.vertexSizeMappings, - dataAnalyzeStore.colorMappings, - dataAnalyzeStore.vertexWritingMappings - ); - - addGraphEdges( - dataAnalyzeStore.expandedGraphData.data.graph_view.edges, - dataAnalyzeStore.visDataSet?.edges, - dataAnalyzeStore.edgeColorMappings, - dataAnalyzeStore.edgeThicknessMappings, - dataAnalyzeStore.edgeWithArrowMappings, - dataAnalyzeStore.edgeWritingMappings - ); - - dataAnalyzeStore.resetRightClickedGraphData(); - switchIsPopover(false); - } else { - Message.error({ - content: dataAnalyzeStore.errorInfo.expandGraphNode.message, - size: 'medium', - showCloseIcon: false - }); - } - }} - > - {t('addition.operate.expand')} -
-
{ - dataAnalyzeStore.switchShowFilterBoard(true); - switchIsPopover(false); - }} - > - {t('addition.operate.query')} -
-
{ - dataAnalyzeStore.visDataSet?.nodes.remove([ - dataAnalyzeStore.rightClickedGraphData.id - ]); - dataAnalyzeStore.hideGraphNode( - dataAnalyzeStore.rightClickedGraphData.id - ); - dataAnalyzeStore.resetRightClickedGraphData(); - switchIsPopover(false); - }} - > - {t('addition.operate.hidden')} -
-
{ - dataAnalyzeStore.setDynamicAddGraphDataStatus('outEdge'); - dataAnalyzeStore.fetchRelatedEdges(); - switchIsPopover(false); - }} - > - {t('addition.common.add-out-edge')} -
-
{ - dataAnalyzeStore.setDynamicAddGraphDataStatus('inEdge'); - dataAnalyzeStore.fetchRelatedEdges(); - switchIsPopover(false); - }} - > - {t('addition.common.add-in-edge')} -
- - )} -
- ); - } -); - -export default GraphPopOver; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/GraphQueryResult.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/GraphQueryResult.tsx deleted file mode 100644 index f6f5d710b..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/GraphQueryResult.tsx +++ /dev/null @@ -1,659 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useState, - useContext, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import { size, isUndefined, isEmpty } from 'lodash-es'; -import { saveAs } from 'file-saver'; -import vis from 'vis-network'; -import 'vis-network/styles/vis-network.min.css'; -import { Message } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import QueryFilterOptions from './QueryFilterOptions'; -import GraphPopOver from './GraphPopOver'; -import { DataAnalyzeStoreContext } from '../../../../stores'; -import { addGraphNodes, addGraphEdges } from '../../../../stores/utils'; - -import ZoomInIcon from '../../../../assets/imgs/ic_fangda_16.svg'; -import ZoomOutIcon from '../../../../assets/imgs/ic_suoxiao_16.svg'; -import CenterIcon from '../../../../assets/imgs/ic_middle_16.svg'; -import DownloadIcon from '../../../../assets/imgs/ic_xiazai_16.svg'; -import FullScreenIcon from '../../../../assets/imgs/ic_quanping_16.svg'; -import ResetScreenIcon from '../../../../assets/imgs/ic_tuichuquanping_16.svg'; -import LoadingBackIcon from '../../../../assets/imgs/ic_loading_back.svg'; -import LoadingFrontIcon from '../../../../assets/imgs/ic_loading_front.svg'; -import AddNodeIcon from '../../../../assets/imgs/ic_add_node.svg'; - -export interface GraphQueryResult { - hidden: boolean; -} - -const GraphQueryResult: React.FC = observer(({ hidden }) => { - const dataAnalyzeStore = useContext(DataAnalyzeStoreContext); - const { t } = useTranslation(); - const graphWrapper = useRef(null); - const resultWrapper = useRef(null); - const legendViewPointWrapper = useRef(null); - const legendWrapper = useRef(null); - const [showLoadingGraphs, switchShowLoadingGraphs] = useState(true); - const [isPopover, switchIsPopover] = useState(false); - const [isAfterDragging, switchAfterDragging] = useState(false); - const [nodeTooltipX, setNodeToolTipX] = useState(0); - const [nodeTooltipY, setNodeToolTipY] = useState(0); - const [legendStep, setLegendStep] = useState(0); - const [legendWidth, setlegendWitdh] = useState(0); - - const [graph, setGraph] = useState(null); - - const redrawGraphs = useCallback(() => { - if (graph) { - const width = getComputedStyle(resultWrapper.current!).width as string; - const height = getComputedStyle(resultWrapper.current!).height as string; - - graph.setSize(width, height); - graph.redraw(); - } - }, [graph]); - - useEffect(() => { - const width = getComputedStyle(resultWrapper.current!).width as string; - const height = getComputedStyle(resultWrapper.current!).height as string; - - const graphNodes = new vis.DataSet(dataAnalyzeStore.graphNodes); - const graphEdges = new vis.DataSet(dataAnalyzeStore.graphEdges); - - if (!graph) { - const data = { - nodes: graphNodes, - edges: graphEdges - }; - - const layout: vis.Options = { - width, - height, - nodes: { - shape: 'dot' - }, - edges: { - arrowStrikethrough: false, - color: { - color: 'rgba(92, 115, 230, 0.8)', - hover: 'rgba(92, 115, 230, 1)', - highlight: 'rgba(92, 115, 230, 1)' - }, - scaling: { - min: 1, - max: 3, - label: { - enabled: false - } - } - }, - interaction: { - hover: true - }, - physics: { - maxVelocity: 50, - solver: 'forceAtlas2Based', - timestep: 0.3, - stabilization: { iterations: 150 } - } - }; - - // initialize your network! - if (graphWrapper.current !== null) { - const network = new vis.Network(graphWrapper!.current, data, layout); - - let timer: number | undefined = undefined; - - network.on('click', ({ nodes, edges }) => { - // click on node, note that edges(related) also has value - if (!isEmpty(nodes)) { - // note: cannot abstract switchClickOn...() and clearTimeout - // as common callings with node and edge, since click event - // would be dispatched even if click is not on node and edge - dataAnalyzeStore.switchClickOnNodeOrEdge(true); - clearTimeout(timer); - - timer = window.setTimeout(() => { - const nodeId = nodes[0]; - const node = - dataAnalyzeStore.graphData.data.graph_view.vertices.find( - ({ id }) => id === nodeId - ); - - if (isUndefined(node)) { - return; - } - - dataAnalyzeStore.changeSelectedGraphData({ - id: node.id, - label: node.label, - properties: node.properties - }); - - dataAnalyzeStore.syncGraphEditableProperties('vertex'); - dataAnalyzeStore.initValidateEditGraphDataPropertiesErrorMessage(); - - if ( - dataAnalyzeStore.graphInfoDataSet !== 'node' || - !dataAnalyzeStore.isShowGraphInfo - ) { - dataAnalyzeStore.switchShowScreeDataSet('node'); - dataAnalyzeStore.switchShowScreenInfo(true); - } - - // close filter board after click on node - dataAnalyzeStore.switchShowFilterBoard(false); - // reset status, or click blank area won't collpase the drawer - dataAnalyzeStore.switchClickOnNodeOrEdge(false); - }, 200); - - return; - } - - // click on edge - if (!isEmpty(edges)) { - dataAnalyzeStore.switchClickOnNodeOrEdge(true); - clearTimeout(timer); - - timer = window.setTimeout(() => { - const edgeId = edges[0]; - - const edge = - dataAnalyzeStore.graphData.data.graph_view.edges.find( - ({ id }) => id === edgeId - ); - - if (isUndefined(edge)) { - return; - } - - dataAnalyzeStore.changeSelectedGraphLinkData({ - id: edge.id, - label: edge.label, - properties: edge.properties, - source: edge.source, - target: edge.target - }); - - dataAnalyzeStore.syncGraphEditableProperties('edge'); - dataAnalyzeStore.initValidateEditGraphDataPropertiesErrorMessage(); - - if ( - dataAnalyzeStore.graphInfoDataSet !== 'edge' || - !dataAnalyzeStore.isShowGraphInfo - ) { - dataAnalyzeStore.switchShowScreeDataSet('edge'); - dataAnalyzeStore.switchShowScreenInfo(true); - } - - // close filter board after click on edge - dataAnalyzeStore.switchShowFilterBoard(false); - // reset status, or click blank area won't collpase the drawer - dataAnalyzeStore.switchClickOnNodeOrEdge(false); - }, 200); - } - }); - - network.on('doubleClick', async ({ nodes }) => { - clearTimeout(timer); - dataAnalyzeStore.switchClickOnNodeOrEdge(false); - if (!isEmpty(nodes)) { - const nodeId = nodes[0]; - const node = - dataAnalyzeStore.graphData.data.graph_view.vertices.find( - ({ id }) => id === nodeId - ); - - if (!isUndefined(node)) { - // specific symbol (~undefined) in schema - if (node.label === '~undefined') { - Message.info({ - content: t('addition.common.illegal-vertex-desc'), - size: 'medium', - showCloseIcon: false, - duration: 1 - }); - } - - if ( - isUndefined( - dataAnalyzeStore.vertexTypes.find( - ({ name }) => name === node.label - ) - ) - ) { - return; - } - - await dataAnalyzeStore.expandGraphNode(node.id, node.label); - - if ( - dataAnalyzeStore.requestStatus.expandGraphNode === 'success' - ) { - // prompt if there's no extra node - if ( - size( - dataAnalyzeStore.expandedGraphData.data.graph_view.vertices - ) === 0 - ) { - if (isEmpty(network.getConnectedNodes(nodeId))) { - Message.info({ - content: t('addition.message.no-adjacency-points'), - size: 'medium', - showCloseIcon: false, - duration: 1 - }); - } else { - Message.info({ - content: t('addition.message.no-more-points'), - size: 'medium', - showCloseIcon: false, - duration: 1 - }); - } - - return; - } - - addGraphNodes( - dataAnalyzeStore.expandedGraphData.data.graph_view.vertices, - dataAnalyzeStore.visDataSet?.nodes, - dataAnalyzeStore.vertexSizeMappings, - dataAnalyzeStore.colorMappings, - dataAnalyzeStore.vertexWritingMappings - ); - - addGraphEdges( - dataAnalyzeStore.expandedGraphData.data.graph_view.edges, - dataAnalyzeStore.visDataSet?.edges, - dataAnalyzeStore.edgeColorMappings, - dataAnalyzeStore.edgeThicknessMappings, - dataAnalyzeStore.edgeWithArrowMappings, - dataAnalyzeStore.edgeWritingMappings - ); - } - - if (dataAnalyzeStore.requestStatus.expandGraphNode === 'failed') { - Message.error({ - content: dataAnalyzeStore.errorInfo.expandGraphNode.message, - size: 'medium', - showCloseIcon: false - }); - } - } else { - Message.error({ - content: dataAnalyzeStore.errorInfo.expandGraphNode.message, - size: 'medium', - showCloseIcon: false - }); - } - } - }); - - network.on('oncontext', async (e) => { - // disable default context menu - e.event.preventDefault(); - - // It's weird that sometimes e.nodes is empty when right click on node - // thus using coordinate to work as expect - const nodeId = network.getNodeAt(e.pointer.DOM); - const node = dataAnalyzeStore.graphData.data.graph_view.vertices.find( - ({ id }) => id === nodeId - ); - - if (!isUndefined(node)) { - dataAnalyzeStore.changeRightClickedGraphData({ - id: node.id, - label: node.label, - properties: node.properties - }); - - switchIsPopover(true); - - network.selectNodes([nodeId]); - setNodeToolTipX(e.pointer.DOM.x); - setNodeToolTipY(e.pointer.DOM.y); - dataAnalyzeStore.setVisCurrentCoordinates({ - domX: e.pointer.DOM.x, - domY: e.pointer.DOM.y, - canvasX: e.pointer.canvas.x, - canvasY: e.pointer.canvas.y - }); - - await dataAnalyzeStore.fetchRelatedVertex(); - - if (size(dataAnalyzeStore.graphDataEdgeTypes) !== 0) { - dataAnalyzeStore.fetchFilteredPropertyOptions( - dataAnalyzeStore.graphDataEdgeTypes[0] - ); - } - } else { - const edgeId = network.getEdgeAt(e.pointer.DOM); - - // if not click on edge - if (isUndefined(edgeId)) { - dataAnalyzeStore.resetRightClickedGraphData(); - setNodeToolTipX(e.pointer.DOM.x); - setNodeToolTipY(e.pointer.DOM.y); - dataAnalyzeStore.setVisCurrentCoordinates({ - domX: e.pointer.DOM.x, - domY: e.pointer.DOM.y, - canvasX: e.pointer.canvas.x, - canvasY: e.pointer.canvas.y - }); - switchIsPopover(true); - } - } - }); - - network.on('dragging', () => { - const node = dataAnalyzeStore.visDataSet?.nodes.get( - dataAnalyzeStore.rightClickedGraphData.id - ); - - if (node !== null) { - const position = network.getPositions(node.id); - setNodeToolTipX(network.canvasToDOM(position[node.id]).x); - setNodeToolTipY(network.canvasToDOM(position[node.id]).y); - switchAfterDragging(true); - } - }); - - network.on('zoom', () => { - const node = dataAnalyzeStore.visDataSet?.nodes.get( - dataAnalyzeStore.rightClickedGraphData.id - ); - - if (node !== null) { - const position = network.getPositions(node.id); - setNodeToolTipX(network.canvasToDOM(position[node.id]).x); - setNodeToolTipY(network.canvasToDOM(position[node.id]).y); - } - }); - - network.on('dragEnd', (e) => { - if (!isEmpty(e.nodes)) { - network.unselectAll(); - } - }); - - network.once('stabilizationIterationsDone', () => { - switchShowLoadingGraphs(false); - }); - - setGraph(network); - dataAnalyzeStore.setVisNetwork(network); - } - } else { - if (!dataAnalyzeStore.isGraphLoaded) { - graph.setData({ - nodes: graphNodes, - edges: graphEdges - }); - - dataAnalyzeStore.setVisDataSet({ - nodes: graphNodes, - edges: graphEdges - }); - - dataAnalyzeStore.switchGraphLoaded(true); - } - - redrawGraphs(); - } - }, [ - dataAnalyzeStore, - dataAnalyzeStore.originalGraphData, - graph, - dataAnalyzeStore.isFullScreenReuslt, - redrawGraphs - ]); - - useEffect(() => { - if (legendWrapper.current) { - const legendWidth = getComputedStyle(legendWrapper.current).width!.split( - 'px' - )[0]; - - setlegendWitdh(Number(legendWidth)); - } - }, []); - - useEffect(() => { - window.addEventListener('resize', redrawGraphs, false); - - return () => { - window.removeEventListener('resize', redrawGraphs); - }; - }, [redrawGraphs]); - - return ( - <> - - {dataAnalyzeStore.isShowFilterBoard && } - {showLoadingGraphs && ( -
-
- {t('addition.operate.load-background')} - {t('addition.operate.load-spinner')} -
- {t('addition.operate.rendering')}... -
- )} - - ); -}); - -export default GraphQueryResult; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/JSONQueryResult.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/JSONQueryResult.tsx deleted file mode 100644 index fed89e518..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/JSONQueryResult.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import ReactJsonView from 'react-json-view'; -import 'codemirror/mode/javascript/javascript'; - -import { DataAnalyzeStoreContext } from '../../../../stores'; - -const JSONQueryResult: React.FC = observer(() => { - const dataAnalyzeStore = useContext(DataAnalyzeStoreContext); - - return ( -
- -
- ); -}); - -export default JSONQueryResult; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/QueryFilterOptions.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/QueryFilterOptions.tsx deleted file mode 100644 index 3b8e48afe..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/QueryFilterOptions.tsx +++ /dev/null @@ -1,405 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useCallback } from 'react'; -import { observer } from 'mobx-react'; -import { Select, Input, NumberBox, Calendar } from 'hubble-ui'; -import { Message } from 'hubble-ui'; - -import { DataAnalyzeStoreContext } from '../../../../stores'; -import { addGraphNodes, addGraphEdges } from '../../../../stores/utils'; -import { useTranslation } from 'react-i18next'; -import i18next from '../../../../i18n'; - -const getRuleOptions = (ruleType: string = '') => { - switch (ruleType.toLowerCase()) { - case 'float': - case 'double': - case 'byte': - case 'int': - case 'long': - case 'date': - return [ - i18next.t('addition.constant.greater-than'), - i18next.t('addition.constant.greater-than-or-equal'), - i18next.t('addition.constant.less-than'), - i18next.t('addition.constant.less-than-or-equal'), - i18next.t('addition.constant.equal') - ]; - case 'object': - case 'text': - case 'blob': - case 'uuid': - return [i18next.t('addition.constant.equal')]; - case 'boolean': - return ['True', 'False']; - default: - return []; - } -}; - -const QueryFilterOptions: React.FC = observer(() => { - const dataAnalyzeStore = useContext(DataAnalyzeStoreContext); - const { t } = useTranslation(); - const line = dataAnalyzeStore.filteredGraphQueryOptions.line; - const properties = dataAnalyzeStore.filteredGraphQueryOptions.properties; - const lastProperty = properties[properties.length - 1]; - - // value of the corresponding revealed form should not be empty - const allowSendFilterRequest = - (properties.length === 0 && line.type !== '') || - (lastProperty && - lastProperty.property !== '' && - lastProperty.rule !== '' && - lastProperty.value !== '') || - (lastProperty && - (lastProperty.rule === 'True' || lastProperty.rule === 'False')); - - const allowAddProperties = - allowSendFilterRequest && - dataAnalyzeStore.filteredPropertyOptions.length !== 0 && - dataAnalyzeStore.filteredGraphQueryOptions.properties.length !== - dataAnalyzeStore.filteredPropertyOptions.length; - - const handleEdgeSelectChange = useCallback( - (key: 'type' | 'direction') => (value: string) => { - dataAnalyzeStore.editEdgeFilterOption(key, value); - dataAnalyzeStore.fetchFilteredPropertyOptions(value); - }, - [dataAnalyzeStore] - ); - - const handlePropertyChange = useCallback( - ( - key: 'property' | 'rule' | 'value', - value: string | number, - index: number - ) => { - dataAnalyzeStore.editPropertyFilterOption(key, value, index); - }, - [dataAnalyzeStore] - ); - - const renderPropertyValue = ( - type: string = '', - value: string, - index: number - ) => { - const shouldDisabled = - dataAnalyzeStore.filteredGraphQueryOptions.properties[index].property === - ''; - - switch (type.toLowerCase()) { - case 'float': - case 'double': - return ( - { - handlePropertyChange('value', Number(e.value), index); - }} - disabled={shouldDisabled} - /> - ); - case 'byte': - case 'int': - case 'long': - return ( - { - handlePropertyChange('value', Number(e.target.value), index); - }} - disabled={shouldDisabled} - /> - ); - case 'date': - return ( - { - handlePropertyChange('value', timeParams.beginTime, index); - }} - disabled={shouldDisabled} - /> - ); - case 'object': - case 'text': - case 'blob': - case 'uuid': - return ( - { - handlePropertyChange('value', e.value, index); - }} - disabled={shouldDisabled} - /> - ); - case 'boolean': - return
/
; - default: - return ( - - ); - } - }; - - return ( -
-
-
- - {t('addition.common.edge-type')}: - - -
-
- - {t('addition.common.edge-direction')}: - - -
-
- { - if (!allowSendFilterRequest) { - return; - } - - await dataAnalyzeStore.filterGraphData(); - - if ( - dataAnalyzeStore.requestStatus.filteredGraphData === 'success' - ) { - addGraphNodes( - dataAnalyzeStore.expandedGraphData.data.graph_view.vertices, - dataAnalyzeStore.visDataSet?.nodes, - dataAnalyzeStore.vertexSizeMappings, - dataAnalyzeStore.colorMappings, - dataAnalyzeStore.vertexWritingMappings - ); - - addGraphEdges( - dataAnalyzeStore.expandedGraphData.data.graph_view.edges, - dataAnalyzeStore.visDataSet?.edges, - dataAnalyzeStore.edgeColorMappings, - dataAnalyzeStore.edgeThicknessMappings, - dataAnalyzeStore.edgeWithArrowMappings, - dataAnalyzeStore.edgeWritingMappings - ); - - // highlight new vertices - if (dataAnalyzeStore.visNetwork !== null) { - dataAnalyzeStore.visNetwork.selectNodes( - dataAnalyzeStore.expandedGraphData.data.graph_view.vertices - .map(({ id }) => id) - .concat([dataAnalyzeStore.rightClickedGraphData.id]), - true - ); - } - - dataAnalyzeStore.switchShowFilterBoard(false); - dataAnalyzeStore.clearFilteredGraphQueryOptions(); - } else { - Message.error({ - content: dataAnalyzeStore.errorInfo.filteredGraphData.message, - size: 'medium', - showCloseIcon: false - }); - } - }} - > - {t('addition.operate.filter')} - - { - dataAnalyzeStore.switchShowFilterBoard(false); - dataAnalyzeStore.clearFilteredGraphQueryOptions(); - - if (dataAnalyzeStore.visNetwork !== null) { - dataAnalyzeStore.visNetwork.unselectAll(); - } - }} - > - {t('addition.common.cancel')} - -
-
- {dataAnalyzeStore.filteredGraphQueryOptions.properties.length !== 0 && ( -
- )} - {dataAnalyzeStore.filteredGraphQueryOptions.properties.map( - ({ property, rule, value }, index) => { - return ( -
-
- {t('addition.common.property')}: - -
-
- {t('addition.common.rule')}: - -
-
- {t('addition.common.value')}: - {renderPropertyValue( - // the real type of value - dataAnalyzeStore.valueTypes[property], - value, - index - )} -
-
- { - dataAnalyzeStore.deletePropertyFilterOption(index); - }} - > - {t('addition.common.del')} - -
-
- ); - } - )} -
- { - dataAnalyzeStore.addPropertyFilterOption(); - } - : undefined - } - style={{ - color: allowAddProperties ? '#2b65ff' : '#ccc' - }} - > - {t('addition.operate.add-filter-item')} - -
-
- ); -}); - -export default QueryFilterOptions; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/QueryResult.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/QueryResult.tsx deleted file mode 100644 index 15fa71c2d..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/QueryResult.tsx +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { isEmpty } from 'lodash-es'; -import { useLocation } from 'wouter'; -import classnames from 'classnames'; - -import GraphQueryResult from './GraphQueryResult'; -import TableQueryResult from './TableQueryResult'; -import JSONQueryResult from './JSONQueryResult'; -import { - DataAnalyzeStoreContext, - AsyncTasksStoreContext -} from '../../../../stores'; -import { Algorithm } from '../../../../stores/factory/dataAnalyzeStore/algorithmStore'; -import EmptyIcon from '../../../../assets/imgs/ic_sousuo_empty.svg'; -import LoadingBackIcon from '../../../../assets/imgs/ic_loading_back.svg'; -import LoadingFrontIcon from '../../../../assets/imgs/ic_loading_front.svg'; -import FinishedIcon from '../../../../assets/imgs/ic_done_144.svg'; -import FailedIcon from '../../../../assets/imgs/ic_fail.svg'; -import i18next from '../../../../i18n'; -import { useTranslation } from 'react-i18next'; - -export interface QueryResultProps { - sidebarIndex: number; - handleSetSidebarIndex: (index: number) => void; -} - -const dataAnalyzeContentSidebarOptions = [ - i18next.t('addition.menu.chart'), - i18next.t('addition.menu.table'), - 'Json' -]; - -const QueryResult: React.FC = observer( - ({ sidebarIndex, handleSetSidebarIndex }) => { - const dataAnalyzeStore = useContext(DataAnalyzeStoreContext); - const { algorithmAnalyzerStore } = dataAnalyzeStore; - const asyncTasksStore = useContext(AsyncTasksStoreContext); - const [, setLocation] = useLocation(); - const { t } = useTranslation(); - - const renderReuslt = (index: number) => { - switch (index) { - case 1: - return ; - case 2: - return ; - } - }; - - const queryResutlClassName = classnames({ - 'query-result': true, - 'query-result-fullscreen': dataAnalyzeStore.isFullScreenReuslt - }); - - const dynHeightStyle: Record = {}; - - if ( - dataAnalyzeStore.currentTab === 'algorithm-analyze' && - !algorithmAnalyzerStore.isCollapse - ) { - if (algorithmAnalyzerStore.currentAlgorithm === '') { - dynHeightStyle.height = 'calc(100vh - 441px)'; - } - } - - return ( -
- {!dataAnalyzeStore.isFullScreenReuslt && ( -
- {dataAnalyzeContentSidebarOptions.map((text, index) => ( -
-
{ - handleSetSidebarIndex(index); - }} - className={ - sidebarIndex === index - ? 'query-result-sidebar-options-active' - : '' - } - > - - {text} -
-
- ))} -
- )} -
- {dataAnalyzeStore.requestStatus.fetchGraphs === 'success' && - renderReuslt(sidebarIndex)} - - {dataAnalyzeStore.requestStatus.fetchGraphs === 'success' && - dataAnalyzeStore.graphData.data.graph_view.vertices !== null && - dataAnalyzeStore.graphData.data.graph_view.edges !== null && - !isEmpty(dataAnalyzeStore.graphData.data.graph_view.vertices) && ( -
-
- ); - } -); - -export default QueryResult; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/TableQueryResult.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/TableQueryResult.tsx deleted file mode 100644 index 1ee0764be..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/TableQueryResult.tsx +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useCallback } from 'react'; -import { observer } from 'mobx-react'; -import { Table } from 'hubble-ui'; -import { size } from 'lodash-es'; - -import { DataAnalyzeStoreContext } from '../../../../stores'; - -const TableQueryResult: React.FC = observer(() => { - const dataAnalyzeStore = useContext(DataAnalyzeStoreContext); - - const columnConfigs = dataAnalyzeStore.originalGraphData.data.table_view.header.map( - (title) => ({ - title, - dataIndex: title, - width: - 100 / size(dataAnalyzeStore.originalGraphData.data.table_view.header) + - '%', - render(text: any) { - if (title === 'path') { - return ; - } - - return JSON.stringify(text); - } - }) - ); - - const handlePageChange = useCallback( - (e: React.ChangeEvent) => { - dataAnalyzeStore.mutatePageNumber('tableResult', Number(e.target.value)); - }, - [dataAnalyzeStore] - ); - - return ( -
-
- - ); -}); - -// item could be obejct array which needs serialization as well -const PathItem: React.FC<{ items: string[] }> = observer(({ items }) => ( - <> - {items.map((item: string) => ( - - {JSON.stringify(item)} - - ))} - -)); - -export default TableQueryResult; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/index.ts deleted file mode 100644 index 129ccb2f7..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-analyze/query-result/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import QueryResult from './QueryResult'; - -export { QueryResult }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportFinish.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportFinish.tsx deleted file mode 100644 index 63cb5c8cc..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportFinish.tsx +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useEffect } from 'react'; -import { observer } from 'mobx-react'; -import { useRoute, useLocation } from 'wouter'; -import { isEmpty } from 'lodash-es'; -import { useTranslation } from 'react-i18next'; -import { Button } from 'hubble-ui'; - -import { - ImportManagerStoreContext, - GraphManagementStoreContext, - DataImportRootStoreContext -} from '../../../../stores'; - -import { useInitDataImport } from '../../../../hooks'; - -import PassIcon from '../../../../assets/imgs/ic_pass.svg'; - -const ImportFinish: React.FC = observer(() => { - const importManagerStore = useContext(ImportManagerStoreContext); - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const [, params] = useRoute( - '/graph-management/:id/data-import/import-manager/:jobId/import-tasks/:status*' - ); - const [, setLocation] = useLocation(); - const { t } = useTranslation(); - - useEffect(() => { - if (isEmpty(serverDataImportStore.importTasks) && params !== null) { - dataImportRootStore.setCurrentId(Number(params.id)); - dataImportRootStore.setCurrentJobId(Number(params.jobId)); - - serverDataImportStore.fetchAllImportTasks(); - } - }, [params?.id, params?.jobId]); - - return ( -
-
- complete -
-
{t('data-import-status.finished')}
-
- {t('data-import-status.success', { - number: - serverDataImportStore.successImportFileStatusNumber !== 0 - ? serverDataImportStore.successImportFileStatusNumber - : '-' - })} - {serverDataImportStore.pausedImportFileNumber !== 0 && - `,${t('data-import-status.pause', { - number: serverDataImportStore.pausedImportFileNumber - })}`} - {serverDataImportStore.abortImportFileNumber !== 0 && - `,${t('data-import-status.abort', { - number: serverDataImportStore.abortImportFileNumber - })}`} -
-
-
-
- -
-
- ); -}); - -export default ImportFinish; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportManager.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportManager.less deleted file mode 100644 index f04a4c2c1..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportManager.less +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.import-manager { - position: absolute; - width: calc(100% - 60px); - padding: 0 16px 16px; - left: 60px; - top: 60px; - - &-with-expand-sidebar { - width: calc(100% - 200px); - left: 200px; - } - - &-content-wrapper { - height: calc(100vh - 130px); - background: #fff; - padding: 16px; - overflow: auto; - } - - &-content-header { - margin-bottom: 16px; - display: flex; - justify-content: flex-end; - } - - &-breadcrumb-wrapper { - display: flex; - justify-content: space-between; - align-items: center; - margin: 16px 0; - } - - &-empty-list { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - - & > div { - margin: 8px 0 24px; - } - } - - &-table { - &-job-name { - display: flex; - - & > .link { - color: #2b65ff; - cursor: pointer; - } - - & > img { - display: block; - margin-left: 6px; - cursor: pointer; - } - } - - &-status-wrapper { - height: 28px; - text-align: center; - border-radius: 2px; - line-height: 28px; - font-size: 14px; - } - - &-status-pending { - width: 58px; - border: 1px solid #e0e0e0; - background-color: #f5f5f5; - color: #333; - } - - &-status-process { - width: 58px; - background-color: #f2f7ff; - border: 1px solid #8cb8ff; - color: #3d88f2; - } - - &-status-failed { - width: 44px; - border: 1px solid #ff9499; - background-color: #fff2f2; - color: #e64552; - } - - &-status-success { - width: 44px; - border: 1px solid #7ed988; - background-color: #f2fff4; - color: #39bf45; - } - - &-manipulations { - display: flex; - justify-content: flex-end; - color: #2b65ff; - width: 100px; - - & > span { - cursor: pointer; - - &:last-child { - margin-left: 16px; - } - } - - &-outlink { - font-size: 14px; - color: #2b65ff; - line-height: 22px; - cursor: pointer; - display: flex; - width: fit-content; - text-decoration: none; - - &:hover { - color: #527dff; - } - - &:active { - color: #184bcc; - } - - &-disabled { - color: #999; - } - } - } - } - - &-create-job-option { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 32px; - - &:first-child { - margin-top: 8px; - } - - &:last-child { - margin-bottom: 12px; - } - - & > div:first-child { - width: 78px; - text-align: right; - } - - &-required-mark { - color: #d0021b; - } - } - - &-delete-job-option { - & span { - display: block; - } - } -} - -/* overrides */ - -// reset breadcrumb line-height -.import-manager .new-fc-one-breadcrumb.new-fc-one-breadcrumb-small { - line-height: 22px; -} - -.import-manager .new-fc-one-menu { - background-color: transparent; -} - -.import-manager-content-wrapper { - & table { - table-layout: fixed; - } -} - -.import-manager .new-fc-one-breadcrumb > span:not(:last-of-type) .new-fc-one-breadcrumb-link { - color: #2b65ff; -} - -// weired, when checking img block in devtool -// its size doesn't match what it seems -// need to hard-code it's left px here -// .import-management-table-job-name .new-fc-one-tooltip { -// left: 323px !important; -// } - -// remove horizon padding of close icon in -.new-fc-one-modal-close-x { - padding: 8px 0; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportManager.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportManager.tsx deleted file mode 100644 index 9f34968c9..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportManager.tsx +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useEffect } from 'react'; -import { observer } from 'mobx-react'; -import { useRoute, useLocation, Switch, Route } from 'wouter'; -import { useTranslation } from 'react-i18next'; -import { isNull } from 'lodash-es'; -import classnames from 'classnames'; -import { Breadcrumb } from 'hubble-ui'; - -import { JobDetails } from './job-details'; -import ImportTaskList from './ImportTaskList'; -import { - GraphManagementStoreContext, - DataImportRootStoreContext, - ImportManagerStoreContext -} from '../../../../stores'; - -import './ImportManager.less'; -import ImportTasks from './ImportTasks'; - -const ImportManager: React.FC = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const dataImportRootStore = useContext(DataImportRootStoreContext); - const importManagerStore = useContext(ImportManagerStoreContext); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const [_, params] = useRoute( - '/graph-management/:id/data-import/import-manager/:rest*' - ); - const [, setLocation] = useLocation(); - const { t } = useTranslation(); - - const wrapperClassName = classnames({ - 'import-manager': true, - 'import-manager-with-expand-sidebar': graphManagementStore.isExpanded - }); - - useEffect(() => { - window.scrollTo(0, 0); - - graphManagementStore.fetchIdList(); - importManagerStore.setCurrentId(Number(params!.id)); - - return () => { - importManagerStore.dispose(); - }; - }, []); - - return ( -
-
- - { - if (!isNull(importManagerStore.selectedJob)) { - setLocation( - `/graph-management/${importManagerStore.currentId}/data-import/import-manager` - ); - importManagerStore.setSelectedJob(null); - importManagerStore.fetchImportJobList(); - } - - // reset stores - // dataMapStore.dispose(); - // serverDataImportStore.dispose(); - }} - > - {t('breadcrumb.first')} - - {importManagerStore.selectedJob && ( - - {importManagerStore.selectedJob.job_name} - - )} - -
- - - - - -
- ); -}); - -export default ImportManager; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTaskList.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTaskList.tsx deleted file mode 100644 index 13168cf4e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTaskList.tsx +++ /dev/null @@ -1,768 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useState, useContext, useEffect } from 'react'; -import { observer } from 'mobx-react'; -import { useRoute, useLocation } from 'wouter'; -import { useTranslation } from 'react-i18next'; -import { isEmpty, size } from 'lodash-es'; -import classnames from 'classnames'; -import { Button, Input, Table, Modal, Message } from 'hubble-ui'; - -import LoadingDataView from '../../../common/LoadingDataView'; -import { Tooltip as CustomTooltip } from '../../../common'; -import { - DataImportRootStoreContext, - ImportManagerStoreContext -} from '../../../../stores'; - -import AddIcon from '../../../../assets/imgs/ic_add.svg'; -import HintIcon from '../../../../assets/imgs/ic_question_mark.svg'; - -const styles = { - button: { - width: 78, - marginLeft: 12 - } -}; - -const ImportTaskList: React.FC = observer(() => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const importManagerStore = useContext(ImportManagerStoreContext); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const [preLoading, switchPreLoading] = useState(true); - const [isPopCreateModal, switchCreatePopModal] = useState(false); - const [, params] = useRoute( - '/graph-management/:id/data-import/import-manager' - ); - const [, setLocation] = useLocation(); - const { t } = useTranslation(); - - const isLoading = - preLoading || - importManagerStore.requestStatus.fetchImportJobList === 'pending'; - - const handleSearchChange = (e: React.ChangeEvent) => { - importManagerStore.mutateSearchWords(e.target.value); - }; - - const handleSearch = async () => { - importManagerStore.mutateImportJobListPageNumber(1); - importManagerStore.switchSearchedStatus(true); - await importManagerStore.fetchImportJobList(); - }; - - const handleClearSearch = () => { - importManagerStore.mutateSearchWords(''); - importManagerStore.mutateImportJobListPageNumber(1); - importManagerStore.switchSearchedStatus(false); - importManagerStore.fetchImportJobList(); - }; - - const handlePageChange = (e: React.ChangeEvent) => { - importManagerStore.mutateImportJobListPageNumber(Number(e.target.value)); - importManagerStore.fetchImportJobList(); - }; - - const columnConfigs = [ - { - title: t('import-manager.list-column-title.job-name'), - dataIndex: 'job_name', - width: '20%', - render(name: string, rowData: any) { - const readyToJump = - rowData.job_status === 'SUCCESS' || rowData.job_status === 'FAILED'; - - const wrapperClassName = classnames({ - 'no-line-break': true, - link: readyToJump - }); - - return ( -
-
{ - if (readyToJump) { - importManagerStore.setCurrentJobDetailStep('basic'); - importManagerStore.setSelectedJob(rowData.id); - - // fill in essential data in import-task stores - dataImportRootStore.setCurrentId(Number(params!.id)); - dataImportRootStore.setCurrentJobId(rowData.id); - - dataImportRootStore.fetchVertexTypeList(); - dataImportRootStore.fetchEdgeTypeList(); - - setLocation( - `/graph-management/${ - params!.id - }/data-import/import-manager/${rowData.id}/details` - ); - - // fetch related data - await Promise.all([ - dataMapStore.fetchDataMaps(), - serverDataImportStore.fetchAllImportTasks() - ]); - - dataMapStore.setSelectedFileId( - Number(dataMapStore.fileMapInfos[0].id) - ); - dataMapStore.setSelectedFileInfo(); - - // set flags about readonly and irregular process in - dataMapStore.switchReadOnly(true); - dataMapStore.switchIrregularProcess(true); - - // set flags about readonly and irregular process in - serverDataImportStore.switchExpandImportConfig(true); - serverDataImportStore.switchReadOnly(true); - serverDataImportStore.switchIrregularProcess(true); - serverDataImportStore.syncImportConfigs( - dataMapStore.selectedFileInfo!.load_parameter - ); - } - }} - > - {name} -
- {!isEmpty(rowData.job_remarks) && ( - - )} -
- ); - } - }, - { - title: t('import-manager.list-column-title.size'), - dataIndex: 'job_size', - width: '15%', - render(text: any) { - return
{text}
; - } - }, - { - title: t('import-manager.list-column-title.create-time'), - dataIndex: 'create_time', - render(text: string) { - return
{text}
; - } - }, - { - title: t('import-manager.list-column-title.status'), - dataIndex: 'job_status', - render(text: string) { - let specificClassName = ''; - - switch (text) { - case 'DEFAULT': - case 'UPLOADING': - specificClassName = 'import-manager-table-status-pending'; - break; - case 'MAPPING': - case 'SETTING': - case 'LOADING': - specificClassName = 'import-manager-table-status-process'; - break; - case 'FAILED': - specificClassName = 'import-manager-table-status-failed'; - break; - case 'SUCCESS': - specificClassName = 'import-manager-table-status-success'; - break; - } - - return ( -
- {t(`import-manager.list-column-status.${text}`)} -
- ); - } - }, - { - title: t('import-manager.list-column-title.time-consuming'), - dataIndex: 'job_duration', - render(text: string) { - return
{text}
; - } - }, - { - title: t('import-manager.list-column-title.manipulation'), - render(_: any, rowData: any) { - return ( -
- -
- ); - } - } - ]; - - useEffect(() => { - if (importManagerStore.currentId !== null) { - setTimeout(() => { - switchPreLoading(false); - }, 800); - - importManagerStore.fetchImportJobList(); - } - }, [importManagerStore.currentId]); - - return ( -
-
- - -
-
-
{t('import-manager.hint.no-result')} - ) : ( - - ) - } - /> - ) - }} - dataSource={isLoading ? [] : importManagerStore.importJobList} - pagination={ - isLoading - ? null - : { - hideOnSinglePage: false, - pageNo: importManagerStore.importJobListPageConfig.pageNumber, - pageSize: 10, - showSizeChange: false, - showPageJumper: false, - total: importManagerStore.importJobListPageConfig.pageTotal, - onPageNoChange: handlePageChange - } - } - /> - - { - switchCreatePopModal(false); - await importManagerStore.createNewJob(); - importManagerStore.resetJob('new'); - - if (importManagerStore.requestStatus.createNewJob === 'success') { - Message.success({ - content: t('import-manager.hint.creation-succeed'), - size: 'medium', - showCloseIcon: false - }); - - importManagerStore.fetchImportJobList(); - return; - } - - if (importManagerStore.requestStatus.createNewJob === 'failed') { - Message.error({ - content: importManagerStore.errorInfo.createNewJob.message, - size: 'medium', - showCloseIcon: false - }); - } - }} - > - {t('import-manager.modal.manipulations.create')} - , - - ]} - destroyOnClose - needCloseIcon={true} - onCancel={() => { - switchCreatePopModal(false); - importManagerStore.resetJob('new'); - }} - > -
-
-
- - * - - {t('import-manager.modal.create-job.job-name')} -
- { - importManagerStore.mutateNewJob('name', e.value); - importManagerStore.validateJob('new', 'name'); - }} - originInputProps={{ - onBlur: () => { - importManagerStore.validateJob('new', 'name'); - } - }} - /> -
-
-
{t('import-manager.modal.create-job.job-description')}
-
- { - importManagerStore.mutateNewJob('description', e.value); - importManagerStore.validateJob('new', 'description'); - }} - originInputProps={{ - onBlur: () => { - importManagerStore.validateJob('new', 'description'); - } - }} - /> -
-
-
-
- - ); -}); - -export interface ImportManagerManipulationProps { - jobId: number; - jobName: string; - status: string; -} - -export const ImportManagerManipulation: React.FC = observer( - ({ jobId, jobName, status }) => { - const importManagerStore = useContext(ImportManagerStoreContext); - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const [isPopDeleteModal, switchPopDeleteModal] = useState(false); - const [, params] = useRoute( - '/graph-management/:id/data-import/import-manager' - ); - const [, setLocation] = useLocation(); - const { t } = useTranslation(); - - const jumpToLoaction = (step: number, jobName: string) => async () => { - importManagerStore.setSelectedJob(jobId); - - dataImportRootStore.setCurrentId(Number(params!.id)); - dataImportRootStore.setCurrentJobId(jobId); - dataImportRootStore.setCurrentStatus(status); - - let route = ''; - - if (step === 1) { - await dataMapStore.fetchDataMaps(); - route = 'upload'; - } - - if (step === 2) { - // users may browse from - dataMapStore.switchReadOnly(false); - - await dataMapStore.fetchDataMaps(); - dataMapStore.setSelectedFileId(dataMapStore.fileMapInfos[0].id); - dataMapStore.setSelectedFileInfo(); - dataMapStore.switchIrregularProcess(true); - serverDataImportStore.syncImportConfigs( - dataMapStore.selectedFileInfo!.load_parameter - ); - - route = 'mapping'; - } - - if (step === 3) { - // users may browse from - serverDataImportStore.switchReadOnly(false); - - await dataMapStore.fetchDataMaps(); - - // need to set default selected file - dataMapStore.setSelectedFileId(dataMapStore.fileMapInfos[0].id); - dataMapStore.setSelectedFileInfo(); - dataMapStore.switchIrregularProcess(true); - - serverDataImportStore.syncImportConfigs( - dataMapStore.selectedFileInfo!.load_parameter - ); - serverDataImportStore.switchIrregularProcess(true); - - if (status === 'SETTING') { - // user may browse from to - dataMapStore.switchReadOnly(false); - - serverDataImportStore.resetImportTasks(); - serverDataImportStore.switchFetchImportStatus('standby'); - serverDataImportStore.switchImportFinished(false); - } - - if (status === 'LOADING') { - // reveal previous & next button in - // users may browse from which set @readonly true - dataMapStore.switchReadOnly(false); - dataMapStore.switchLock(true); - serverDataImportStore.switchImportConfigReadOnly(true); - // users may browse from , let store fetches - // for one time and decide whether import is finished - serverDataImportStore.resetImportTasks(); - serverDataImportStore.switchImportFinished(false); - } - - route = 'loading'; - } - - dataImportRootStore.setCurrentStep(step); - - setLocation( - `/graph-management/${ - params!.id - }/data-import/import-manager/${jobId}/import-tasks/${route}` - ); - }; - - return ( -
- {(status === 'DEFAULT' || status === 'UPLOADING') && ( - - {t('import-manager.list-column-manipulations.start')} - - )} - {status === 'MAPPING' && ( - - {t('import-manager.list-column-manipulations.resume-setting')} - - )} - {(status === 'SETTING' || status === 'LOADING') && ( - - {t('import-manager.list-column-manipulations.resume-importing')} - - )} - {status === 'FAILED' && ( - // { - // setLocation( - // `/graph-management/${ - // params!.id - // }/data-import/job-error-log/${jobId}` - // ); - // }} - // > - // {t('import-manager.list-column-manipulations.check-error-log')} - // - - {t('import-manager.list-column-manipulations.check-error-log')} - - )} - { - switchPopDeleteModal(true); - }} - > - {t('import-manager.list-column-manipulations.delete')} - - { - switchPopDeleteModal(false); - await importManagerStore.deleteJob(jobId); - importManagerStore.fetchImportJobList(); - }} - key="delete" - > - {t('import-manager.modal.manipulations.delete')} - , - - ]} - destroyOnClose - needCloseIcon={true} - onCancel={() => { - switchPopDeleteModal(false); - }} - > -
- - {t('import-manager.modal.delete-job.hint', { - name: jobName - })} - - {t('import-manager.modal.delete-job.sub-hint')} -
-
-
- ); - } -); - -export const EmptyImportHints: React.FC = observer(() => { - const importManagerStore = useContext(ImportManagerStoreContext); - const [isPopCreateModal, switchCreatePopModal] = useState(false); - const { t } = useTranslation(); - - return ( -
- {t('import-manager.manipulation.create')} -
{t('import-manager.hint.empty-task')}
- - { - switchCreatePopModal(false); - await importManagerStore.createNewJob(); - importManagerStore.resetJob('new'); - - if (importManagerStore.requestStatus.createNewJob === 'success') { - Message.success({ - content: t('import-manager.hint.creation-succeed'), - size: 'medium', - showCloseIcon: false - }); - - importManagerStore.fetchImportJobList(); - return; - } - - if (importManagerStore.requestStatus.createNewJob === 'failed') { - Message.error({ - content: importManagerStore.errorInfo.createNewJob.message, - size: 'medium', - showCloseIcon: false - }); - } - }} - > - {t('import-manager.modal.manipulations.create')} - , - - ]} - destroyOnClose - needCloseIcon={true} - onCancel={() => { - switchCreatePopModal(false); - importManagerStore.resetJob('new'); - }} - > -
-
-
- - * - - {t('import-manager.modal.create-job.job-name')} -
- { - importManagerStore.mutateNewJob('name', e.value); - importManagerStore.validateJob('new', 'name'); - }} - onBlur={() => { - importManagerStore.validateJob('new', 'name'); - }} - /> -
-
-
{t('import-manager.modal.create-job.job-description')}
-
- { - importManagerStore.mutateNewJob('description', e.value); - importManagerStore.validateJob('new', 'description'); - }} - onBlur={() => { - importManagerStore.validateJob('new', 'description'); - }} - /> -
-
-
-
-
- ); -}); - -export default ImportTaskList; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTasks.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTasks.less deleted file mode 100644 index a93c3eddc..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTasks.less +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.import-tasks { - &-breadcrumb-wrapper { - margin: 16px 0; - } - - &-content-wrapper { - height: calc(100vh - 130px); - background: #fff; - } - - &-step-wrapper { - display: flex; - height: calc(100vh - 194px); - overflow: auto; - } - - &-step-content-header { - display: flex; - margin-bottom: 16px; - - & > span { - font-weight: 900; - line-height: 24px; - } - - & img { - cursor: pointer; - } - - &-expand { - margin-left: 9.7px; - transform: rotate(-180deg); - transition: transform 0.3s; - } - - &-collpase { - margin-left: 9.7px; - transform: rotate(0deg); - transition: transform 0.3s; - } - } - - &-tooltips { - padding: 16px; - color: #ff5b5b; - } - - &-manipulation { - font-size: 14px; - color: #2b65ff; - line-height: 20px; - cursor: pointer; - display: flex; - width: fit-content; - - &-disabled { - color: #999; - } - } - - &-complete-hint { - display: flex; - height: calc(100vh - 194px); - flex-direction: column; - justify-content: center; - align-items: center; - - &-description { - display: flex; - justify-content: center; - - & > div { - margin-left: 20px; - - & > div:first-of-type { - font-size: 24px; - } - - & > div:last-of-type { - color: #333; - } - } - } - - &-manipulations { - margin: 42px auto 0; - } - } -} - -// overrides -.import-tasks .new-fc-one-breadcrumb.new-fc-one-breadcrumb-small { - line-height: 22px; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTasks.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTasks.tsx deleted file mode 100644 index 3d951614e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/ImportTasks.tsx +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useMemo, useEffect, useLayoutEffect } from 'react'; -import { observer } from 'mobx-react'; -import { useRoute, useLocation } from 'wouter'; -import { isNull } from 'lodash-es'; -import { useTranslation } from 'react-i18next'; -import classnames from 'classnames'; -import { Steps, Button } from 'hubble-ui'; - -import UploadEntry from './UploadEntry'; -import { DataMapConfigs } from './datamap-configs'; -import { ServerDataImport } from './server-data-import'; -import ImportFinish from './ImportFinish'; -import { - ImportManagerStoreContext, - GraphManagementStoreContext, - DataImportRootStoreContext -} from '../../../../stores'; - -import PassIcon from '../../../../assets/imgs/ic_pass.svg'; - -import './ImportTasks.less'; - -const ImportTasks: React.FC = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const importManagerStore = useContext(ImportManagerStoreContext); - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const [, params] = useRoute( - '/graph-management/:id/data-import/import-manager/:jobId/import-tasks/:status*' - ); - const [, setLocation] = useLocation(); - const { t } = useTranslation(); - - const steps = useMemo( - () => [ - t('step.first'), - t('step.second'), - t('step.third'), - t('step.fourth') - ], - [] - ); - - const wrapperClassName = classnames({ - 'import-tasks': true, - 'import-tasks-with-expand-sidebar': graphManagementStore.isExpanded - }); - - useEffect(() => { - if (!isNull(params)) { - switch (params.status) { - case 'upload': - dataImportRootStore.setCurrentStep(1); - break; - case 'mapping': - dataImportRootStore.setCurrentStep(2); - break; - case 'loading': - dataImportRootStore.setCurrentStep(3); - break; - case 'finish': - dataImportRootStore.setCurrentStep(4); - break; - } - } - }, [params?.status]); - - useEffect(() => { - window.scrollTo(0, 0); - dataImportRootStore.setCurrentJobId(Number(params!.jobId)); - - graphManagementStore.fetchIdList(); - dataImportRootStore.setCurrentId(Number(params!.id)); - dataImportRootStore.fetchVertexTypeList(); - dataImportRootStore.fetchEdgeTypeList(); - dataMapStore.fetchDataMaps(); - - return () => { - // no specific job here, solve the problem that click back button in browser - // since relies on @selectedJob in useEffect() - importManagerStore.setSelectedJob(null); - dataImportRootStore.dispose(); - dataMapStore.dispose(); - serverDataImportStore.dispose(); - }; - }, []); - - return ( -
-
-
- - {steps.map((title: string, index: number) => ( - index + 1 - ? 'finish' - : 'wait' - } - key={title} - /> - ))} - -
- {dataImportRootStore.currentStep === 1 && } - {dataImportRootStore.currentStep === 2 && } - {dataImportRootStore.currentStep === 3 && } - {dataImportRootStore.currentStep === 4 && } -
-
- ); -}); - -export default ImportTasks; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/UploadEntry.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/UploadEntry.less deleted file mode 100644 index 7af02e583..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/UploadEntry.less +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.import-tasks { - &-upload-wrapper { - padding: 0 16px 28px; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - height: calc(100vh - 250px); - } - - &-upload-drag-area { - width: 400px; - height: 200px; - padding: 83px 73px; - border: 1px dashed #979797; - // display: flex; - // justify-content: center; - // align-items: center; - font-size: 12px; - color: #666; - - &:hover, - &.file-above { - border-color: #2b65ff; - } - } - - &-upload-file-list { - margin-top: 30px; - width: 400px; - max-height: calc(100vh - 512px); - overflow-y: auto; - overflow-x: hidden; - font-size: 14px; - line-height: 20px; - color: #333; - } - - &-upload-file-info { - margin-bottom: 19px; - - &-titles { - width: 75%; - display: flex; - justify-content: space-between; - } - - &-progress-status { - width: 400px; - display: flex; - align-items: center; - - &-refresh-icon { - position: relative; - left: -22px; - cursor: pointer; - } - - &-close-icon { - position: relative; - left: -35px; - cursor: pointer; - top: 0; - - &.in-progress { - left: 0; - top: 1px; - } - - &.in-error { - left: -12px; - top: 0; - } - } - } - } - - &-manipulation-wrapper { - display: flex; - justify-content: center; - } -} - -/* override */ - -// disable original delete icon in progress bar due to the img bug -.import-tasks-upload-file-info .new-fc-one-progress-operation { - display: none; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/UploadEntry.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/UploadEntry.tsx deleted file mode 100644 index 0449f24c9..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/UploadEntry.tsx +++ /dev/null @@ -1,1037 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useCallback, useRef, useEffect } from 'react'; -import { observer } from 'mobx-react'; -import { useLocation } from 'wouter'; -import classnames from 'classnames'; -import { - isEmpty, - size, - isUndefined, - range, - xor, - intersection -} from 'lodash-es'; -import { DndProvider, useDrop, DropTargetMonitor } from 'react-dnd'; -import { useTranslation } from 'react-i18next'; -import { HTML5Backend, NativeTypes } from 'react-dnd-html5-backend'; -import { Button, Progress, Message } from 'hubble-ui'; -import { CancellablePromise } from 'mobx/lib/api/flow'; - -import { DataImportRootStoreContext } from '../../../../stores'; -import { useInitDataImport } from '../../../../hooks'; -import { isCurrentJobUploadSizeExceeded } from '../../../../utils/dataImportUpload'; - -import type { FileUploadResult } from '../../../../stores/types/GraphManagementStore/dataImportStore'; - -import CloseIcon from '../../../../assets/imgs/ic_close_16.svg'; -import RefreshIcon from '../../../../assets/imgs/ic_refresh.svg'; - -import './UploadEntry.less'; - -const KB = 1024; -const MB = 1024 * 1024; -const GB = 1024 * 1024 * 1024; -const MAX_CONCURRENT_UPLOAD = 5; - -const UploadEntry: React.FC = observer(() => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const isInitReady = useInitDataImport(); - const { t } = useTranslation(); - const [, setLocation] = useLocation(); - - useEffect(() => { - const unload = (e: any) => { - e = e || window.event; - - if (e) { - e.returnValue = 'hint'; - } - - return 'hint'; - }; - - window.addEventListener('beforeunload', unload); - - return () => { - window.removeEventListener('beforeunload', unload); - }; - }, [dataImportRootStore]); - - return isInitReady ? ( - <> - - - -
- - -
- - ) : null; -}); - -export const FileDropZone: React.FC = observer(() => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const [{ canDrop, isOver }, drop] = useDrop({ - accept: [NativeTypes.FILE], - drop(item, monitor) { - handleFileDrop(monitor); - }, - collect: (monitor) => ({ - isOver: monitor.isOver(), - canDrop: monitor.canDrop() - }) - }); - const { t } = useTranslation(); - - const uploadRef = useRef(null); - - const validateFileCondition = (files: File[]) => { - const validatedFiles = []; - const currentUploadFileNames = dataImportRootStore.fileUploadTasks - .map(({ name }) => name) - .concat(dataMapStore.fileMapInfos.map(({ name }) => name)); - - const filteredFiles = files.filter( - ({ name }) => !currentUploadFileNames.includes(name) - ); - - if (size(filteredFiles) !== size(files)) { - const duplicatedFiles = xor(files, filteredFiles); - - Message.error({ - content: ( -
-

{t('upload-files.no-duplicate')}

- {duplicatedFiles.map((file) => ( -

{file.name}

- ))} -
- ), - size: 'medium', - showCloseIcon: false - }); - } - - if ( - isCurrentJobUploadSizeExceeded( - dataMapStore.fileMapInfos, - dataImportRootStore.fileUploadTasks, - filteredFiles - ) - ) { - Message.error({ - content: `${t('upload-files.over-all-size-limit')}`, - size: 'medium', - showCloseIcon: false - }); - - return []; - } - - for (const file of filteredFiles) { - const { name, size } = file; - const sizeGB = size / GB; - - if (size === 0) { - Message.error({ - content: `${name} ${t('upload-files.empty-file')}`, - size: 'medium', - showCloseIcon: false - }); - - break; - } - - if (name.slice(-4) !== '.csv') { - Message.error({ - content: `${name}: ${t('upload-files.wrong-format')}`, - size: 'medium', - showCloseIcon: false - }); - - break; - } - - if (sizeGB > 1) { - Message.error({ - content: `${name}: ${t('upload-files.over-single-size-limit')}`, - size: 'medium', - showCloseIcon: false - }); - - break; - } - - validatedFiles.push(file); - } - - dataImportRootStore.updateFileList(validatedFiles); - return validatedFiles; - }; - - const handleFileChange = (files: File[]) => { - for (const file of files) { - const { name, size } = file; - const sizeMB = size / MB; - - const chunkList = []; - // start byte to slice - let currentChunkStartIndex = 0; - // size of each chunk - let chunkSizeMB: number; - let chunkIndex = 0; - - if (sizeMB > 2 && sizeMB <= 128) { - chunkSizeMB = 2; - } else if (sizeMB > 128 && size <= 512) { - chunkSizeMB = 4; - } else { - chunkSizeMB = 5; - } - - while (currentChunkStartIndex < size) { - chunkList.push({ - chunkIndex, - chunk: file.slice( - currentChunkStartIndex, - currentChunkStartIndex + chunkSizeMB * MB - ) - }); - currentChunkStartIndex += chunkSizeMB * MB; - ++chunkIndex; - } - - dataImportRootStore.initFileUploadTask({ - name, - size, - status: 'uploading', - chunkList, - chunkTotal: Math.ceil(size / (chunkSizeMB * MB)), - uploadedChunkTotal: 0, - pendingChunkIndexes: [], - failedChunkIndexes: [], - uploadedChunksIndexes: [] - }); - } - }; - - const initFileTaskQueue = () => { - const firstRequestTasks = dataImportRootStore.fileUploadTasks.slice( - 0, - MAX_CONCURRENT_UPLOAD - ); - - firstRequestTasks.forEach(({ name, chunkList, chunkTotal }) => { - const task = dataImportRootStore.uploadFiles({ - fileName: name, - fileChunkList: chunkList[0], - fileChunkTotal: chunkTotal - }); - - dataImportRootStore.addFileUploadQueue({ - fileName: name, - status: 'uploading', - task - }); - - scheduler(name, 0, task); - }); - - if (size(firstRequestTasks) < MAX_CONCURRENT_UPLOAD) { - let loopCount = 1; - - // Traverse firstRequestTasks to add extra items to queue - while (loopCount) { - const currentQueueItemSize = size(dataImportRootStore.fileUploadQueue); - - firstRequestTasks.forEach(({ chunkTotal, chunkList, name }) => { - if ( - chunkTotal > loopCount && - size(dataImportRootStore.fileUploadQueue) < MAX_CONCURRENT_UPLOAD - ) { - const task = dataImportRootStore.uploadFiles({ - fileName: name, - fileChunkList: chunkList[loopCount], - fileChunkTotal: chunkTotal - }); - - dataImportRootStore.addFileUploadQueue({ - fileName: name, - status: 'uploading', - task - }); - - scheduler(name, loopCount, task); - } - }); - - if ( - size(dataImportRootStore.fileUploadQueue) === MAX_CONCURRENT_UPLOAD || - // which means no other items pushed into queue - currentQueueItemSize === size(dataImportRootStore.fileUploadQueue) - ) { - break; - } else { - loopCount += 1; - } - } - } - }; - - const scheduler = useCallback( - async ( - fileName: string, - fileChunkIndex: number, - task: CancellablePromise, - retryMode: boolean = false - ) => { - const fileUploadTask = dataImportRootStore.fileUploadTasks.find( - ({ name }) => name === fileName - )!; - - // users may click back button in browser - if (isUndefined(fileUploadTask)) { - return; - } - - // the index of fileChunk is pending - dataImportRootStore.mutateFileUploadTasks( - 'pendingChunkIndexes', - [...fileUploadTask.pendingChunkIndexes, fileChunkIndex], - fileName - ); - - let result; - - // cancel all uploads by user - if (fileUploadTask.status === 'failed') { - task.cancel(); - result = undefined; - } else { - result = await task; - } - - if (isUndefined(result) || result.status === 'FAILURE') { - if (fileUploadTask.status !== 'failed') { - if (dataImportRootStore.errorInfo.uploadFiles.message !== '') { - Message.error({ - content: dataImportRootStore.errorInfo.uploadFiles.message, - size: 'medium', - showCloseIcon: false - }); - } - - dataImportRootStore.mutateFileUploadTasks( - 'status', - 'failed', - fileName - ); - } - - dataImportRootStore.mutateFileUploadTasks( - 'failedChunkIndexes', - [...fileUploadTask.failedChunkIndexes, fileChunkIndex], - fileName - ); - - dataImportRootStore.mutateFileUploadTasks( - 'pendingChunkIndexes', - [], - fileName - ); - - dataImportRootStore.removeFileUploadQueue(fileName); - return; - } - - if (result.status === 'SUCCESS') { - dataImportRootStore.mutateFileUploadTasks( - 'uploadedChunkTotal', - fileUploadTask.uploadedChunkTotal + 1, - fileName - ); - - dataImportRootStore.mutateFileUploadTasks( - 'uploadedChunksIndexes', - [...fileUploadTask.uploadedChunksIndexes, fileChunkIndex], - fileName - ); - - if (retryMode) { - // remove failed chunk index after succeed - dataImportRootStore.mutateFileUploadTasks( - 'failedChunkIndexes', - fileUploadTask.failedChunkIndexes.filter( - (failedChunkIndex) => failedChunkIndex !== fileChunkIndex - ), - fileName - ); - - // if there are no longer existed failed chunk index, - // set retry mode to false - if (size(fileUploadTask.failedChunkIndexes) === 0) { - retryMode = false; - } - } - - // all file chunks are uploaded - if (fileUploadTask.chunkTotal === fileUploadTask.uploadedChunkTotal) { - // remove fully uploaded file from queue - dataImportRootStore.removeFileUploadQueue(fileName); - // change the status of fully uploaded file to success - dataImportRootStore.mutateFileUploadTasks( - 'status', - 'success', - fileName - ); - // clear chunkList of fully uploaded file to release memory - dataImportRootStore.mutateFileUploadTasks('chunkList', [], fileName); - - // no uploading files - if ( - dataImportRootStore.fileUploadTasks.every( - ({ status }) => status !== 'uploading' - ) - ) { - dataMapStore.fetchDataMaps(); - return; - } - - if (size(dataImportRootStore.fileRetryUploadList) !== 0) { - // check if there are some failed uploads waiting in retry queue - const fileName = dataImportRootStore.pullRetryFileUploadQueue()!; - const retryFileUploadTask = dataImportRootStore.fileUploadTasks.find( - ({ name }) => name === fileName - )!; - - const task = dataImportRootStore.uploadFiles({ - fileName, - fileChunkList: - retryFileUploadTask.chunkList[ - retryFileUploadTask.failedChunkIndexes[0] - ], - fileChunkTotal: retryFileUploadTask.chunkTotal - }); - - scheduler( - retryFileUploadTask.name, - retryFileUploadTask.failedChunkIndexes[0], - task, - true - ); - - return; - } - - for (const [ - fileIndex, - fileUploadTask - ] of dataImportRootStore.fileUploadTasks.entries()) { - // if there still has files which are fully not being uploaded - if ( - fileUploadTask.uploadedChunkTotal === 0 && - size(fileUploadTask.pendingChunkIndexes) === 0 - ) { - const task = dataImportRootStore.uploadFiles({ - fileName: fileUploadTask.name, - fileChunkList: - dataImportRootStore.fileUploadTasks[fileIndex].chunkList[0], - fileChunkTotal: - dataImportRootStore.fileUploadTasks[fileIndex].chunkTotal - }); - - dataImportRootStore.addFileUploadQueue({ - fileName: fileUploadTask.name, - status: 'uploading', - task - }); - - scheduler(fileUploadTask.name, 0, task); - - // if queue is full, do not loop to add task - if ( - size(dataImportRootStore.fileUploadQueue) === - MAX_CONCURRENT_UPLOAD - ) { - break; - } - } - } - - return; - } - - let nextUploadChunkIndex; - - if (retryMode) { - const duplicateIndexes = intersection( - fileUploadTask.uploadedChunksIndexes, - fileUploadTask.failedChunkIndexes - ); - - if (!isEmpty(duplicateIndexes)) { - dataImportRootStore.mutateFileUploadTasks( - 'failedChunkIndexes', - fileUploadTask.failedChunkIndexes.filter( - (failedIndex) => !duplicateIndexes.includes(failedIndex) - ), - fileName - ); - } - - if (isEmpty(fileUploadTask.failedChunkIndexes)) { - retryMode = false; - } - - nextUploadChunkIndex = - fileUploadTask.failedChunkIndexes[0] || - Math.max( - ...fileUploadTask.pendingChunkIndexes, - // maybe it just turns retry mode to false - // and the failed chunk index could be less than - // the one which uploads success - // we have to compare uploaded chunk index either - ...fileUploadTask.uploadedChunksIndexes - ) + 1; - } else { - nextUploadChunkIndex = - Math.max( - ...fileUploadTask.pendingChunkIndexes, - // maybe it just turns retry mode to false - // and the failed chunk index could be less than - // the one which uploads success - // we have to compare uploaded chunk index either - ...fileUploadTask.uploadedChunksIndexes - ) + 1; - } - - // remove pending here to get right result of nextUploadChunkIndex - dataImportRootStore.mutateFileUploadTasks( - 'pendingChunkIndexes', - fileUploadTask.pendingChunkIndexes.filter( - (pendingChunkIndex) => pendingChunkIndex !== fileChunkIndex - ), - fileName - ); - - // no recursion - if ( - nextUploadChunkIndex > fileUploadTask.chunkTotal - 1 || - fileUploadTask.uploadedChunksIndexes.includes(nextUploadChunkIndex) - ) { - return; - } - - scheduler( - fileName, - nextUploadChunkIndex, - dataImportRootStore.uploadFiles({ - fileName, - fileChunkList: fileUploadTask.chunkList[nextUploadChunkIndex], - fileChunkTotal: fileUploadTask.chunkTotal - }), - retryMode - ); - - return; - } - }, - [] - ); - - const handleFileDrop = async (monitor: DropTargetMonitor) => { - if (monitor) { - const fileList = monitor.getItem().files; - const currentValidateFileList = validateFileCondition(fileList); - const isFirstBatchUpload = - size(dataImportRootStore.fileUploadTasks) === 0; - - if (isEmpty(currentValidateFileList)) { - return; - } - - await dataImportRootStore.fetchFilehashes( - currentValidateFileList.map(({ name }) => name) - ); - - handleFileChange(currentValidateFileList); - - if (isFirstBatchUpload) { - initFileTaskQueue(); - } else { - const spareQueueItems = - MAX_CONCURRENT_UPLOAD - size(dataImportRootStore.fileUploadQueue); - - if (spareQueueItems === 0) { - return; - } - - // if new selected files are less than spare spaces from queue - if (spareQueueItems >= size(currentValidateFileList)) { - currentValidateFileList.forEach(({ name }) => { - const fileUploadTask = dataImportRootStore.fileUploadTasks.find( - ({ name: fileName }) => fileName === name - )!; - - const task = dataImportRootStore.uploadFiles({ - fileName: name, - fileChunkList: fileUploadTask.chunkList[0], - fileChunkTotal: fileUploadTask.chunkTotal - }); - - dataImportRootStore.addFileUploadQueue({ - fileName: fileUploadTask.name, - status: 'uploading', - task - }); - scheduler(name, 0, task); - }); - } else { - range(spareQueueItems).forEach((fileUploadTaskIndex) => { - const fileUploadTask = dataImportRootStore.fileUploadTasks.find( - ({ name: fileName }) => - fileName === currentValidateFileList[fileUploadTaskIndex].name - )!; - - const task = dataImportRootStore.uploadFiles({ - fileName: fileUploadTask.name, - fileChunkList: fileUploadTask.chunkList[0], - fileChunkTotal: fileUploadTask.chunkTotal - }); - - dataImportRootStore.addFileUploadQueue({ - fileName: fileUploadTask.name, - status: 'uploading', - task - }); - scheduler(fileUploadTask.name, 0, task); - }); - } - } - } - }; - - const handleFileSelect = async (e: React.ChangeEvent) => { - // event in async callback should call this - e.persist(); - - if (e.target.files) { - const fileList = Array.from(e.target.files); - const currentValidateFileList = validateFileCondition(fileList); - const isFirstBatchUpload = - size(dataImportRootStore.fileUploadTasks) === 0; - - if (isEmpty(currentValidateFileList)) { - return; - } - - await dataImportRootStore.fetchFilehashes( - currentValidateFileList.map(({ name }) => name) - ); - - handleFileChange(currentValidateFileList); - - if (isFirstBatchUpload) { - initFileTaskQueue(); - } else { - const spareQueueItems = - MAX_CONCURRENT_UPLOAD - size(dataImportRootStore.fileUploadQueue); - - if (spareQueueItems === 0) { - return; - } - - // if new selected files are less than spare spaces from queue - if (spareQueueItems >= size(currentValidateFileList)) { - currentValidateFileList.forEach(({ name }) => { - const fileUploadTask = dataImportRootStore.fileUploadTasks.find( - ({ name: fileName }) => fileName === name - )!; - - const task = dataImportRootStore.uploadFiles({ - fileName: name, - fileChunkList: fileUploadTask.chunkList[0], - fileChunkTotal: fileUploadTask.chunkTotal - }); - - dataImportRootStore.addFileUploadQueue({ - fileName: fileUploadTask.name, - status: 'uploading', - task - }); - scheduler(name, 0, task); - }); - } else { - range(spareQueueItems).forEach((fileUploadTaskIndex) => { - const fileUploadTask = dataImportRootStore.fileUploadTasks.find( - ({ name: fileName }) => - fileName === currentValidateFileList[fileUploadTaskIndex].name - )!; - - const task = dataImportRootStore.uploadFiles({ - fileName: fileUploadTask.name, - fileChunkList: fileUploadTask.chunkList[0], - fileChunkTotal: fileUploadTask.chunkTotal - }); - - dataImportRootStore.addFileUploadQueue({ - fileName: fileUploadTask.name, - status: 'uploading', - task - }); - scheduler(fileUploadTask.name, 0, task); - }); - } - } - } - - // select same file will not trigger onChange on input[type="file"] - // need to reset its value here - e.target.value = ''; - }; - - const dragAreaClassName = classnames({ - 'import-tasks-upload-drag-area': true, - 'file-above': canDrop && isOver - }); - - // if upload file api throw errors - useEffect(() => { - if (dataImportRootStore.errorInfo.uploadFiles.message !== '') { - Message.error({ - content: dataImportRootStore.errorInfo.uploadFiles.message, - size: 'medium', - showCloseIcon: false - }); - } - }, [dataImportRootStore.errorInfo.uploadFiles.message]); - - return ( -
- - -
- ); -}); - -export interface FileListProps { - scheduler: ( - fileName: string, - fileChunkIndex: number, - task: CancellablePromise, - retryMode?: boolean - ) => Promise; -} - -export const FileList: React.FC = observer(({ scheduler }) => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore } = dataImportRootStore; - - const handleRetry = (fileName: string) => () => { - // if (size(dataImportRootStore.fileUploadQueue) === 0) { - if (size(dataImportRootStore.fileUploadQueue) < MAX_CONCURRENT_UPLOAD) { - const fileUploadTask = dataImportRootStore.fileUploadTasks.find( - ({ name }) => name === fileName - )!; - - const task = dataImportRootStore.uploadFiles({ - fileName, - fileChunkList: - fileUploadTask.chunkList[fileUploadTask.failedChunkIndexes[0]] || - fileUploadTask.chunkList[ - Math.max( - ...fileUploadTask.pendingChunkIndexes, - // maybe it just turns retry mode to false - // and the failed chunk index could be less than - // the one which uploads success - // we have to compare uploaded chunk index either - ...fileUploadTask.uploadedChunksIndexes - ) + 1 - ], - fileChunkTotal: fileUploadTask.chunkTotal - }); - - dataImportRootStore.addFileUploadQueue({ - fileName, - status: 'uploading', - task - }); - - dataImportRootStore.mutateFileUploadTasks( - 'status', - 'uploading', - fileName - ); - - if (!isEmpty(fileUploadTask.failedChunkIndexes)) { - dataImportRootStore.mutateFileUploadTasks( - 'failedChunkIndexes', - [...fileUploadTask.failedChunkIndexes.slice(1)], - fileName - ); - } - - scheduler( - fileName, - fileUploadTask.failedChunkIndexes[0] || - Math.max( - ...fileUploadTask.pendingChunkIndexes, - // maybe it just turns retry mode to false - // and the failed chunk index could be less than - // the one which uploads success - // we have to compare uploaded chunk index either - ...fileUploadTask.uploadedChunksIndexes - ) + 1, - task, - true - ); - } else { - // or just add filename to retry queue, - // let other scheduler decide when to call it - dataImportRootStore.addRetryFileUploadQueue(fileName); - } - }; - - const handleDelete = (name: string, existed = false) => async () => { - await dataImportRootStore.deleteFiles(name); - - if (dataImportRootStore.requestStatus.deleteFiles === 'failed') { - Message.error({ - content: dataImportRootStore.errorInfo.deleteFiles.message, - size: 'medium', - showCloseIcon: false - }); - - return; - } - - if (existed === true) { - dataMapStore.fetchDataMaps(); - return; - } - - dataImportRootStore.removeFileUploadTasks(name); - - // if no uploading files, fetch data maps again - if ( - !dataImportRootStore.fileUploadTasks.some( - ({ status }) => status === 'uploading' - ) - ) { - dataMapStore.fetchDataMaps(); - } - }; - - return ( -
- {dataImportRootStore.fileUploadTasks.map( - ({ name, size, chunkTotal, uploadedChunkTotal, status }) => { - const [sizeKB, sizeMB, sizeGB] = [size / KB, size / MB, size / GB]; - const convertedSize = - sizeGB > 1 - ? String(sizeGB.toFixed(2)) + ' GB' - : sizeMB > 1 - ? String(sizeMB.toFixed(2)) + ' MB' - : sizeKB > 1 - ? String(sizeKB.toFixed(2)) + ' KB' - : String(size) + ' Byte'; - const progress = Number( - ((uploadedChunkTotal / chunkTotal) * 100).toFixed(2) - ); - - return ( -
-
- {name} - {convertedSize} -
-
- - {status === 'failed' && progress !== 100 && ( - retry-upload-file - )} - delete-file -
-
- ); - } - )} - {dataMapStore.fileMapInfos - .filter( - ({ name }) => - !dataImportRootStore.successFileUploadTaskNames.includes(name) - ) - .map(({ name, total_size }) => { - return ( -
-
- {name} - {total_size} -
-
- - delete-file -
-
- ); - })} -
- ); -}); - -export default UploadEntry; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.less deleted file mode 100644 index 174042063..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.less +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.import-tasks { - &-data-map { - margin-bottom: 40px; - } - - &-data-map-tooltip { - background: #fff; - box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.2); - border-radius: 4px; - padding: 16px; - font-size: 14px; - - &-text { - margin-bottom: 8px; - - &:nth-child(2) { - color: #e64552; - font-size: 16px; - margin-bottom: 12px; - } - - &:last-child { - margin-bottom: 0; - } - } - - &.no-display { - display: none; - } - } - - &-data-type-info-wrapper { - // margin-bottom: 16px; - padding: 24px 16px; - height: 100px; - box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15); - border-radius: 3px; - display: flex; - position: relative; - } - - &-data-type-info { - display: flex; - flex-direction: column; - padding-right: 8px; - // flex: 1; - - &:nth-child(1) { - // width: 24%; - flex: 1 0; - - & img.collpase { - transform: rotate(-90deg); - transition: transform 0.3s; - } - - & img.expand { - transform: rotate(0deg); - transition: transform 0.3s; - } - } - - &:nth-child(2) { - flex: 1 0; - } - - &:nth-child(3) { - flex: 1 0; - } - - &:last-child { - padding-right: 0; - width: 168px; - flex-direction: row; - align-items: center; - } - - & > div { - display: flex; - } - - &-title { - font-size: 12px; - line-height: 18px; - color: #666; - } - - &-content { - max-width: 180px; - margin-top: 13px; - font-size: 16px; - line-height: 22px; - color: #333; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - } - - &-data-options { - display: flex; - line-height: 32px; - margin-bottom: 32px; - font-size: 14px; - align-items: center; - - &-title { - display: flex; - justify-content: flex-end; - align-items: center; - width: 62px; - margin-right: 44px; - color: #333; - font-size: 14px; - - &.in-card { - width: 76px; - } - } - - &-value-maps { - width: 650px; - background-color: #f5f5f5; - margin-bottom: 16px; - padding: 16px 40px; - } - - &-expand-table { - width: 80%; - display: flex; - flex-direction: column; - - &-row { - display: flex; - margin-bottom: 8px; - - &:first-child { - margin-bottom: 12px; - } - } - - &-column { - height: 32px; - display: flex; - align-items: center; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 14px; - line-height: 32px; - - &:nth-child(1) { - flex-basis: 30%; - } - - &:nth-child(2) { - flex-basis: 30%; - } - - &:nth-child(3) { - flex-basis: 30%; - } - - &:last-child { - flex-basis: 10%; - justify-content: center; - } - } - } - - &-expand-dropdown { - width: 382px; - max-height: 328px; - overflow: auto; - background: #fff; - box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15); - border-radius: 3px; - color: #333; - - & > div { - padding: 0 16px; - height: 32px; - display: flex; - align-items: center; - } - } - - &-expand-values { - display: flex; - flex-direction: column; - } - - &-expand-value { - display: flex; - margin-bottom: 32px; - - &:nth-last-child(2) { - margin-bottom: 16px; - } - - &:nth-last-child(1) { - margin-bottom: 0; - } - - & img { - margin: 0 2px; - } - - &-column { - height: 32px; - display: flex; - align-items: center; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 14px; - line-height: 32px; - - &:nth-child(1) { - width: 30%; - } - - &:nth-child(2) { - width: 30%; - } - - &:nth-child(3) { - width: 30%; - } - - &:nth-child(4) { - width: 10%; - } - } - } - - &-expand-info { - display: flex; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - - & > span { - font-size: 14px; - line-height: 32px; - - &:nth-child(1) { - width: 60px; - } - } - - & > img { - margin: 0 6px; - } - } - - &-expand-input { - margin-top: 12px; - - &:first-child { - margin-top: 0; - } - } - } - - &-data-type-manipulations { - display: flex; - margin-left: auto; - } - - &-data-map-manipulations { - width: 100%; - margin-top: 40px; - display: flex; - justify-content: center; - } - - &-data-map-configs { - padding: 0 16px; - width: 100%; - overflow: auto; - } - - // &-data-map-config-header { - // display: flex; - // margin-bottom: 16px; - - // & > span { - // font-weight: 900; - // line-height: 24px; - // } - - // & img { - // cursor: pointer; - // } - - // &-expand { - // margin-left: 9.7px; - // transition: transform 0.3s; - // } - - // &-collpase { - // margin-left: 9.7px; - // transform: rotate(-180deg); - // transition: transform 0.3s; - // } - // } - - &-data-map-config-card { - // prevent box-shadow being cliped - // margin: 0 3px; - box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15); - border-radius: 3px; - margin-bottom: 16px; - padding: 16px; - } - - &-data-map-config-view { - width: 100%; - background: #fafafa; - border: 1px solid #eee; - border-radius: 0 0 3px 3px; - margin-bottom: 16px; - padding: 16px; - // position: absolute; - // top: 100px; - // left: 0; - z-index: 9; - } -} - -.import-tasks-tooltips { - width: 368px; - background: #fff; - box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15); - border-radius: 3px; - padding: 24px; - font-size: 14px; - color: #333; - - & p { - margin: 0; - - &:nth-of-type(1) { - margin-bottom: 16px; - font-weight: 900; - font-size: 16px; - color: #000; - } - - &:nth-of-type(2) { - margin-bottom: 24px; - font-size: 14px; - color: #333; - } - } -} - -/* override */ - -.import-tasks-data-options - .new-fc-one-checkbox-group.new-fc-one-checkbox-group-medium.new-fc-one-checkbox-group-row { - line-height: normal; -} - -// reveal scrollbar by auto, directly override style on will both set internal wrapper and
    itself, which cause shrinks on . -.import-tasks-step-wrapper - > .new-fc-one-menu-inline-box.new-fc-one-menu-inline-medium - > ul { - overflow: auto; -} - -.import-tasks-data-map-configs - .new-fc-one-input-error.new-fc-one-input-error-layer { - word-break: keep-all; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.tsx deleted file mode 100644 index 562fac5aa..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/DataMapConfigs.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useEffect } from 'react'; -import { observer } from 'mobx-react'; -import { isEmpty } from 'lodash-es'; -import { Menu } from 'hubble-ui'; - -import { - ImportManagerStoreContext, - DataImportRootStoreContext -} from '../../../../../stores'; -import FileConfigs from './FileConfigs'; -import TypeConfigs from './TypeConfigs'; -import { useInitDataImport } from '../../../../../hooks'; - -import './DataMapConfigs.less'; - -export interface DataMapConfigsProps { - height?: string; -} - -const DataMapConfigs: React.FC = observer(({ height }) => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const isInitReady = useInitDataImport(); - const realHeight = height ? height : 'calc(100vh - 194px)'; - - return isInitReady ? ( -
    - { - // reset state from the previous file - dataMapStore.resetDataMaps(); - - // if data import starts, do not expand collpase - if (!serverDataImportStore.isServerStartImport) { - dataMapStore.switchExpand('file', true); - } - - dataMapStore.setSelectedFileId(Number(e.key)); - dataMapStore.setSelectedFileInfo(); - serverDataImportStore.switchImporting(false); - }} - > - {dataMapStore.fileMapInfos - .filter(({ file_status }) => file_status === 'COMPLETED') - .map(({ id, name }) => ( - - {name} - - ))} - -
    - - -
    -
    - ) : null; -}); - -export default DataMapConfigs; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/EdgeMap.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/EdgeMap.tsx deleted file mode 100644 index 84729a65a..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/EdgeMap.tsx +++ /dev/null @@ -1,1707 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useState } from 'react'; -import { observer } from 'mobx-react'; -import { isUndefined, isEmpty, size, cloneDeep } from 'lodash-es'; -import { useTranslation } from 'react-i18next'; -import classnames from 'classnames'; -import { Input, Select, Checkbox, Message } from 'hubble-ui'; - -import { Tooltip } from '../../../../common'; -import { DataImportRootStoreContext } from '../../../../../stores'; -import { - VertexType, - EdgeType -} from '../../../../../stores/types/GraphManagementStore/metadataConfigsStore'; -import TypeConfigManipulations from './TypeConfigManipulations'; -import { getUnicodeLength } from '../../../../../utils'; - -import ArrowIcon from '../../../../../assets/imgs/ic_arrow_16.svg'; -import BlueArrowIcon from '../../../../../assets/imgs/ic_arrow_blue.svg'; -import CloseIcon from '../../../../../assets/imgs/ic_close_16.svg'; -import MapIcon from '../../../../../assets/imgs/ic_yingshe_16.svg'; - -export interface EdgeMapProps { - checkOrEdit: 'check' | 'edit' | boolean; - onCancelCreateEdge: () => void; - edgeMapIndex?: number; -} - -const EdgeMap: React.FC = observer( - ({ checkOrEdit, onCancelCreateEdge, edgeMapIndex }) => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore } = dataImportRootStore; - const [isAddMapping, switchAddMapping] = useState(false); - const [isExpandAdvance, switchExpandAdvance] = useState(false); - const { t } = useTranslation(); - - const isCheck = checkOrEdit === 'check'; - const isEdit = checkOrEdit === 'edit'; - const edgeMap = - checkOrEdit !== false - ? dataMapStore.editedEdgeMap! - : dataMapStore.newEdgeType; - const filteredColumnNamesInSelection = - checkOrEdit !== false - ? dataMapStore.filteredColumnNamesInEdgeEditSelection - : dataMapStore.filteredColumnNamesInEdgeNewSelection; - - const findEdge = (collection: EdgeType[], label: string) => - collection.find(({ name }) => name === label); - - const findVertex = (collection: VertexType[], label: string) => - collection.find(({ name }) => name === label); - - const selectedEdge = findEdge(dataImportRootStore.edgeTypes, edgeMap.label); - - let selectedSourceVertex: VertexType | undefined; - let selectedTargetVertex: VertexType | undefined; - - if (!isUndefined(selectedEdge)) { - selectedSourceVertex = findVertex( - dataImportRootStore.vertexTypes, - selectedEdge.source_label - ); - selectedTargetVertex = findVertex( - dataImportRootStore.vertexTypes, - selectedEdge.target_label - ); - } - - const isStrategyAutomatic = - selectedSourceVertex?.id_strategy === 'AUTOMATIC' || - selectedTargetVertex?.id_strategy === 'AUTOMATIC'; - - const handleExpand = () => { - dataMapStore.switchExpand('type', !dataMapStore.isExpandTypeConfig); - }; - - const handleExpandAdvance = () => { - switchExpandAdvance(!isExpandAdvance); - }; - - const wrapperName = classnames({ - 'import-tasks-data-map-config-card': !Boolean(checkOrEdit), - 'import-tasks-data-map-config-view': Boolean(checkOrEdit) - }); - - const expandAdvanceClassName = classnames({ - 'import-tasks-step-content-header-expand': isExpandAdvance, - 'import-tasks-step-content-header-collpase': !isExpandAdvance - }); - - const expandAddMapClassName = classnames({ - 'import-tasks-step-content-header-expand': isAddMapping, - 'import-tasks-step-content-header-collpase': !isAddMapping - }); - - const addMappingManipulationClassName = classnames({ - 'import-tasks-manipulation': true, - 'import-tasks-manipulation-disabled': - size(filteredColumnNamesInSelection) === 0 || isStrategyAutomatic - }); - - const addNullValueClassName = classnames({ - 'import-tasks-manipulation': true, - 'import-tasks-manipulation-disabled': edgeMap.null_values.customized.includes( - '' - ) - }); - - const addPropertyMapClassName = classnames({ - 'import-tasks-manipulation': true, - 'import-tasks-manipulation-disabled': - !dataMapStore.allowAddPropertyMapping('edge') || isStrategyAutomatic - }); - - return ( -
    - {Boolean(checkOrEdit) ? ( -
    - {t('data-configs.type.basic-settings')} -
    - ) : ( -
    - {t('data-configs.type.edge.title')} - collpaseOrExpand -
    - )} -
    - - {t('data-configs.type.edge.type')}: - - {isCheck ? ( - {dataMapStore.editedEdgeMap!.label} - ) : ( - - )} -
    - - {!isUndefined(selectedSourceVertex) && ( -
    - - {t('data-configs.type.edge.source-ID-strategy')}: - - - {t('data-configs.type.hint.lack-support-for-automatic')} - - } - > - {t( - `data-configs.type.ID-strategy.${selectedSourceVertex?.id_strategy}` - )} - {selectedSourceVertex?.id_strategy === 'PRIMARY_KEY' && - `-${selectedSourceVertex?.primary_keys.join(',')}`} - -
    - )} - {edgeMap.source_fields.map((idField, fieldIndex) => { - return ( -
    - - {t('data-configs.type.edge.ID-column') + - (selectedSourceVertex?.id_strategy === 'PRIMARY_KEY' - ? fieldIndex + 1 - : '')} - : - - {isCheck ? ( - {idField} - ) : ( - - )} -
    - ); - })} - - {!isUndefined(selectedTargetVertex) && ( -
    - - {t('data-configs.type.edge.target-ID-strategy')}: - - - {t('data-configs.type.hint.lack-support-for-automatic')} - - } - > - {t( - `data-configs.type.ID-strategy.${selectedTargetVertex?.id_strategy}` - )} - {selectedTargetVertex?.id_strategy === 'PRIMARY_KEY' && - `-${selectedTargetVertex?.primary_keys.join(',')}`} - -
    - )} - {edgeMap.target_fields.map((idField, fieldIndex) => { - return ( -
    - - {t('data-configs.type.edge.ID-column') + - (selectedTargetVertex?.id_strategy === 'PRIMARY_KEY' - ? fieldIndex + 1 - : '')} - : - - {isCheck ? ( - {idField} - ) : ( - - )} -
    - ); - })} - -
    - - {t('data-configs.type.edge.map-settings')}: - -
    - {isCheck && - isEmpty(dataMapStore.editedEdgeMap?.field_mapping) && - '-'} - - {((Boolean(checkOrEdit) === false && - !isEmpty(dataMapStore.newEdgeType.field_mapping)) || - (Boolean(checkOrEdit) !== false && - !isEmpty(dataMapStore.editedEdgeMap!.field_mapping))) && ( -
    -
    - {t('data-configs.type.edge.add-map.name')} -
    -
    - {t('data-configs.type.edge.add-map.sample')} -
    -
    - {t('data-configs.type.edge.add-map.property')} -
    -
    - {!isCheck && ( - { - isEdit - ? dataMapStore.toggleEdgeSelectAllFieldMapping( - 'edit', - false, - selectedEdge - ) - : dataMapStore.toggleEdgeSelectAllFieldMapping( - 'new', - false, - selectedEdge - ); - }} - > - {t('data-configs.type.edge.add-map.clear')} - - )} -
    -
    - )} - {edgeMap.field_mapping.map( - ({ column_name, mapped_name }, fieldIndex) => { - const param = checkOrEdit === false ? 'new' : 'edit'; - - return ( -
    -
    - {column_name} -
    -
    - { - dataMapStore.selectedFileInfo?.file_setting - .column_values[ - dataMapStore.selectedFileInfo?.file_setting.column_names.findIndex( - (name) => column_name === name - ) - ] - } -
    -
    - {isCheck ? ( - {mapped_name} - ) : ( - - )} -
    -
    - {!isCheck && ( - close { - dataMapStore.removeEdgeFieldMapping( - param, - column_name - ); - }} - /> - )} -
    -
    - ); - } - )} - - {!isCheck && ( - <> -
    { - if ( - size(filteredColumnNamesInSelection) === 0 || - isStrategyAutomatic - ) { - switchAddMapping(false); - return; - } - - switchAddMapping(!isAddMapping); - }} - > -
    - {t('data-configs.type.edge.add-map.title')} -
    - expand -
    - {isAddMapping && ( -
    -
    - - { - if (isEdit) { - const isIndeterminate = - !isEmpty( - dataMapStore.editedEdgeMap?.field_mapping - ) && - size( - dataMapStore.editedEdgeMap?.field_mapping - ) !== - size( - dataMapStore.filteredColumnNamesInEdgeEditSelection - ); - - dataMapStore.toggleEdgeSelectAllFieldMapping( - 'edit', - // if isIndeterminate is true, e.target.checked is false - isIndeterminate || e.target.checked, - selectedEdge - ); - } else { - const isIndeterminate = - !isEmpty( - dataMapStore.newEdgeType.field_mapping - ) && - size(dataMapStore.newEdgeType.field_mapping) !== - size( - dataMapStore.filteredColumnNamesInEdgeNewSelection - ); - - dataMapStore.toggleEdgeSelectAllFieldMapping( - 'new', - isIndeterminate || e.target.checked, - selectedEdge - ); - } - }} - > - {t('data-configs.type.edge.select-all')} - - -
    - {filteredColumnNamesInSelection.map((name) => { - const param = isEdit ? 'edit' : 'new'; - - let combinedText = name; - let currentColumnValue = dataMapStore.selectedFileInfo - ?.file_setting.column_values[ - dataMapStore.selectedFileInfo?.file_setting.column_names.findIndex( - (columnName) => name === columnName - ) - ] as string; - combinedText += `(${currentColumnValue})`; - - if (getUnicodeLength(combinedText) > 35) { - combinedText = combinedText.slice(0, 35) + '...'; - } - - const mappingValue = selectedEdge?.properties.find( - ({ name: propertyName }) => propertyName === name - )?.name; - - return ( -
    - - column_name === name - ) - ) - } - onChange={(e: any) => { - if (e.target.checked) { - dataMapStore.setEdgeFieldMappingKey( - param, - name, - mappingValue - ); - } else { - dataMapStore.removeEdgeFieldMapping( - param, - name - ); - } - }} - > - {combinedText} - - -
    - ); - })} -
    - )} - - )} -
    -
    - -
    - {t('data-configs.type.edge.advance.title')} - {!isCheck && ( - collpaseOrExpand - )} -
    - {(isExpandAdvance || isCheck) && ( - <> -
    - - {t('data-configs.type.edge.advance.nullable-list.title')}: - - {isCheck ? ( - - {dataMapStore - .editedEdgeMap!.null_values.checked.filter( - (value) => value !== 'null' - ) - .map((value) => - value === '' - ? t('addition.common.null-value') - : value === 'NULL' - ? 'NULL/null' - : value - ) - .concat(dataMapStore.editedEdgeMap!.null_values.customized) - .join(',')} - - ) : ( - <> -
    - { - isEdit - ? dataMapStore.editCheckedNullValues( - 'edit', - 'edge', - checkedList - ) - : dataMapStore.editCheckedNullValues( - 'new', - 'edge', - checkedList - ); - }} - value={ - isEdit - ? dataMapStore.editedEdgeMap!.null_values.checked - : dataMapStore.newEdgeType.null_values.checked - } - > - NULL/null - - {t( - 'data-configs.type.edge.advance.nullable-list.empty' - )} - - -
    - { - dataMapStore.toggleCustomNullValue( - isEdit ? 'edit' : 'new', - 'edge', - e.target.checked - ); - - if (e.target.checked) { - dataMapStore.addValidateValueMappingOption( - 'null_values' - ); - } else { - dataMapStore.resetValidateValueMapping( - 'null_values' - ); - } - }} - > - {t( - 'data-configs.type.edge.advance.nullable-list.custom' - )} - -
    -
    -
    - {isEdit ? ( - <> - {dataMapStore.editedEdgeMap?.null_values.customized.map( - (nullValue, nullValueIndex) => ( -
    - { - dataMapStore.editCustomNullValues( - 'edit', - 'edge', - e.value, - nullValueIndex - ); - - dataMapStore.validateValueMapping( - 'edge', - 'edit', - 'null_values', - nullValueIndex - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore.validateAdvanceConfigErrorMessage - .null_values[nullValueIndex] - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'edge', - 'edit', - 'null_values', - nullValueIndex - ); - } - }} - /> -
    - ) - )} - {!isEmpty( - dataMapStore.editedEdgeMap?.null_values.customized - ) && ( -
    - { - const extraNullValues = - dataMapStore.editedEdgeMap?.null_values - .customized; - - if (!extraNullValues?.includes('')) { - dataMapStore.addCustomNullValues( - 'edit', - 'edge' - ); - } - }} - > - {t('data-configs.manipulations.add')} - -
    - )} - - ) : ( - <> - {dataMapStore.newEdgeType.null_values.customized.map( - (nullValue, nullValueIndex) => ( -
    - { - dataMapStore.editCustomNullValues( - 'new', - 'edge', - e.value, - nullValueIndex - ); - - dataMapStore.validateValueMapping( - 'edge', - 'new', - 'null_values', - nullValueIndex - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore.validateAdvanceConfigErrorMessage - .null_values[nullValueIndex] - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'edge', - 'new', - 'null_values', - nullValueIndex - ); - } - }} - /> -
    - ) - )} - {!isEmpty( - dataMapStore.newEdgeType.null_values.customized - ) && ( -
    - { - const extraNullValues = - dataMapStore.newEdgeType?.null_values - .customized; - - if (!extraNullValues.includes('')) { - dataMapStore.addCustomNullValues( - 'new', - 'edge' - ); - } - }} - > - {t('data-configs.manipulations.add')} - -
    - )} - - )} -
    - - )} -
    - -
    - - {t('data-configs.type.edge.advance.map-property-value.title')}: - - {!isCheck && - (isEdit - ? isEmpty(dataMapStore.editedEdgeMap?.value_mapping) - : isEmpty(dataMapStore.newEdgeType.value_mapping)) && ( -
    { - if (isStrategyAutomatic) { - return; - } - - isEdit - ? dataMapStore.addEdgeValueMapping('edit') - : dataMapStore.addEdgeValueMapping('new'); - - dataMapStore.addValidateValueMappingOption( - 'value_mappings' - ); - }} - > - {t( - 'data-configs.type.edge.advance.map-property-value.add-value' - )} -
    - )} - - {isCheck && ( -
    - {isEmpty(dataMapStore.editedEdgeMap?.value_mapping) - ? '-' - : dataMapStore.editedEdgeMap?.value_mapping.map( - ({ column_name, values }, valueMapIndex) => ( -
    -
    - - {t( - 'data-configs.type.edge.advance.map-property-value.fields.property' - )} - {valueMapIndex + 1}: - - {column_name} -
    - {values.map(({ column_value, mapped_value }) => ( -
    - - {t( - 'data-configs.type.edge.advance.map-property-value.fields.value-map' - )} - - {column_value} - map - {mapped_value} -
    - ))} -
    - ) - )} -
    - )} -
    - - {/* property value mapping form */} - {!isCheck && - (!Boolean(checkOrEdit) - ? dataMapStore.newEdgeType.value_mapping.map( - ({ column_name, values }, valueMapIndex) => ( -
    -
    - - {t( - 'data-configs.type.edge.advance.map-property-value.fields.property' - )} - {valueMapIndex + 1}: - - - { - dataMapStore.removeEdgeValueMapping( - 'new', - valueMapIndex - ); - - dataMapStore.removeValidateValueMappingOption( - 'edge', - 'new', - 'value_mappings', - valueMapIndex - ); - }} - > - {t('data-configs.manipulations.delete')} - -
    -
    - - {t( - 'data-configs.type.edge.advance.map-property-value.fields.value-map' - )} - : - -
    - {values.map( - ({ column_value, mapped_value }, valueIndex) => ( -
    - { - dataMapStore.editEdgeValueMappingColumnValueName( - 'new', - 'column_value', - e.value, - valueMapIndex, - valueIndex - ); - - dataMapStore.validateValueMapping( - 'edge', - 'new', - 'value_mappings', - valueMapIndex, - { - field: 'column_value', - valueIndex: valueIndex - } - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore - .validateAdvanceConfigErrorMessage - .value_mapping[valueMapIndex].values[ - valueIndex - ].column_value - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'edge', - 'new', - 'value_mappings', - valueMapIndex, - { - field: 'column_value', - valueIndex: valueIndex - } - ); - } - }} - /> - map - { - dataMapStore.editEdgeValueMappingColumnValueName( - 'new', - 'mapped_value', - e.value, - valueMapIndex, - valueIndex - ); - - dataMapStore.validateValueMapping( - 'edge', - 'new', - 'value_mappings', - valueMapIndex, - { - field: 'mapped_value', - valueIndex: valueIndex - } - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore - .validateAdvanceConfigErrorMessage - .value_mapping[valueMapIndex].values[ - valueIndex - ].mapped_value - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'edge', - 'new', - 'value_mappings', - valueMapIndex, - { - field: 'mapped_value', - valueIndex: valueIndex - } - ); - } - }} - /> - {values.length > 1 && ( - { - dataMapStore.removeEdgeValueMappingValue( - 'new', - valueMapIndex, - valueIndex - ); - - dataMapStore.removeValidateValueMappingOption( - 'edge', - 'new', - 'value_mappings_value', - valueMapIndex, - valueIndex - ); - }} - > - {t('data-configs.manipulations.delete')} - - )} -
    - ) - )} -
    -
    - { - if ( - !dataMapStore.allowAddPropertyValueMapping( - 'edge', - valueMapIndex - ) - ) { - return; - } - - dataMapStore.addEdgeValueMappingValue( - 'new', - valueMapIndex - ); - - dataMapStore.addValidateValueMappingOption( - 'value_mappings_value', - valueMapIndex - ); - }} - > - {t( - 'data-configs.type.edge.advance.map-property-value.fields.add-value-map' - )} - -
    -
    -
    -
    -
    - ) - ) - : dataMapStore.editedEdgeMap?.value_mapping.map( - ({ column_name, values }, valueMapIndex) => ( -
    -
    - - {t( - 'data-configs.type.edge.advance.map-property-value.fields.property' - )} - {valueMapIndex + 1}: - - - { - dataMapStore.removeEdgeValueMapping( - 'edit', - valueMapIndex - ); - - dataMapStore.removeValidateValueMappingOption( - 'edge', - 'edit', - 'value_mappings', - valueMapIndex - ); - }} - > - {t('data-configs.manipulations.delete')} - -
    -
    - - {t( - 'data-configs.type.edge.advance.map-property-value.fields.value-map' - )} - : - -
    - {values.map( - ({ column_value, mapped_value }, valueIndex) => ( -
    - { - dataMapStore.editEdgeValueMappingColumnValueName( - 'edit', - 'column_value', - e.value, - valueMapIndex, - valueIndex - ); - - dataMapStore.validateValueMapping( - 'edge', - 'edit', - 'value_mappings', - valueMapIndex, - { - field: 'column_value', - valueIndex: valueIndex - } - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore - .validateAdvanceConfigErrorMessage - .value_mapping[valueMapIndex].values[ - valueIndex - ].column_value - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'edge', - 'edit', - 'value_mappings', - valueMapIndex, - { - field: 'column_value', - valueIndex: valueIndex - } - ); - } - }} - /> - map - { - dataMapStore.editEdgeValueMappingColumnValueName( - 'edit', - 'mapped_value', - e.value, - valueMapIndex, - valueIndex - ); - - dataMapStore.validateValueMapping( - 'edge', - 'edit', - 'value_mappings', - valueMapIndex, - { - field: 'mapped_value', - valueIndex: valueIndex - } - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore - .validateAdvanceConfigErrorMessage - .value_mapping[valueMapIndex].values[ - valueIndex - ].mapped_value - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'edge', - 'edit', - 'value_mappings', - valueMapIndex, - { - field: 'mapped_value', - valueIndex: valueIndex - } - ); - } - }} - /> - {values.length > 1 && ( - { - dataMapStore.removeEdgeValueMappingValue( - 'edit', - valueMapIndex, - valueIndex - ); - - dataMapStore.removeValidateValueMappingOption( - 'edge', - 'edit', - 'value_mappings_value', - valueMapIndex, - valueIndex - ); - }} - > - {t('data-configs.manipulations.delete')} - - )} -
    - ) - )} -
    -
    - { - if ( - !dataMapStore.allowAddPropertyValueMapping( - 'edge', - valueMapIndex - ) - ) { - return; - } - - dataMapStore.addEdgeValueMappingValue( - 'edit', - valueMapIndex - ); - - dataMapStore.addValidateValueMappingOption( - 'value_mappings_value', - valueMapIndex - ); - }} - > - {t( - 'data-configs.type.edge.advance.map-property-value.fields.add-value-map' - )} - -
    -
    -
    -
    -
    - ) - ))} - - {!isCheck && - (isEdit - ? !isEmpty(dataMapStore.editedEdgeMap?.value_mapping) - : !isEmpty(dataMapStore.newEdgeType.value_mapping)) && ( -
    { - if (!dataMapStore.allowAddPropertyMapping('edge')) { - return; - } - - isEdit - ? dataMapStore.addEdgeValueMapping('edit') - : dataMapStore.addEdgeValueMapping('new'); - - dataMapStore.addValidateValueMappingOption( - 'value_mappings' - ); - }} - > - {t( - 'data-configs.type.edge.advance.map-property-value.add-value' - )} -
    - )} - - )} - - {!isCheck && ( - - isEmpty(mapped_name) - ) || - !dataMapStore.allowAddPropertyMapping('edge') || - !dataMapStore.isValidateSave - } - onCreate={async () => { - dataMapStore.switchAddNewTypeConfig(false); - dataMapStore.switchEditTypeConfig(false); - - isEdit - ? await dataMapStore.updateEdgeMap( - 'upgrade', - dataMapStore.selectedFileId - ) - : await dataMapStore.updateEdgeMap( - 'add', - dataMapStore.selectedFileId - ); - - if (dataMapStore.requestStatus.updateEdgeMap === 'failed') { - Message.error({ - content: dataMapStore.errorInfo.updateEdgeMap.message, - size: 'medium', - showCloseIcon: false - }); - } - - onCancelCreateEdge(); - dataMapStore.resetNewMap('edge'); - }} - onCancel={() => { - dataMapStore.switchAddNewTypeConfig(false); - dataMapStore.switchEditTypeConfig(false); - - if (!isEdit) { - dataMapStore.resetNewMap('edge'); - } else { - dataMapStore.resetEditMapping('edge'); - } - - onCancelCreateEdge(); - dataMapStore.resetNewMap('edge'); - dataMapStore.resetValidateValueMapping('all'); - }} - /> - )} -
    - ); - } -); - -export default EdgeMap; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/FileConfigs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/FileConfigs.tsx deleted file mode 100644 index d8f9cc00f..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/FileConfigs.tsx +++ /dev/null @@ -1,395 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { range, rangeRight } from 'lodash-es'; -import { useTranslation } from 'react-i18next'; -import classnames from 'classnames'; -import { Radio, Switch, Input, Select, Button, Message } from 'hubble-ui'; - -import { DataImportRootStoreContext } from '../../../../../stores'; - -import ArrowIcon from '../../../../../assets/imgs/ic_arrow_16.svg'; - -const separators = [',', ';', '\\t', ' ']; -const charsets = ['UTF-8', 'GBK', 'ISO-8859-1', 'US-ASCII']; -const dateFormat = [ - 'yyyy-MM-dd', - 'yyyy-MM-dd HH:mm:ss', - 'yyyy-MM-dd HH:mm:ss.SSS' -]; - -const timezones = rangeRight(1, 13) - .map((num) => `GMT-${num}`) - .concat(['GMT']) - .concat(range(1, 13).map((num) => `GMT+${num}`)); - -const styles = { - smallGap: { - marginBottom: 18 - }, - mediumGap: { - marginBottom: 23 - } -}; - -const FileConfigs: React.FC = observer(() => { - const { dataMapStore, serverDataImportStore } = useContext( - DataImportRootStoreContext - ); - const { t } = useTranslation(); - - const expandClassName = classnames({ - 'import-tasks-step-content-header-expand': dataMapStore.isExpandFileConfig, - 'import-tasks-step-content-header-collpase': !dataMapStore.isExpandFileConfig - }); - - const handleExpand = () => { - dataMapStore.switchExpand('file', !dataMapStore.isExpandFileConfig); - }; - - return ( - dataMapStore.selectedFileInfo && ( -
    -
    - {t('data-configs.file.title')} - collpaseOrExpand -
    - {dataMapStore.isExpandFileConfig && ( - <> -
    - - {t('data-configs.file.include-header')}: - - { - dataMapStore.setFileConfig('has_header', checked); - }} - /> -
    -
    - - {t('data-configs.file.delimiter.title')}: - -
    - ) => { - if (e.target.value === 'custom') { - dataMapStore.setFileConfig('delimiter', ''); - } else { - dataMapStore.setFileConfig('delimiter', e.target.value); - // reset validate error message of delimiter - dataMapStore.validateFileInfo('delimiter'); - } - }} - > - - {t('data-configs.file.delimiter.comma')} - - - {t('data-configs.file.delimiter.semicolon')} - - - {t('data-configs.file.delimiter.tab')} - - - {t('data-configs.file.delimiter.space')} - - - {t('data-configs.file.delimiter.custom')} - - -
    - {!separators.includes( - dataMapStore.selectedFileInfo!.file_setting.delimiter - ) && ( -
    - { - dataMapStore.setFileConfig('delimiter', e.value); - dataMapStore.validateFileInfo('delimiter'); - }} - errorMessage={ - dataMapStore.validateFileInfoErrorMessage.delimiter - } - errorLocation="layer" - originInputProps={{ - onBlur: () => { - dataMapStore.validateFileInfo('delimiter'); - } - }} - /> -
    - )} -
    -
    - - {t('data-configs.file.code-type.title')}: - -
    - ) => { - if (e.target.value === 'custom') { - dataMapStore.setFileConfig('charset', ''); - } else { - dataMapStore.setFileConfig('charset', e.target.value); - dataMapStore.validateFileInfo('charset'); - } - }} - > - - {t('data-configs.file.code-type.UTF-8')} - - - {t('data-configs.file.code-type.GBK')} - - - {t('data-configs.file.code-type.ISO-8859-1')} - - - {t('data-configs.file.code-type.US-ASCII')} - - - {t('data-configs.file.code-type.custom')} - - -
    - {!charsets.includes( - dataMapStore.selectedFileInfo!.file_setting.charset - ) && ( -
    - { - dataMapStore.setFileConfig('charset', e.value); - dataMapStore.validateFileInfo('charset'); - }} - errorMessage={ - dataMapStore.validateFileInfoErrorMessage.charset - } - errorLocation="layer" - originInputProps={{ - onBlur: () => { - dataMapStore.validateFileInfo('charset'); - } - }} - /> -
    - )} -
    -
    - - {t('data-configs.file.date-type.title')}: - -
    - ) => { - if (e.target.value === 'custom') { - dataMapStore.setFileConfig('date_format', ''); - } else { - dataMapStore.setFileConfig('date_format', e.target.value); - dataMapStore.validateFileInfo('date_format'); - } - }} - > - yyyy-MM-dd - yyyy-MM-dd HH:MM:SS - - yyyy-MM-dd HH:mm:ss.SSS - - - {t('data-configs.file.code-type.custom')} - - - {!dateFormat.includes( - dataMapStore.selectedFileInfo!.file_setting.date_format - ) && ( -
    - { - dataMapStore.setFileConfig('date_format', e.value); - dataMapStore.validateFileInfo('date_format'); - }} - errorMessage={ - dataMapStore.validateFileInfoErrorMessage.date_format - } - errorLocation="layer" - originInputProps={{ - onBlur: () => { - dataMapStore.validateFileInfo('date_format'); - } - }} - /> -
    - )} -
    -
    -
    - - {t('data-configs.file.skipped-line')}: - - { - dataMapStore.setFileConfig('skipped_line', e.value); - dataMapStore.validateFileInfo('skipped_line'); - }} - errorLocation="layer" - errorMessage={ - dataMapStore.validateFileInfoErrorMessage.skipped_line - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateFileInfo('skipped_line'); - } - }} - /> -
    -
    - - {t('data-configs.file.timezone')}: - - -
    - {!dataMapStore.readOnly && !dataMapStore.lock && ( -
    - - -
    - )} - - )} -
    - ) - ); -}); - -export default FileConfigs; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigManipulations.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigManipulations.tsx deleted file mode 100644 index 61cb5c877..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigManipulations.tsx +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -import { observer } from 'mobx-react'; -import { useTranslation } from 'react-i18next'; -import { Button } from 'hubble-ui'; - -interface TypeConfigManipulationsProps { - type: 'vertex' | 'edge'; - status: 'add' | 'edit'; - disableSave?: boolean; - onCreate: () => void; - onCancel: () => void; -} - -const TypeConfigManipulations: React.FC = observer( - ({ type, status, onCreate, onCancel, disableSave = false }) => { - const { t } = useTranslation(); - - return ( -
    - -
    - - -
    -
    - ); - } -); - -export default TypeConfigManipulations; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigs.tsx deleted file mode 100644 index f50a71637..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeConfigs.tsx +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useState, useEffect, useRef } from 'react'; -import { observer } from 'mobx-react'; -import { isEmpty, size } from 'lodash-es'; -import { useLocation } from 'wouter'; -import { useTranslation } from 'react-i18next'; -import classnames from 'classnames'; -import { Button } from 'hubble-ui'; - -import { DataImportRootStoreContext } from '../../../../../stores'; - -import { Tooltip } from '../../../../common'; -import TypeInfo from './TypeInfo'; -import VertexMap from './VertexMap'; -import EdgeMap from './EdgeMap'; - -import ArrowIcon from '../../../../../assets/imgs/ic_arrow_16.svg'; - -const TypeConfigs: React.FC = observer(() => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const [isExpand, switchExpand] = useState(true); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const [isCreateVertexMap, switchCreateVertexMap] = useState(false); - const [isCreateEdgeMap, switchCreateEdgeMap] = useState(false); - const [, setLocation] = useLocation(); - const { t } = useTranslation(); - - const shouldRevealInitalButtons = - !isCreateVertexMap && - !isCreateEdgeMap && - isEmpty(dataMapStore.selectedFileInfo?.vertex_mappings) && - isEmpty(dataMapStore.selectedFileInfo?.edge_mappings); - - const invalidFileMaps = !dataMapStore.isIrregularProcess - ? dataMapStore.fileMapInfos.filter( - ({ name, vertex_mappings, edge_mappings }) => - dataImportRootStore.successFileUploadTaskNames.includes(name) && - isEmpty(vertex_mappings) && - isEmpty(edge_mappings) - ) - : dataMapStore.fileMapInfos.filter( - ({ vertex_mappings, edge_mappings }) => - isEmpty(vertex_mappings) && isEmpty(edge_mappings) - ); - - const expandClassName = classnames({ - 'import-tasks-step-content-header-expand': isExpand, - 'import-tasks-step-content-header-collpase': !isExpand - }); - - const nextButtonTooltipClassName = classnames({ - 'import-tasks-data-map-tooltip': true, - 'no-display': size(invalidFileMaps) === 0 - }); - - const handleExpand = () => { - switchExpand(!isExpand); - }; - - const handleCreate = (type: 'vertex' | 'edge', flag: boolean) => () => { - dataMapStore.switchExpand('file', false); - // Adding a new type config counts editing as well - dataMapStore.switchAddNewTypeConfig(flag); - - if (type === 'vertex') { - switchCreateVertexMap(flag); - } else { - switchCreateEdgeMap(flag); - } - }; - - useEffect(() => { - // close dashboard when user selects another file - // since the state is not in mobx store, we have to do this for now - switchCreateVertexMap(false); - switchCreateEdgeMap(false); - switchExpand(true); - }, [dataMapStore.selectedFileId]); - - return ( -
    -
    - - {t('data-configs.type.title')} - - collpaseOrExpand - {!dataMapStore.readOnly && - !dataMapStore.lock && - !shouldRevealInitalButtons && ( - - )} -
    - {!dataMapStore.readOnly && - !dataMapStore.lock && - shouldRevealInitalButtons && ( - - )} - {isExpand && ( - <> - {isCreateVertexMap && ( - - )} - {isCreateEdgeMap && ( - - )} - {dataMapStore.selectedFileInfo?.vertex_mappings - .map((mapping, index) => ( - - )) - .reverse()} - {dataMapStore.selectedFileInfo?.edge_mappings - .map((mapping, index) => ( - - )) - .reverse()} - - )} - {!dataMapStore.readOnly && ( -
    - {!serverDataImportStore.isServerStartImport && ( - - )} - -
    - {t('data-configs.type.hint.no-vertex-or-edge-mapping')} -
    - {invalidFileMaps.map(({ name }) => ( -
    - {name} -
    - ))} - - } - > - -
    -
    - )} -
    - ); -}); - -export interface TypeConfigMapCreationsProps { - onCreateVertex: () => void; - onCreateEdge: () => void; - disabled?: boolean; -} - -const TypeConfigMapCreations: React.FC = observer( - ({ onCreateVertex, onCreateEdge, disabled = false }) => { - const { t } = useTranslation(); - - return ( -
    - - -
    - ); - } -); - -export default TypeConfigs; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeInfo.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeInfo.tsx deleted file mode 100644 index 2274f54e6..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/TypeInfo.tsx +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useState, - useRef, - useContext, - useCallback, - useEffect -} from 'react'; -import { observer } from 'mobx-react'; -import { useTranslation } from 'react-i18next'; -import classnames from 'classnames'; -import { Button } from 'hubble-ui'; - -import { Tooltip } from '../../../../common'; -import { DataImportRootStoreContext } from '../../../../../stores'; -import VertexMap from './VertexMap'; -import EdgeMap from './EdgeMap'; - -import ArrowIcon from '../../../../../assets/imgs/ic_arrow_16.svg'; -import { VertexType } from '../../../../../stores/types/GraphManagementStore/metadataConfigsStore'; - -export interface TypeInfoProps { - type: 'vertex' | 'edge'; - mapIndex: number; -} - -const TypeInfo: React.FC = observer(({ type, mapIndex }) => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const [isExpand, switchExpand] = useState(false); - const [isDeletePop, switchDeletePop] = useState(false); - const [checkOrEdit, setCheckOrEdit] = useState<'check' | 'edit' | boolean>( - false - ); - const typeInfoWrapperRef = useRef(null); - const manipulationAreaRef = useRef(null); - const editButtonRef = useRef(null); - const deleteButtonRef = useRef(null); - const deleteWrapperRef = useRef(null); - const { t } = useTranslation(); - - let vertexInfo: VertexType | undefined; - let sourceVertexInfo: VertexType | undefined; - let targetVertexInfo: VertexType | undefined; - - if (type === 'vertex') { - vertexInfo = dataImportRootStore.vertexTypes.find( - ({ name }) => - name === dataMapStore.selectedFileInfo?.vertex_mappings[mapIndex].label - ); - } else { - const edgeInfo = dataImportRootStore.edgeTypes.find( - ({ name }) => - name === dataMapStore.selectedFileInfo!.edge_mappings[mapIndex].label - ); - - sourceVertexInfo = dataImportRootStore.vertexTypes.find( - ({ name }) => name === edgeInfo?.source_label - ); - - targetVertexInfo = dataImportRootStore.vertexTypes.find( - ({ name }) => name === edgeInfo?.target_label - ); - } - - const handleImgClickExpand = () => { - switchExpand(!isExpand); - - if (Boolean(checkOrEdit)) { - if (checkOrEdit === 'edit') { - dataMapStore.switchEditTypeConfig(false); - } - - setCheckOrEdit(false); - } else { - if (type === 'vertex') { - dataMapStore.syncEditMap('vertex', mapIndex); - } else { - dataMapStore.syncEditMap('edge', mapIndex); - } - - setCheckOrEdit('check'); - } - }; - - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - if ( - isDeletePop && - deleteWrapperRef.current && - !deleteWrapperRef.current.contains(e.target as Element) - ) { - switchDeletePop(false); - } - }, - [isDeletePop] - ); - - const handleTypeInfoExpandClick = useCallback( - (e: MouseEvent) => { - if ( - manipulationAreaRef.current && - !manipulationAreaRef.current?.contains(e.target as Element) - ) { - handleImgClickExpand(); - } - }, - [handleImgClickExpand] - ); - - const expandClassName = classnames({ - expand: isExpand, - collpase: !isExpand - }); - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - typeInfoWrapperRef.current!.addEventListener( - 'click', - handleTypeInfoExpandClick, - false - ); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - typeInfoWrapperRef.current!.removeEventListener( - 'click', - handleTypeInfoExpandClick, - false - ); - }; - }, [handleOutSideClick, handleTypeInfoExpandClick]); - - return ( -
    -
    -
    -
    - collpaseOrExpand -
    -
    - - {t('data-configs.type.info.type')} - - - {type === 'vertex' - ? t('data-configs.type.vertex.type') - : t('data-configs.type.edge.type')} - -
    -
    -
    - - {t('data-configs.type.info.name')} - - - {type === 'vertex' - ? dataMapStore.selectedFileInfo?.vertex_mappings[mapIndex].label - : dataMapStore.selectedFileInfo?.edge_mappings[mapIndex].label} - -
    -
    - - {t('data-configs.type.info.ID-strategy')} - - - {type === 'vertex' - ? t(`data-configs.type.ID-strategy.${vertexInfo?.id_strategy}`) + - (vertexInfo?.id_strategy === 'PRIMARY_KEY' - ? '-' + vertexInfo?.primary_keys.join(',') - : '') - : `${t('addition.common.source')}:${ - t( - `data-configs.type.ID-strategy.${sourceVertexInfo?.id_strategy}` - ) + - (sourceVertexInfo?.id_strategy === 'PRIMARY_KEY' - ? '-' + sourceVertexInfo?.primary_keys.join(',') - : '') - } ${t('addition.common.target')}:${ - t( - `data-configs.type.ID-strategy.${targetVertexInfo?.id_strategy}` - ) + - (targetVertexInfo?.id_strategy === 'PRIMARY_KEY' - ? '-' + targetVertexInfo?.primary_keys.join(',') - : '') - }`} - -
    -
    - {!dataMapStore.readOnly && !dataMapStore.lock && ( - <> - - -

    - {t('data-configs.manipulations.hints.delete-confirm')} -

    -

    {t('data-configs.manipulations.hints.warning')}

    -
    - - -
    -
    - } - childrenProps={{ - onClick() { - switchDeletePop(true); - } - }} - > - - - - )} -
    -
    - {isExpand && Boolean(checkOrEdit) && type === 'vertex' && ( - { - setCheckOrEdit(false); - switchExpand(false); - }} - vertexMapIndex={mapIndex} - /> - )} - {isExpand && Boolean(checkOrEdit) && type === 'edge' && ( - { - setCheckOrEdit(false); - switchExpand(false); - }} - edgeMapIndex={mapIndex} - /> - )} - - ); -}); - -export default TypeInfo; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/VertexMap.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/VertexMap.tsx deleted file mode 100644 index b9e2f283e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/VertexMap.tsx +++ /dev/null @@ -1,1628 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useCallback, - useRef, - useEffect -} from 'react'; -import { observer } from 'mobx-react'; -import { isUndefined, isEmpty, size, cloneDeep } from 'lodash-es'; -import { useTranslation } from 'react-i18next'; -import classnames from 'classnames'; -import { Input, Select, Checkbox, Message } from 'hubble-ui'; - -import { Tooltip } from '../../../../common'; -import TypeConfigManipulations from './TypeConfigManipulations'; -import { DataImportRootStoreContext } from '../../../../../stores'; -import { VertexType } from '../../../../../stores/types/GraphManagementStore/metadataConfigsStore'; -import { getUnicodeLength } from '../../../../../utils'; - -import ArrowIcon from '../../../../../assets/imgs/ic_arrow_16.svg'; -import BlueArrowIcon from '../../../../../assets/imgs/ic_arrow_blue.svg'; -import CloseIcon from '../../../../../assets/imgs/ic_close_16.svg'; -import MapIcon from '../../../../../assets/imgs/ic_yingshe_16.svg'; - -export interface VertexMapProps { - checkOrEdit: 'check' | 'edit' | boolean; - onCancelCreateVertex: () => void; - vertexMapIndex?: number; -} - -const VertexMap: React.FC = observer( - ({ checkOrEdit, onCancelCreateVertex, vertexMapIndex }) => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore } = dataImportRootStore; - const [isAddMapping, switchAddMapping] = useState(false); - const [isExpandAdvance, switchExpandAdvance] = useState(false); - const addMappingWrapperRef = useRef(null); - const { t } = useTranslation(); - - const isCheck = checkOrEdit === 'check'; - const isEdit = checkOrEdit === 'edit'; - const vertexMap = - checkOrEdit !== false - ? dataMapStore.editedVertexMap! - : dataMapStore.newVertexType; - const filteredColumnNamesInSelection = - checkOrEdit !== false - ? dataMapStore.filteredColumnNamesInVertexEditSelection - : dataMapStore.filteredColumnNamesInVertexNewSelection; - - const findVertex = (collection: VertexType[], label: string) => - collection.find(({ name }) => name === label); - - const selectedVertex = findVertex( - dataImportRootStore.vertexTypes, - vertexMap.label - ); - - const isStrategyAutomatic = selectedVertex?.id_strategy === 'AUTOMATIC'; - - const handleAdvanceExpand = () => { - switchExpandAdvance(!isExpandAdvance); - }; - - // need useCallback to stop infinite callings of useEffect - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - // if clicked element is not on dropdown, collpase it - if ( - isAddMapping && - addMappingWrapperRef.current && - !addMappingWrapperRef.current.contains(e.target as Element) - ) { - switchAddMapping(false); - } - }, - [isAddMapping] - ); - - const wrapperName = classnames({ - 'import-tasks-data-map-config-card': !Boolean(checkOrEdit), - 'import-tasks-data-map-config-view': Boolean(checkOrEdit) - }); - - const expandAdvanceClassName = classnames({ - 'import-tasks-step-content-header-expand': isExpandAdvance, - 'import-tasks-step-content-header-collpase': !isExpandAdvance - }); - - const expandAddMapClassName = classnames({ - 'import-tasks-step-content-header-expand': isAddMapping, - 'import-tasks-step-content-header-collpase': !isAddMapping - }); - - const addMappingManipulationClassName = classnames({ - 'import-tasks-manipulation': true, - 'import-tasks-manipulation-disabled': - size(filteredColumnNamesInSelection) === 0 || isStrategyAutomatic - }); - - const addNullValueClassName = classnames({ - 'import-tasks-manipulation': true, - 'import-tasks-manipulation-disabled': isEdit - ? dataMapStore.editedVertexMap!.null_values.customized.includes('') - : dataMapStore.newVertexType.null_values.customized.includes('') - }); - - const addPropertyMapClassName = classnames({ - 'import-tasks-manipulation': true, - 'import-tasks-manipulation-disabled': - !dataMapStore.allowAddPropertyMapping('vertex') || isStrategyAutomatic - }); - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - return ( -
    - {Boolean(checkOrEdit) ? ( -
    - {t('data-configs.type.basic-settings')} -
    - ) : ( -
    - {t('data-configs.type.vertex.title')} - collpaseOrExpand -
    - )} -
    - - {t('data-configs.type.vertex.type')}: - - {isCheck ? ( - {dataMapStore.editedVertexMap!.label} - ) : ( - - )} -
    - {!isUndefined(selectedVertex) && ( -
    - - {t('data-configs.type.vertex.ID-strategy')}: - - - {t('data-configs.type.hint.lack-support-for-automatic')} - - } - > - {t(`data-configs.type.ID-strategy.${selectedVertex.id_strategy}`)} - {selectedVertex.id_strategy === 'PRIMARY_KEY' && - `-${selectedVertex.primary_keys.join(',')}`} - -
    - )} - {vertexMap.id_fields.map((idField, fieldIndex) => { - return ( -
    - - {t('data-configs.type.vertex.ID-column') + - (selectedVertex?.id_strategy === 'PRIMARY_KEY' - ? fieldIndex + 1 - : '')} - : - - {isCheck ? ( - {idField} - ) : ( - - )} -
    - ); - })} - -
    - - {t('data-configs.type.vertex.map-settings')}: - -
    - {isCheck && - isEmpty(dataMapStore.editedVertexMap?.field_mapping) && - '-'} - - {((Boolean(checkOrEdit) === false && - !isEmpty(dataMapStore.newVertexType.field_mapping)) || - (Boolean(checkOrEdit) !== false && - !isEmpty(dataMapStore.editedVertexMap!.field_mapping))) && ( -
    -
    - {t('data-configs.type.vertex.add-map.name')} -
    -
    - {t('data-configs.type.vertex.add-map.sample')} -
    -
    - {t('data-configs.type.vertex.add-map.property')} -
    -
    - {!isCheck && ( - { - isEdit - ? dataMapStore.toggleVertexSelectAllFieldMapping( - 'edit', - false, - selectedVertex - ) - : dataMapStore.toggleVertexSelectAllFieldMapping( - 'new', - false, - selectedVertex - ); - }} - > - {t('data-configs.type.vertex.add-map.clear')} - - )} -
    -
    - )} - - {vertexMap.field_mapping.map( - ({ column_name, mapped_name }, fieldIndex) => { - const param = checkOrEdit === false ? 'new' : 'edit'; - - return ( -
    -
    - {column_name} -
    -
    - { - dataMapStore.selectedFileInfo?.file_setting - .column_values[ - dataMapStore.selectedFileInfo?.file_setting.column_names.findIndex( - (name) => column_name === name - ) - ] - } -
    -
    - {isCheck ? ( - {mapped_name} - ) : ( - - )} -
    -
    - {!isCheck && ( - close { - dataMapStore.removeVertexFieldMapping( - param, - column_name - ); - }} - /> - )} -
    -
    - ); - } - )} - - {!isCheck && ( - <> -
    { - if ( - size(filteredColumnNamesInSelection) === 0 || - isStrategyAutomatic - ) { - switchAddMapping(false); - return; - } - - switchAddMapping(!isAddMapping); - }} - > -
    - {t('data-configs.type.vertex.add-map.title')} -
    - expand -
    - {isAddMapping && ( -
    -
    - - { - if (isEdit) { - const isIndeterminate = - !isEmpty( - dataMapStore.editedVertexMap?.field_mapping - ) && - size( - dataMapStore.editedVertexMap?.field_mapping - ) !== - size( - dataMapStore.filteredColumnNamesInVertexEditSelection - ); - - dataMapStore.toggleVertexSelectAllFieldMapping( - 'edit', - // if isIndeterminate is true, e.target.checked is false - isIndeterminate || e.target.checked, - selectedVertex - ); - } else { - const isIndeterminate = - !isEmpty( - dataMapStore.newVertexType.field_mapping - ) && - size( - dataMapStore.newVertexType.field_mapping - ) !== - size( - dataMapStore.filteredColumnNamesInVertexNewSelection - ); - - dataMapStore.toggleVertexSelectAllFieldMapping( - 'new', - isIndeterminate || e.target.checked, - selectedVertex - ); - } - }} - > - {t('data-configs.type.vertex.select-all')} - - -
    - {dataMapStore.selectedFileInfo?.file_setting.column_names - .filter((name) => !vertexMap.id_fields.includes(name)) - .map((name) => { - let combinedText = name; - let currentColumnValue = dataMapStore.selectedFileInfo - ?.file_setting.column_values[ - dataMapStore.selectedFileInfo?.file_setting.column_names.findIndex( - (columnName) => name === columnName - ) - ] as string; - combinedText += `(${currentColumnValue})`; - - if (getUnicodeLength(combinedText) > 35) { - combinedText = combinedText.slice(0, 35) + '...'; - } - - const mappingValue = selectedVertex?.properties.find( - ({ name: propertyName }) => propertyName === name - )?.name; - - return ( -
    - - column_name === name - ) - ) - } - onChange={(e: any) => { - if (e.target.checked) { - isEdit - ? dataMapStore.setVertexFieldMappingKey( - 'edit', - name, - mappingValue - ) - : dataMapStore.setVertexFieldMappingKey( - 'new', - name, - mappingValue - ); - } else { - isEdit - ? dataMapStore.removeVertexFieldMapping( - 'edit', - name - ) - : dataMapStore.removeVertexFieldMapping( - 'new', - name - ); - } - }} - > - {combinedText} - - -
    - ); - })} -
    - )} - - )} -
    -
    - -
    - {t('data-configs.type.vertex.advance.title')} - {!isCheck && ( - collpaseOrExpand - )} -
    - {(isExpandAdvance || isCheck) && ( - <> -
    - - {t('data-configs.type.vertex.advance.nullable-list.title')}: - - {isCheck ? ( - - {dataMapStore - .editedVertexMap!.null_values.checked.filter( - (value) => value !== 'null' - ) - .map((value) => - value === '' - ? t('addition.common.null-value') - : value === 'NULL' - ? 'NULL/null' - : value - ) - .concat( - dataMapStore.editedVertexMap!.null_values.customized - ) - .join(',')} - - ) : ( - <> -
    - { - isEdit - ? dataMapStore.editCheckedNullValues( - 'edit', - 'vertex', - checkedList - ) - : dataMapStore.editCheckedNullValues( - 'new', - 'vertex', - checkedList - ); - }} - value={ - isEdit - ? dataMapStore.editedVertexMap!.null_values.checked - : dataMapStore.newVertexType.null_values.checked - } - > - NULL/null - - {t( - 'data-configs.type.vertex.advance.nullable-list.empty' - )} - - -
    - { - dataMapStore.toggleCustomNullValue( - isEdit ? 'edit' : 'new', - 'vertex', - e.target.checked - ); - - if (e.target.checked) { - dataMapStore.addValidateValueMappingOption( - 'null_values' - ); - } else { - dataMapStore.resetValidateValueMapping( - 'null_values' - ); - } - }} - > - {t( - 'data-configs.type.vertex.advance.nullable-list.custom' - )} - -
    -
    -
    - {isEdit ? ( - <> - {dataMapStore.editedVertexMap?.null_values.customized.map( - (nullValue, nullValueIndex) => ( -
    - { - dataMapStore.editCustomNullValues( - 'edit', - 'vertex', - e.value, - nullValueIndex - ); - - dataMapStore.validateValueMapping( - 'vertex', - 'edit', - 'null_values', - nullValueIndex - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore.validateAdvanceConfigErrorMessage - .null_values[nullValueIndex] - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'vertex', - 'edit', - 'null_values', - nullValueIndex - ); - } - }} - /> -
    - ) - )} - {!isEmpty( - dataMapStore.editedVertexMap?.null_values.customized - ) && ( -
    - { - const extraNullValues = - dataMapStore.editedVertexMap?.null_values - .customized; - - if (!extraNullValues?.includes('')) { - dataMapStore.addCustomNullValues( - 'edit', - 'vertex' - ); - } - }} - > - {t('data-configs.manipulations.add')} - -
    - )} - - ) : ( - <> - {dataMapStore.newVertexType.null_values.customized.map( - (nullValue, nullValueIndex) => ( -
    - { - dataMapStore.editCustomNullValues( - 'new', - 'vertex', - e.value, - nullValueIndex - ); - - dataMapStore.validateValueMapping( - 'vertex', - 'new', - 'null_values', - nullValueIndex - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore.validateAdvanceConfigErrorMessage - .null_values[nullValueIndex] - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'vertex', - 'new', - 'null_values', - nullValueIndex - ); - } - }} - /> -
    - ) - )} - {!isEmpty( - dataMapStore.newVertexType.null_values.customized - ) && ( -
    - { - const extraNullValues = - dataMapStore.newVertexType?.null_values - .customized; - - if (!extraNullValues.includes('')) { - dataMapStore.addCustomNullValues( - 'new', - 'vertex' - ); - } - }} - > - {t('data-configs.manipulations.add')} - -
    - )} - - )} -
    - - )} -
    - -
    - - {t('data-configs.type.vertex.advance.map-property-value.title')} - : - - {!isCheck && - (isEdit - ? isEmpty(dataMapStore.editedVertexMap?.value_mapping) - : isEmpty(dataMapStore.newVertexType.value_mapping)) && ( -
    { - if (isStrategyAutomatic) { - return; - } - - isEdit - ? dataMapStore.addVertexValueMapping('edit') - : dataMapStore.addVertexValueMapping('new'); - - dataMapStore.addValidateValueMappingOption( - 'value_mappings' - ); - }} - > - {t( - 'data-configs.type.vertex.advance.map-property-value.add-value' - )} -
    - )} - - {isCheck && ( -
    - {isEmpty(dataMapStore.editedVertexMap?.value_mapping) - ? '-' - : dataMapStore.editedVertexMap?.value_mapping.map( - ({ column_name, values }, valueMapIndex) => ( -
    -
    - - {t( - 'data-configs.type.vertex.advance.map-property-value.fields.property' - )} - {valueMapIndex + 1}: - - {column_name} -
    - {values.map(({ column_value, mapped_value }) => ( -
    - - {t( - 'data-configs.type.vertex.advance.map-property-value.fields.value-map' - )} - - {column_value} - map - {mapped_value} -
    - ))} -
    - ) - )} -
    - )} -
    - - {/* property value mapping form */} - {!isCheck && - (!Boolean(checkOrEdit) - ? dataMapStore.newVertexType.value_mapping.map( - ({ column_name, values }, valueMapIndex) => ( -
    -
    - - {t( - 'data-configs.type.vertex.advance.map-property-value.fields.property' - )} - {valueMapIndex + 1}: - - - { - dataMapStore.removeVertexValueMapping( - 'new', - valueMapIndex - ); - - dataMapStore.removeValidateValueMappingOption( - 'vertex', - 'new', - 'value_mappings', - valueMapIndex - ); - }} - > - {t('data-configs.manipulations.delete')} - -
    -
    - - {t( - 'data-configs.type.vertex.advance.map-property-value.fields.value-map' - )} - : - -
    - {values.map( - ({ column_value, mapped_value }, valueIndex) => ( -
    - { - dataMapStore.editVertexValueMappingColumnValueName( - 'new', - 'column_value', - e.value, - valueMapIndex, - valueIndex - ); - - dataMapStore.validateValueMapping( - 'vertex', - 'new', - 'value_mappings', - valueMapIndex, - { - field: 'column_value', - valueIndex: valueIndex - } - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore - .validateAdvanceConfigErrorMessage - .value_mapping[valueMapIndex].values[ - valueIndex - ].column_value - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'vertex', - 'new', - 'value_mappings', - valueMapIndex, - { - field: 'column_value', - valueIndex: valueIndex - } - ); - } - }} - /> - map - { - dataMapStore.editVertexValueMappingColumnValueName( - 'new', - 'mapped_value', - e.value, - valueMapIndex, - valueIndex - ); - - dataMapStore.validateValueMapping( - 'vertex', - 'new', - 'value_mappings', - valueMapIndex, - { - field: 'mapped_value', - valueIndex: valueIndex - } - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore - .validateAdvanceConfigErrorMessage - .value_mapping[valueMapIndex].values[ - valueIndex - ].mapped_value - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'vertex', - 'new', - 'value_mappings', - valueMapIndex, - { - field: 'mapped_value', - valueIndex: valueIndex - } - ); - } - }} - /> - {values.length > 1 && ( - { - dataMapStore.removeVertexValueMappingValue( - 'new', - valueMapIndex, - valueIndex - ); - - dataMapStore.removeValidateValueMappingOption( - 'vertex', - 'new', - 'value_mappings_value', - valueMapIndex, - valueIndex - ); - }} - > - {t('data-configs.manipulations.delete')} - - )} -
    - ) - )} -
    -
    - { - if ( - !dataMapStore.allowAddPropertyValueMapping( - 'vertex', - valueMapIndex - ) - ) { - return; - } - - dataMapStore.addVertexValueMappingValue( - 'new', - valueMapIndex - ); - - dataMapStore.addValidateValueMappingOption( - 'value_mappings_value', - valueMapIndex - ); - }} - > - {t( - 'data-configs.type.vertex.advance.map-property-value.fields.add-value-map' - )} - -
    -
    -
    -
    -
    - ) - ) - : dataMapStore.editedVertexMap?.value_mapping.map( - ({ column_name, values }, valueMapIndex) => ( -
    -
    - - {t( - 'data-configs.type.vertex.advance.map-property-value.fields.property' - )} - {valueMapIndex + 1}: - - - { - dataMapStore.removeVertexValueMapping( - 'edit', - valueMapIndex - ); - - dataMapStore.removeValidateValueMappingOption( - 'vertex', - 'edit', - 'value_mappings', - valueMapIndex - ); - }} - > - {t('data-configs.manipulations.delete')} - -
    -
    - - {t( - 'data-configs.type.vertex.advance.map-property-value.fields.value-map' - )} - : - -
    - {values.map( - ({ column_value, mapped_value }, valueIndex) => ( -
    - { - dataMapStore.editVertexValueMappingColumnValueName( - 'edit', - 'column_value', - e.value, - valueMapIndex, - valueIndex - ); - - dataMapStore.validateValueMapping( - 'vertex', - 'edit', - 'value_mappings', - valueMapIndex, - { - field: 'column_value', - valueIndex: valueIndex - } - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore - .validateAdvanceConfigErrorMessage - .value_mapping[valueMapIndex].values[ - valueIndex - ].column_value - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'vertex', - 'edit', - 'value_mappings', - valueMapIndex, - { - field: 'column_value', - valueIndex: valueIndex - } - ); - } - }} - /> - map - { - dataMapStore.editVertexValueMappingColumnValueName( - 'edit', - 'mapped_value', - e.value, - valueMapIndex, - valueIndex - ); - - dataMapStore.validateValueMapping( - 'vertex', - 'edit', - 'value_mappings', - valueMapIndex, - { - field: 'mapped_value', - valueIndex: valueIndex - } - ); - }} - errorLocation="layer" - errorMessage={ - dataMapStore - .validateAdvanceConfigErrorMessage - .value_mapping[valueMapIndex].values[ - valueIndex - ].mapped_value - } - originInputProps={{ - onBlur: () => { - dataMapStore.validateValueMapping( - 'vertex', - 'edit', - 'value_mappings', - valueMapIndex, - { - field: 'mapped_value', - valueIndex: valueIndex - } - ); - } - }} - /> - {values.length > 1 && ( - { - dataMapStore.removeVertexValueMappingValue( - 'edit', - valueMapIndex, - valueIndex - ); - - dataMapStore.removeValidateValueMappingOption( - 'vertex', - 'edit', - 'value_mappings_value', - valueMapIndex, - valueIndex - ); - }} - > - {t('data-configs.manipulations.delete')} - - )} -
    - ) - )} -
    -
    - { - if ( - !dataMapStore.allowAddPropertyValueMapping( - 'vertex', - valueMapIndex - ) - ) { - return; - } - - dataMapStore.addVertexValueMappingValue( - 'edit', - valueMapIndex - ); - - dataMapStore.addValidateValueMappingOption( - 'value_mappings_value', - valueMapIndex - ); - }} - > - {t( - 'data-configs.type.vertex.advance.map-property-value.fields.add-value-map' - )} - -
    -
    -
    -
    -
    - ) - ))} - - {!isCheck && - (isEdit - ? !isEmpty(dataMapStore.editedVertexMap?.value_mapping) - : !isEmpty(dataMapStore.newVertexType.value_mapping)) && ( -
    { - if (!dataMapStore.allowAddPropertyMapping('vertex')) { - return; - } - - isEdit - ? dataMapStore.addVertexValueMapping('edit') - : dataMapStore.addVertexValueMapping('new'); - - dataMapStore.addValidateValueMappingOption( - 'value_mappings' - ); - }} - > - {t( - 'data-configs.type.vertex.advance.map-property-value.add-value' - )} -
    - )} - - )} - - {!isCheck && ( - - isEmpty(mapped_name) - ) || - !dataMapStore.allowAddPropertyMapping('vertex') || - !dataMapStore.isValidateSave - } - onCreate={async () => { - dataMapStore.switchAddNewTypeConfig(false); - dataMapStore.switchEditTypeConfig(false); - - // really weird! if import task comes from import-manager - // datamapStore.fileMapInfos cannot be updated in - // though it's already re-rendered - if (dataMapStore.isIrregularProcess) { - isEdit - ? await dataMapStore.updateVertexMap( - 'upgrade', - dataMapStore.selectedFileId - ) - : await dataMapStore.updateVertexMap( - 'add', - dataMapStore.selectedFileId - ); - - dataMapStore.fetchDataMaps(); - } else { - isEdit - ? await dataMapStore.updateVertexMap( - 'upgrade', - dataMapStore.selectedFileId - ) - : await dataMapStore.updateVertexMap( - 'add', - dataMapStore.selectedFileId - ); - } - - if (dataMapStore.requestStatus.updateVertexMap === 'failed') { - Message.error({ - content: dataMapStore.errorInfo.updateVertexMap.message, - size: 'medium', - showCloseIcon: false - }); - } - - onCancelCreateVertex(); - dataMapStore.resetNewMap('vertex'); - }} - onCancel={() => { - dataMapStore.switchAddNewTypeConfig(false); - dataMapStore.switchEditTypeConfig(false); - - if (!isEdit) { - dataMapStore.resetNewMap('vertex'); - } else { - dataMapStore.resetEditMapping('vertex'); - } - - onCancelCreateVertex(); - dataMapStore.resetNewMap('vertex'); - dataMapStore.resetValidateValueMapping('all'); - }} - /> - )} -
    - ); - } -); - -export default VertexMap; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/index.ts deleted file mode 100644 index 44d62e9c2..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/datamap-configs/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import DataMapConfigs from './DataMapConfigs'; - -export { DataMapConfigs }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.less deleted file mode 100644 index ca243f647..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.less +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.job-error-logs { - width: 75vw; - position: relative; - top: 76px; - margin: 0 auto; - font-size: 14px; - - &-title { - margin-bottom: 16px; - color: #333; - line-height: 22px; - font-weight: 900; - } - - &-content-wrapper { - display: flex; - height: calc(100vh - 139px); - padding-top: 25px; - padding-right: 16px; - background-color: #fff; - } - - &-content { - margin-left: 19px; - overflow: auto; - line-height: 2; - - &-item { - display: flex; - - &:nth-child(even) { - margin-bottom: 32px; - } - } - - &-item-title { - word-break: keep-all; - } - - &-item-text { - margin-left: 6px; - } - - &-with-error-only { - margin-left: 16px; - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.tsx deleted file mode 100644 index 0cb48f63c..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/JobErrorLogs.tsx +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useEffect, useState } from 'react'; -import { useRoute } from 'wouter'; -import { observer } from 'mobx-react'; -import { motion } from 'framer-motion'; -import { Menu } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { ImportManagerStoreContext } from '../../../../../stores'; - -import './JobErrorLogs.less'; - -const failedReasonVariants = { - initial: { - opacity: 0, - y: -10 - }, - animate: { - opacity: 1, - y: 0, - transition: { - duration: 0.8, - ease: 'easeInOut' - } - } -}; - -const JobErrorLogs: React.FC = observer(() => { - const importManagerStore = useContext(ImportManagerStoreContext); - const { t } = useTranslation(); - const [, params] = useRoute( - '/graph-management/:id/data-import/job-error-log/:jobId' - ); - const [selectedFileName, setSelectedFileName] = useState(''); - - useEffect(() => { - const init = async () => { - await importManagerStore.fetchFailedReason( - Number(params!.id), - Number(params!.jobId) - ); - - if (importManagerStore.requestStatus.fetchFailedReason === 'success') { - setSelectedFileName(importManagerStore.failedReason[0].file_name); - } - }; - - init(); - }, [params!.id, params!.jobId]); - - return ( -
    -
    - {t('addition.message.fail-reason')} -
    - -
    - {importManagerStore.requestStatus.fetchFailedReason === 'failed' ? ( -
    - {importManagerStore.errorInfo.fetchFailedReason.message} -
    - ) : ( - <> - { - setSelectedFileName(e.key); - }} - > - {importManagerStore.failedReason.map(({ file_name }) => ( - - {file_name} - - ))} - -
    - {importManagerStore.failedReason - .find(({ file_name }) => file_name === selectedFileName) - ?.reason.split('\n') - .filter((reason) => reason !== '') - .map((text, index) => ( -
    -
    - {index % 2 === 0 - ? `${t('addition.message.fail-reason')}:` - : `${t('addition.message.fail-position')}:`} -
    -
    - {text.replace('#### INSERT ERROR:', '')} -
    -
    - ))} -
    - - )} -
    -
    -
    - ); -}); - -export default JobErrorLogs; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.less deleted file mode 100644 index 7e992bfc7..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.less +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.task-error-logs { - width: 80vw; - position: relative; - top: 76px; - line-height: 2; - font-size: 14px; - margin: 0 auto 16px; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.tsx deleted file mode 100644 index d71097365..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/TaskErrorLogs.tsx +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useEffect } from 'react'; -import { useRoute } from 'wouter'; -import { observer } from 'mobx-react'; -import { DataImportRootStoreContext } from '../../../../../stores'; - -import './TaskErrorLogs.less'; - -const TaskErrorLogs: React.FC = observer(() => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { serverDataImportStore } = dataImportRootStore; - const [, params] = useRoute( - '/graph-management/:id/data-import/:jobId/task-error-log/:taskId' - ); - - useEffect(() => { - serverDataImportStore.checkErrorLogs( - Number(params!.id), - Number(params!.jobId), - Number(params!.taskId) - ); - }, [params!.id, params!.jobId, params!.taskId]); - - return ( -
    - {/*
    - {serverDataImportStore.requestStatus.checkErrorLogs === 'failed' - ? serverDataImportStore.errorInfo.checkErrorLogs.message - : serverDataImportStore.errorLogs} -
    */} -
    - {serverDataImportStore.requestStatus.checkErrorLogs === 'failed' - ? serverDataImportStore.errorInfo.checkErrorLogs.message - : serverDataImportStore.errorLogs - .split('\n') - .map((text) =>

    {text}

    )} -
    -
    - ); -}); - -export default TaskErrorLogs; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/index.ts deleted file mode 100644 index a694b2fc5..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/error-logs/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import TaskErrorLogs from './TaskErrorLogs'; -import JobErrorLogs from './JobErrorLogs'; - -export { TaskErrorLogs, JobErrorLogs }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/index.ts deleted file mode 100644 index e1324524f..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import ImportTasks from './ImportTasks'; -import ImportManager from './ImportManager'; -import { JobDetails } from './job-details'; - -export { ImportTasks, ImportManager, JobDetails }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/BasicSettings.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/BasicSettings.tsx deleted file mode 100644 index 0332c4b83..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/BasicSettings.tsx +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useState, useContext, useEffect } from 'react'; -import { observer } from 'mobx-react'; -import { isEmpty, isNull, isUndefined } from 'lodash-es'; -import { useRoute } from 'wouter'; -import { motion } from 'framer-motion'; -import { useTranslation } from 'react-i18next'; -import { Button, Modal, Input, Message } from 'hubble-ui'; - -import { ImportManagerStoreContext } from '../../../../../stores'; -import { - GraphManagementStoreContext, - DataImportRootStoreContext -} from '../../../../../stores'; - -const BasicSettings: React.FC = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const importManagerStore = useContext(ImportManagerStoreContext); - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const [isPopEditModal, switchPopEditModal] = useState(false); - const [, params] = useRoute( - '/graph-management/:id/data-import/import-manager/:jobId/details' - ); - const { t } = useTranslation(); - - useEffect(() => { - const init = async () => { - if (isEmpty(importManagerStore.importJobList)) { - graphManagementStore.fetchIdList(); - importManagerStore.setCurrentId(Number(params!.id)); - await importManagerStore.fetchImportJobList(); - } - - if (isNull(importManagerStore.selectedJob)) { - if ( - !isUndefined( - importManagerStore.importJobList.find( - ({ id }) => String(id) === (params && params.jobId) - ) - ) && - params !== null - ) { - importManagerStore.setSelectedJob(Number(params.jobId)); - - // duplicate logic in - // fill in essential data in import-task stores - dataImportRootStore.setCurrentId(Number(params!.id)); - dataImportRootStore.setCurrentJobId(Number(params.jobId)); - - dataImportRootStore.fetchVertexTypeList(); - dataImportRootStore.fetchEdgeTypeList(); - - // fetch related data - await Promise.all([ - dataMapStore.fetchDataMaps(), - serverDataImportStore.fetchAllImportTasks() - ]); - - dataMapStore.setSelectedFileId( - Number(dataMapStore.fileMapInfos[0].id) - ); - dataMapStore.setSelectedFileInfo(); - - // set flags about readonly and irregular process in - dataMapStore.switchReadOnly(true); - dataMapStore.switchIrregularProcess(true); - - // set flags about readonly and irregular process in - serverDataImportStore.switchExpandImportConfig(true); - serverDataImportStore.switchReadOnly(true); - serverDataImportStore.switchIrregularProcess(true); - serverDataImportStore.syncImportConfigs( - dataMapStore.selectedFileInfo!.load_parameter - ); - } - } - }; - - init(); - }, []); - - return ( -
    -
    -
    - {t('import-job-details.basic.job-name')} - {importManagerStore.selectedJob?.job_name} -
    -
    - {t('import-job-details.basic.job-description')} - {importManagerStore.selectedJob?.job_remarks} -
    -
    - - { - switchPopEditModal(false); - await importManagerStore.updateJobInfo(); - - if (importManagerStore.requestStatus.updateJobInfo === 'failed') { - Message.error({ - content: importManagerStore.errorInfo.updateJobInfo.message, - size: 'medium', - showCloseIcon: false - }); - - return; - } - - if ( - importManagerStore.requestStatus.updateJobInfo === 'success' - ) { - Message.success({ - content: t('import-manager.hint.update-succeed'), - size: 'medium', - showCloseIcon: false - }); - } - }} - > - {t('import-job-details.basic.modal.manipulations.save')} - , - - ]} - destroyOnClose - needCloseIcon - onCancel={() => { - switchPopEditModal(false); - }} - > -
    -
    -
    - - * - - - {t('import-job-details.basic.modal.edit-job.job-name')} - -
    - { - importManagerStore.mutateEditJob('name', e.value); - importManagerStore.validateJob('edit', 'name'); - }} - originInputProps={{ - onBlur: () => { - importManagerStore.validateJob('edit', 'name'); - } - }} - /> -
    -
    -
    - {t('import-job-details.basic.modal.edit-job.job-description')} -
    -
    - { - importManagerStore.mutateEditJob('description', e.value); - importManagerStore.validateJob('edit', 'description'); - }} - originInputProps={{ - onBlur: () => { - importManagerStore.validateJob('edit', 'description'); - } - }} - /> -
    -
    -
    -
    -
    - ); -}); - -export default BasicSettings; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/DataImportDetails.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/DataImportDetails.tsx deleted file mode 100644 index 21b81eba0..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/DataImportDetails.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -import { observer } from 'mobx-react'; - -import { ServerDataImport } from '../server-data-import'; - -const DataImportDetails: React.FC = observer(() => { - return ( -
    - -
    - ); -}); - -export default DataImportDetails; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/DataMaps.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/DataMaps.tsx deleted file mode 100644 index 1f205c6ae..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/DataMaps.tsx +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -import { observer } from 'mobx-react'; - -import DataMapConfigs from '../datamap-configs/DataMapConfigs'; - -import '../datamap-configs/DataMapConfigs.less'; - -const DataMaps: React.FC = observer(() => { - return ( -
    - -
    - ); -}); - -export default DataMaps; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.less deleted file mode 100644 index 21bb217ba..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.less +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.import-job-details { - position: absolute; - width: calc(100% - 60px); - padding: 0 16px 16px; - left: 60px; - top: 60px; - - &-with-expand-sidebar { - width: calc(100% - 200px); - left: 200px; - } - - &-breadcrumb-wrapper { - display: flex; - justify-content: space-between; - align-items: center; - margin: 16px 0; - } - - &-content-wrapper { - height: calc(100vh - 201px); - background: #fff; - padding: 24px; - overflow: auto; - } - - &-content-header { - margin-bottom: 16px; - display: flex; - justify-content: flex-end; - } - - &-basic-text { - font-size: 14px; - color: #333; - - & > div { - margin-bottom: 14px; - } - - & span:last-child { - margin-left: 24px; - } - } - - &-uploaded-file-infos { - margin-bottom: 19px; - font-size: 14px; - - &-titles { - width: 300px; - display: flex; - justify-content: space-between; - } - - &-progress-status { - width: 374px; - display: flex; - align-items: center; - } - } -} - -/* override */ - -// reveal error layer in -.new-fc-one-modal-body { - overflow: visible; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.tsx deleted file mode 100644 index 66d7394ff..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/JobDetails.tsx +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { AnimatePresence } from 'framer-motion'; -import { useTranslation } from 'react-i18next'; -import { isEmpty } from 'lodash-es'; -import { Menu } from 'hubble-ui'; - -import { - DataImportRootStoreContext, - ImportManagerStoreContext -} from '../../../../../stores'; - -import BasicSettings from './BasicSettings'; -import UploadedFiles from './UploadedFiles'; -import DataMaps from './DataMaps'; -import DataImportDetails from './DataImportDetails'; - -import './JobDetails.less'; - -const JobDetails: React.FC = observer(() => { - const importManagerStore = useContext(ImportManagerStoreContext); - const { dataMapStore, serverDataImportStore } = useContext( - DataImportRootStoreContext - ); - const { t } = useTranslation(); - - const handleMenuItemChange = ({ key }: { key: string }) => { - importManagerStore.setCurrentJobDetailStep(key); - }; - - const renderListView = () => { - switch (importManagerStore.jobDetailsStep) { - case 'basic': - return ; - case 'upload': - return ; - case 'data-map': - return ; - case 'import-details': - return ; - } - }; - - return ( - <> - - - {t('import-job-details.tabs.basic-settings')} - - - {t('import-job-details.tabs.uploaded-files')} - - - {t('import-job-details.tabs.data-maps')} - - - {t('import-job-details.tabs.import-details')} - - - {renderListView()} - - ); -}); - -export default JobDetails; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/UploadedFiles.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/UploadedFiles.tsx deleted file mode 100644 index 7bcf4e6fc..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/UploadedFiles.tsx +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Progress } from 'hubble-ui'; - -import { DataImportRootStoreContext } from '../../../../../stores'; - -const UploadedFiles: React.FC = observer(() => { - const { dataMapStore } = useContext(DataImportRootStoreContext); - - return ( -
    - {dataMapStore.fileMapInfos.map(({ name, total_size }) => ( -
    -
    - {name} - {total_size} -
    -
    - -
    -
    - ))} -
    - ); -}); - -export default UploadedFiles; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/index.ts deleted file mode 100644 index 36247d378..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/job-details/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import JobDetails from './JobDetails'; - -export { JobDetails }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ImportConfigs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ImportConfigs.tsx deleted file mode 100644 index 289e9d394..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ImportConfigs.tsx +++ /dev/null @@ -1,862 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useCallback, useEffect, useRef } from 'react'; -import { observer } from 'mobx-react'; -import { useLocation } from 'wouter'; -import { isEmpty } from 'lodash-es'; -import { useTranslation } from 'react-i18next'; -import classnames from 'classnames'; -import { Switch, Input, Button, Table, Tooltip, Message } from 'hubble-ui'; - -import { DataImportRootStoreContext } from '../../../../../stores'; -import { useInitDataImport } from '../../../../../hooks'; - -import type { - ImportTasks, - LoadParameter -} from '../../../../../stores/types/GraphManagementStore/dataImportStore'; - -import ArrowIcon from '../../../../../assets/imgs/ic_arrow_16.svg'; -import HintIcon from '../../../../../assets/imgs/ic_question_mark.svg'; - -const importStatusColorMapping: Record = { - RUNNING: '#2b65ff', - SUCCEED: '#39bf45', - FAILED: '#e64552', - PAUSED: '#a9cbfb', - STOPPED: '#ccc' -}; - -const commonInputProps = { - size: 'medium', - width: 100, - errorLocation: 'layer' -}; - -export interface ImportConfigsProps { - height?: string; -} - -const ImportConfigs: React.FC = observer(({ height }) => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { serverDataImportStore, dataMapStore } = dataImportRootStore; - const timerId = useRef(NaN); - const isInitReady = useInitDataImport(); - const [, setLocation] = useLocation(); - const { t } = useTranslation(); - - const columnConfigs = [ - { - title: t('server-data-import.import-details.column-titles.file-name'), - dataIndex: 'file_name', - width: '10%', - render(text: string) { - return ( -
    - {text} -
    - ); - } - }, - { - title: t('server-data-import.import-details.column-titles.type'), - dataIndex: 'type', - width: '15%', - render(_: any, rowData: ImportTasks) { - const title = ( -
    - {!isEmpty(rowData.vertices) && ( -
    - {t('server-data-import.import-details.content.vertex')}: - {rowData.vertices.join(' ')} -
    - )} - {!isEmpty(rowData.edges) && ( -
    - {t('server-data-import.import-details.content.edge')}: - {rowData.edges.join(' ')} -
    - )} - {isEmpty(rowData.vertices) && isEmpty(rowData.edges) && '-'} -
    - ); - - return ( - -
    - {!isEmpty(rowData.vertices) && - `${t( - 'server-data-import.import-details.content.vertex' - )}:${rowData.vertices.join(' ')} `} - {!isEmpty(rowData.edges) && - `${t( - 'server-data-import.import-details.content.edge' - )}:${rowData.edges.join(' ')}`} - {isEmpty(rowData.vertices) && isEmpty(rowData.edges) && '-'} -
    -
    - ); - } - }, - { - title: t('server-data-import.import-details.column-titles.import-speed'), - dataIndex: 'load_rate', - width: '12%', - align: 'center', - render(text: string) { - return ( -
    - {text} -
    - ); - } - }, - { - title: t( - 'server-data-import.import-details.column-titles.import-progress' - ), - dataIndex: 'load_progress', - width: '35%', - render(progress: number, rowData: Record) { - return ( -
    -
    -
    -
    -
    {`${progress}%`}
    -
    - ); - } - }, - { - title: t('server-data-import.import-details.column-titles.status'), - dataIndex: 'status', - width: '10%', - render(text: string) { - return ( -
    - {t(`server-data-import.import-details.status.${text}`)} -
    - ); - } - }, - { - title: t('server-data-import.import-details.column-titles.time-consumed'), - dataIndex: 'duration', - align: 'right', - width: '8%', - render(text: string) { - return ( -
    - {text} -
    - ); - } - }, - { - title: !serverDataImportStore.readOnly - ? t('server-data-import.import-details.column-titles.manipulations') - : '', - width: '15%', - render(_: never, rowData: Record, taskIndex: number) { - return !serverDataImportStore.readOnly ? ( -
    - -
    - ) : null; - } - } - ]; - - const handleInputChange = (key: keyof LoadParameter) => (e: any) => { - serverDataImportStore.mutateImportConfigs(key, e.value); - serverDataImportStore.validateImportConfigs(key); - }; - - const handleBlur = (key: keyof LoadParameter) => () => { - serverDataImportStore.validateImportConfigs(key); - }; - - const loopQueryImportData = useCallback(() => { - const loopId = window.setInterval(async () => { - if (serverDataImportStore.isImportFinished) { - window.clearInterval(loopId); - return; - } - - if ( - serverDataImportStore.requestStatus.fetchImportTasks === 'failed' || - serverDataImportStore.requestStatus.fetchAllImportTasks === 'failed' - ) { - Message.error({ - content: - serverDataImportStore.errorInfo.fetchImportTasks.message || - serverDataImportStore.errorInfo.fetchAllImportTasks.message, - size: 'medium', - showCloseIcon: false - }); - - window.clearInterval(loopId); - return; - } - - if (serverDataImportStore.isIrregularProcess) { - serverDataImportStore.fetchAllImportTasks(); - } else { - // stop loops when users click sidebar icon - // (dispose called in , [ids] resets to empty array) - if (isEmpty(serverDataImportStore.fileImportTaskIds)) { - window.clearInterval(loopId); - return; - } - - serverDataImportStore.fetchImportTasks( - serverDataImportStore.fileImportTaskIds - ); - } - }, 1000); - - timerId.current = loopId; - }, []); - - const expandClassName = classnames({ - 'import-tasks-step-content-header-expand': - serverDataImportStore.isExpandImportConfig, - 'import-tasks-step-content-header-collpase': !serverDataImportStore.isExpandImportConfig - }); - - useEffect(() => { - // if comes from import manager or refresh - if ( - (!serverDataImportStore.readOnly || - serverDataImportStore.isIrregularProcess) && - dataImportRootStore.currentStatus === 'LOADING' - ) { - loopQueryImportData(); - } - - return () => { - if (!Object.is(NaN, timerId.current)) { - window.clearInterval(timerId.current); - } - }; - }, [ - isInitReady, - serverDataImportStore.readOnly, - serverDataImportStore.isIrregularProcess, - dataImportRootStore.currentStatus - ]); - - return isInitReady ? ( -
    -
    - {t('server-data-import.import-settings.title')} - collpaseOrExpand { - serverDataImportStore.switchExpandImportConfig( - !serverDataImportStore.isExpandImportConfig - ); - }} - /> -
    - - {serverDataImportStore.isExpandImportConfig && ( -
    -
    -
    -
    - - {t('server-data-import.import-settings.checkIfExist')}: - - - hint - -
    -
    - { - serverDataImportStore.mutateImportConfigs( - 'check_vertex', - checked - ); - }} - disabled={ - serverDataImportStore.readOnly || - serverDataImportStore.importConfigReadOnly - } - /> -
    -
    -
    - - {t( - 'server-data-import.import-settings.maximumAnalyzedErrorRow' - )} - : - - {!serverDataImportStore.readOnly && - !serverDataImportStore.importConfigReadOnly ? ( - - ) : ( -
    - {serverDataImportStore.importConfigs?.max_parse_errors} -
    - )} -
    -
    - - {t( - 'server-data-import.import-settings.maxiumInterpolateErrorRow' - )} - : - - {!serverDataImportStore.readOnly && - !serverDataImportStore.importConfigReadOnly ? ( - - ) : ( -
    - {serverDataImportStore.importConfigs?.max_insert_errors} -
    - )} -
    -
    -
    -
    - - {t( - 'server-data-import.import-settings.requestTimesWhenInterpolationFailed' - )} - : - - {!serverDataImportStore.readOnly && - !serverDataImportStore.importConfigReadOnly ? ( - - ) : ( -
    - {serverDataImportStore.importConfigs?.retry_times} -
    - )} -
    -
    - - {t( - 'server-data-import.import-settings.requestTicksWhenInterpolationFailed' - )} - : - - {!serverDataImportStore.readOnly && - !serverDataImportStore.importConfigReadOnly ? ( - - ) : ( -
    - {serverDataImportStore.importConfigs?.retry_interval} -
    - )} -
    -
    - - {t('server-data-import.import-settings.InterpolationTimeout')}: - - {!serverDataImportStore.readOnly && - !serverDataImportStore.importConfigReadOnly ? ( - - ) : ( -
    - {serverDataImportStore.importConfigs?.insert_timeout} -
    - )} -
    -
    -
    - )} - - {(dataImportRootStore.currentStatus === 'LOADING' || - dataImportRootStore.currentStatus === 'SUCCESS' || - dataImportRootStore.currentStatus === 'FAILED' || - (serverDataImportStore.isIrregularProcess && - serverDataImportStore.readOnly)) && ( - <> -
    - {t('server-data-import.import-details.title')} -
    -
    -
- - - )} - - {!serverDataImportStore.readOnly && ( -
- - -
- )} - - ) : null; -}); - -export interface ImportManipulationsProps { - importStatus: string; - taskIndex: number; - loopQuery: () => void; -} - -const ImportManipulations: React.FC = observer( - ({ importStatus, taskIndex, loopQuery }) => { - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { serverDataImportStore } = dataImportRootStore; - const { t } = useTranslation(); - const manipulations: string[] = []; - - const handleClickManipulation = async (manipulation: string) => { - switch (manipulation) { - case t('server-data-import.import-details.manipulations.pause'): - await serverDataImportStore.pauseImport( - serverDataImportStore.importTasks[taskIndex].id - ); - - if (serverDataImportStore.requestStatus.pauseImport === 'failed') { - Message.error({ - content: serverDataImportStore.errorInfo.pauseImport.message, - size: 'medium', - showCloseIcon: false - }); - } - - break; - case t('server-data-import.import-details.manipulations.abort'): - await serverDataImportStore.abortImport( - serverDataImportStore.importTasks[taskIndex].id - ); - - if (serverDataImportStore.requestStatus.abortImport === 'failed') { - Message.error({ - content: serverDataImportStore.errorInfo.abortImport.message, - size: 'medium', - showCloseIcon: false - }); - } - - serverDataImportStore.fetchAllImportTasks(); - - break; - case t('server-data-import.import-details.manipulations.resume'): - await serverDataImportStore.resumeImport( - serverDataImportStore.importTasks[taskIndex].id - ); - - if (serverDataImportStore.requestStatus.resumeImport === 'failed') { - Message.error({ - content: serverDataImportStore.errorInfo.resumeImport.message, - size: 'medium', - showCloseIcon: false - }); - } - - serverDataImportStore.switchImporting(true); - serverDataImportStore.switchImportFinished(false); - loopQuery(); - break; - case t('server-data-import.import-details.manipulations.failed-cause'): - serverDataImportStore.checkErrorLogs( - dataImportRootStore.currentId!, - dataImportRootStore.currentJobId!, - serverDataImportStore.importTasks[taskIndex].id - ); - break; - case t('server-data-import.import-details.manipulations.retry'): - await serverDataImportStore.retryImport( - serverDataImportStore.importTasks[taskIndex].id - ); - - if (serverDataImportStore.requestStatus.retryImport === 'failed') { - Message.error({ - content: serverDataImportStore.errorInfo.retryImport.message, - size: 'medium', - showCloseIcon: false - }); - } - - serverDataImportStore.switchImporting(true); - serverDataImportStore.switchImportFinished(false); - loopQuery(); - break; - } - }; - - switch (importStatus) { - case 'RUNNING': - manipulations.push( - t('server-data-import.import-details.manipulations.pause'), - t('server-data-import.import-details.manipulations.abort') - ); - break; - case 'FAILED': - manipulations.push( - t('server-data-import.import-details.manipulations.resume'), - t('server-data-import.import-details.manipulations.failed-cause') - ); - break; - case 'PAUSED': - manipulations.push( - t('server-data-import.import-details.manipulations.resume'), - t('server-data-import.import-details.manipulations.abort') - ); - break; - case 'STOPPED': - manipulations.push( - t('server-data-import.import-details.manipulations.retry') - ); - break; - case 'SUCCEED': - break; - default: - throw new Error('Wrong status received from server'); - } - - return ( -
- {manipulations.map((manipulation) => { - if ( - manipulation === - t('server-data-import.import-details.manipulations.failed-cause') - ) { - return ( - { - handleClickManipulation(manipulation); - }} - > - {manipulation} - - ); - } - - return ( - { - serverDataImportStore.switchImportFinished(false); - handleClickManipulation(manipulation); - }} - > - {manipulation} - - ); - })} -
- ); - } -); - -export default ImportConfigs; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.less deleted file mode 100644 index 7ba8506e1..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.less +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.import-tasks { - &-server-data-import { - &-configs-wrapper { - width: 100%; - margin-bottom: 30px; - } - - &-configs { - display: flex; - width: 100%; - } - - &-config { - height: 128px; - display: flex; - justify-content: space-between; - flex-direction: column; - flex-basis: 50%; - - &:first-child { - align-items: flex-end; - // margin-right: 87px; - } - - &:last-child { - align-items: flex-start; - } - } - - &-config-option { - display: flex; - align-items: center; - - & > div:first-child, - & > span:first-child { - width: 200.7px; - margin-right: 44px; - text-align: right; - color: #333; - font-size: 14px; - } - - &-readonly-data { - width: 100px; - font-size: 14px; - color: #333; - line-height: 20px; - } - } - - &-manipulations { - width: 100%; - margin: 40px 0 6px; - display: flex; - justify-content: center; - } - - &-table-wrapper { - & table { - table-layout: fixed; - } - } - - &-table-tooltip-title { - width: 234px; - } - - &-table-progress { - position: relative; - width: 80%; - height: 8px; - background: #eee; - border-radius: 4px; - margin-right: 8px; - } - - &-table-manipulations { - display: flex; - // justify-content: space-between; - } - } -} - -/* override */ - -.import-tasks-server-data-import-config-option .new-fc-one-input-error.new-fc-one-input-error-layer { - // safari bug - // width: max-content; - word-break: keep-all; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.tsx deleted file mode 100644 index b84fb2870..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/ServerDataImport.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -import { observer } from 'mobx-react'; - -import ImportConfigs from './ImportConfigs'; - -import './ServerDataImport.less'; - -const ServerDataImport: React.FC = observer(() => { - return ( -
- -
- ); -}); - -export default ServerDataImport; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/index.ts deleted file mode 100644 index 850e2c888..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/import-tasks/server-data-import/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import ServerDataImport from './ServerDataImport'; - -export { ServerDataImport }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/index.ts deleted file mode 100644 index 6ff89dc6e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/data-import/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { ImportTasks, ImportManager, JobDetails } from './import-tasks'; - -export { ImportTasks, ImportManager, JobDetails }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/index.ts deleted file mode 100644 index c92bd3ece..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import GraphManagement from './GraphManagement'; -import { DataAnalyze } from './data-analyze'; -import { MetadataConfigs } from './metadata-configs'; -import { ImportTasks, ImportManager, JobDetails } from './data-import'; -import { AsyncTaskList } from './async-tasks'; - -export { - GraphManagement, - DataAnalyze, - MetadataConfigs, - ImportTasks, - ImportManager, - JobDetails, - AsyncTaskList -}; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/MetadataConfigs.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/MetadataConfigs.less deleted file mode 100644 index f5a0cf5bb..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/MetadataConfigs.less +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.metadata-configs { - position: absolute; - width: calc(100% - 60px); - padding: 0 16px 16px 16px; - left: 60px; - top: 60px; - - &-with-expand-sidebar { - width: calc(100% - 200px); - left: 200px; - } - - &-content { - &-wrapper { - margin-top: 16px; - padding: 16px; - background: #fff; - border: 1px solid #eee; - border-radius: 3px; - } - - &-loading-wrapper { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - } - - &-loading-bg { - width: 144px; - height: 144px; - position: relative; - margin-bottom: 10px; - } - - &-loading-back { - position: absolute; - left: 22px; - top: 20px; - } - - &-loading-front { - position: absolute; - left: 57.1px; - top: 52.1px; - animation: loading-rotate 2s linear infinite; - } - - &-mode { - margin: 16px 0; - - &-button { - display: flex; - align-items: center; - - & > img { - margin-right: 6px; - } - } - } - - &-header { - margin-bottom: 16px; - display: flex; - justify-content: flex-end; - } - - &-dropdown { - width: 382px; - max-height: 332px; - overflow: auto; - background: #fff; - box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15); - border-radius: 3px; - color: #333; - - & > div { - padding: 0 16px; - height: 32px; - display: flex; - align-items: center; - } - } - } - - &-drawer { - font-size: 14px; - margin-top: 4px; - } - - &-sorted-multiSelect-option { - display: flex; - - & > div:first-child { - margin: 8px 8px 0; - width: 16px; - height: 16px; - border: 1px solid #ccc; - background: #fff; - border-radius: 2px; - } - - & > div:last-child { - width: 80%; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - } - - &-selected { - & > div:first-child { - margin: 8px 8px 0; - width: 16px; - height: 16px; - background: #2b65ff; - border-radius: 2px; - text-align: center; - line-height: 14px; - color: #fff; - } - } - } -} - -.metadata-properties-tooltips { - background: #fff; - box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15); - border-radius: 3px; - padding: 24px; - font-size: 14px; - color: #333; - - &-title { - font-size: 16px; - font-weight: 900; - margin-bottom: 16px; - } - - &-footer { - display: flex; - margin-top: 24px; - } - - // & p { - // margin: 0; - // line-height: 28px; - // } -} - -.metadata-title { - font-family: - 'PingFangSC-Medium', - 'Microsoft YaHei', - '微软雅黑', - Arial, - sans-serif; - font-weight: bold; - font-size: 16px; - color: #000; - letter-spacing: 0; - line-height: 24px; -} - -.metadata-drawer { - &-options { - margin-bottom: 12px; - display: flex; - - &-disabled { - color: #ccc; - } - - &-name { - width: 98px; - text-align: right; - margin-right: 9px; - } - - &-list { - width: calc(100% - 155px); - - &-row { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 16px; - - &-normal { - & > div, - & > span { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - - &:nth-child(1) { - flex: 0 1 30%; - } - - &:nth-child(2) { - flex: 0 1 32%; - } - - &:nth-child(3) { - flex: 0 1 38%; - display: flex; - align-items: center; - - & > img { - margin-left: 4px; - } - } - } - } - - &:last-child { - margin-bottom: 0; - } - } - } - } -} - -.metadata-selected-properties { - display: flex; - justify-content: space-between; - margin: 12px 0; -} - -.metdata-essential-form-options { - color: #fb4b53; -} - -// override -.metadata-configs { - table { - table-layout: fixed; - } - - .new-fc-one-table { - overflow: visible; - border: 0; - } - - .new-fc-one-table table { - overflow: visible; - } - - .new-fc-one-menu { - background: transparent; - } - - .new-fc-one-select-dropdown-menu-item.new-fc-one-select-dropdown-menu-item-selected { - color: #2b65ff; - font-weight: 900; - } -} - -// override -.metadata-drawer-options-list-row { - .new-fc-one-select-search-ul { - .new-fc-one-select-search.new-fc-one-select-search--inline { - display: none; - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/MetadataConfigs.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/MetadataConfigs.tsx deleted file mode 100644 index e0c9ce130..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/MetadataConfigs.tsx +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useState, useEffect, useContext } from 'react'; -import { observer } from 'mobx-react'; -import { useRoute, useLocation, Params } from 'wouter'; -import classnames from 'classnames'; -import { AnimatePresence } from 'framer-motion'; -import { Radio, Menu, Modal, Button } from 'hubble-ui'; - -import { MetadataProperties } from './property'; -import { VertexTypeList } from './vertex-type'; -import { EdgeTypeList } from './edge-type'; -import { PropertyIndex } from './property-index'; -import { GraphView } from './graph-view'; -import DataAnalyzeStore from '../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import MetadataConfigsRootStore from '../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; -import './MetadataConfigs.less'; -import { AppStoreContext, GraphManagementStoreContext } from '../../../stores'; -import ActiveTableIcon from '../../../assets/imgs/ic_liebiaomoshi_white.svg'; -import TableIcon from '../../../assets/imgs/ic_liebiaomoshi_black.svg'; -import ActiveShowGraphIcon from '../../../assets/imgs/ic_tumoshi_white.svg'; -import ShowGraphIcon from '../../../assets/imgs/ic_tumoshi_black.svg'; -import { useTranslation } from 'react-i18next'; - -const MetadataConfig: React.FC = observer(() => { - const appStore = useContext(AppStoreContext); - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const graphManagementStore = useContext(GraphManagementStoreContext); - const metadataConfigRootStore = useContext(MetadataConfigsRootStore); - const [viewMode, setViewMode] = useState('list'); - const [selectedMenuItem, setSelectedMenuItem] = useState('property'); - const [match, params] = useRoute('/graph-management/:id/metadata-configs'); - const [_, setLocation] = useLocation(); - const { t } = useTranslation(); - - const handleRadioGroupChange = (e: React.ChangeEvent) => { - setViewMode(e.target.value); - }; - - const handleMenuItemChange = ({ key }: { key: string }) => { - // reset store current tab status to default - switch (selectedMenuItem) { - case 'property': - metadataConfigRootStore.metadataPropertyStore.changeCurrentTabStatus( - 'list' - ); - case 'vertex-type': - metadataConfigRootStore.vertexTypeStore.changeCurrentTabStatus('list'); - case 'edge-type': - metadataConfigRootStore.edgeTypeStore.changeCurrentTabStatus('list'); - } - - setSelectedMenuItem(key); - }; - - const wrapperClassName = classnames({ - 'metadata-configs': true, - 'metadata-configs-with-expand-sidebar': graphManagementStore.isExpanded - }); - - const renderListView = () => { - switch (selectedMenuItem) { - case 'property': - return ; - case 'vertex-type': - return ; - case 'edge-type': - return ; - case 'property-index': - return ; - } - }; - - // Caution: Preitter will automatically add 'params' behind 'match' in array, - // which is not equal each time - /* eslint-disable */ - useEffect(() => { - window.scrollTo(0, 0); - graphManagementStore.fetchIdList(); - - if (match && params !== null) { - appStore.setCurrentId(Number(params.id)); - // fetch node colors - dataAnalyzeStore.setCurrentId(Number(params.id)); - dataAnalyzeStore.fetchAllNodeStyle(); - dataAnalyzeStore.fetchAllEdgeStyle(); - metadataConfigRootStore.setCurrentId(Number(params.id)); - // metadataConfigRootStore.fetchIdList(); - } - - return () => { - metadataConfigRootStore.dispose(); - }; - }, [metadataConfigRootStore, match, params?.id]); - - return ( -
-
-
- - -
- table mode - {t('addition.menu.list-mode')} -
-
- -
- graph mode - {t('addition.menu.chart-mode')} -
-
-
-
- {viewMode === 'list' ? ( - <> - - - {t('addition.common.property')} - - - {t('addition.common.vertex-type')} - - - {t('addition.common.edge-type')} - - - {t('addition.common.property-index')} - - - - {renderListView()} - - - ) : ( - - )} -
- { - metadataConfigRootStore.setCurrentId(null); - setLocation('/'); - }} - > - {t('addition.dataAnalyze.return-home')} - - ]} - visible={graphManagementStore.graphData.some( - ({ id, enabled }) => - metadataConfigRootStore.currentId === id && !enabled - )} - destroyOnClose - needCloseIcon={false} - > -
- {metadataConfigRootStore.metadataPropertyStore.errorMessage} -
-
-
- ); -}); - -export default MetadataConfig; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/common/EmptyDataView.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/common/EmptyDataView.tsx deleted file mode 100644 index cc38c32eb..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/common/EmptyDataView.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -import { observer } from 'mobx-react'; - -import LoadingBackIcon from '../../../../assets/imgs/ic_loading_back.svg'; -import LoadingFrontIcon from '../../../../assets/imgs/ic_loading_front.svg'; - -import i18next from '../../../../i18n'; -export interface LoadingDataViewProps { - isLoading: boolean; - emptyText?: string; -} - -const LoadingDataView: React.FC = observer( - ({ isLoading, emptyText }) => - isLoading ? ( -
-
- load background - load spinner -
- {i18next.t('addition.message.data-loading')}... -
- ) : emptyText ? ( - {emptyText} - ) : null -); - -export default LoadingDataView; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.less deleted file mode 100644 index a6874e139..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.less +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.edge-type-list-wrapper { - width: 100%; - background: #fff; - margin-top: 16px; - padding: 16px; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.tsx deleted file mode 100644 index a29c32ddd..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/EdgeTypeList.tsx +++ /dev/null @@ -1,1957 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import { - isEmpty, - isUndefined, - cloneDeep, - intersection, - size, - without -} from 'lodash-es'; -import { useLocation } from 'wouter'; -import classnames from 'classnames'; -import { motion } from 'framer-motion'; -import { - Button, - Table, - Switch, - Modal, - Drawer, - Input, - Select, - Checkbox, - Message, - Loading -} from 'hubble-ui'; - -import { Tooltip, LoadingDataView } from '../../../common'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; - -import NewEdgeType from './NewEdgeType'; -import ReuseEdgeTypes from './ReuseEdgeTypes'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { formatVertexIdText } from '../../../../stores/utils'; - -import type { - EdgeTypeValidatePropertyIndexes, - EdgeType -} from '../../../../stores/types/GraphManagementStore/metadataConfigsStore'; - -import AddIcon from '../../../../assets/imgs/ic_add.svg'; -import BlueArrowIcon from '../../../../assets/imgs/ic_arrow_blue.svg'; -import WhiteCloseIcon from '../../../../assets/imgs/ic_close_white.svg'; -import CloseIcon from '../../../../assets/imgs/ic_close_16.svg'; -import LoadingBackIcon from '../../../../assets/imgs/ic_loading_back.svg'; -import LoadingFrontIcon from '../../../../assets/imgs/ic_loading_front.svg'; -import SelectedSoilidArrowIcon from '../../../../assets/imgs/ic_arrow_selected.svg'; -import NoSelectedSoilidArrowIcon from '../../../../assets/imgs/ic_arrow.svg'; -import SelectedSoilidStraightIcon from '../../../../assets/imgs/ic_straight_selected.svg'; -import NoSelectedSoilidStraightIcon from '../../../../assets/imgs/ic_straight.svg'; -import i18next from '../../../../i18n'; -import { useTranslation } from 'react-i18next'; - -import './EdgeTypeList.less'; - -const styles = { - button: { - marginLeft: 12, - width: 78 - }, - header: { - marginBottom: 16 - }, - manipulation: { - marginRight: 12 - }, - deleteWrapper: { - display: 'flex', - justifyContent: 'flex-end' - }, - loading: { - padding: 0, - marginRight: 4 - } -}; - -const variants = { - initial: { - opacity: 0 - }, - animate: { - opacity: 1, - transition: { - duration: 0.7 - } - }, - exit: { - opacity: 0, - transition: { - duration: 0.3 - } - } -}; - -const propertyIndexTypeMappings: Record = { - SECONDARY: i18next.t('addition.menu.secondary-index'), - RANGE: i18next.t('addition.menu.range-index'), - SEARCH: i18next.t('addition.menu.full-text-index') -}; - -const EdgeTypeList: React.FC = observer(() => { - const { t } = useTranslation(); - const metadataConfigsRootStore = useContext(MetadataConfigsRootStore); - const { metadataPropertyStore, edgeTypeStore } = metadataConfigsRootStore; - const [preLoading, switchPreLoading] = useState(true); - const [sortOrder, setSortOrder] = useState(''); - const [selectedRowKeys, mutateSelectedRowKeys] = useState([]); - const [isShowModal, switchShowModal] = useState(false); - const [isAddProperty, switchIsAddProperty] = useState(false); - const [isEditEdge, switchIsEditEdge] = useState(false); - const [ - deleteExistPopIndexInDrawer, - setDeleteExistPopIndexInDrawer - ] = useState(null); - const [ - deleteAddedPopIndexInDrawer, - setDeleteAddedPopIndexInDrawer - ] = useState(null); - const [, setLocation] = useLocation(); - - const dropdownWrapperRef = useRef(null); - const deleteWrapperInDrawerRef = useRef(null); - - const isLoading = - preLoading || edgeTypeStore.requestStatus.fetchEdgeTypeList === 'pending'; - - const currentSelectedRowKeys = intersection( - selectedRowKeys, - edgeTypeStore.edgeTypes.map(({ name }) => name) - ); - - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - if ( - isAddProperty && - dropdownWrapperRef.current && - !dropdownWrapperRef.current.contains(e.target as Element) - ) { - switchIsAddProperty(false); - } - - if ( - (deleteExistPopIndexInDrawer || deleteAddedPopIndexInDrawer) && - deleteWrapperInDrawerRef.current && - !deleteWrapperInDrawerRef.current.contains(e.target as Element) - ) { - setDeleteExistPopIndexInDrawer(null); - setDeleteAddedPopIndexInDrawer(null); - } - }, - [deleteExistPopIndexInDrawer, deleteWrapperInDrawerRef, isAddProperty] - ); - - const handleSelectedTableRow = (newSelectedRowKeys: string[]) => { - mutateSelectedRowKeys(newSelectedRowKeys); - }; - - const handleCloseDrawer = () => { - switchIsAddProperty(false); - switchIsEditEdge(false); - edgeTypeStore.selectEdgeType(null); - edgeTypeStore.resetEditedSelectedEdgeType(); - }; - - const handleSortClick = () => { - switchPreLoading(true); - - if (sortOrder === 'descend') { - edgeTypeStore.mutatePageSort('asc'); - setSortOrder('ascend'); - } else { - edgeTypeStore.mutatePageSort('desc'); - setSortOrder('descend'); - } - - edgeTypeStore.fetchEdgeTypeList(); - }; - - const batchDeleteProperties = async () => { - switchShowModal(false); - // need to set a copy in store since local row key state would be cleared - edgeTypeStore.mutateSelectedEdgeTypeNames(currentSelectedRowKeys); - // mutateSelectedRowKeys([]); - await edgeTypeStore.deleteEdgeType(currentSelectedRowKeys); - // edgeTypeStore.mutateSelectedEdgeTypeNames([]); - - if (edgeTypeStore.requestStatus.deleteEdgeType === 'success') { - Message.success({ - content: t('addition.common.del-success'), - size: 'medium', - showCloseIcon: false - }); - - mutateSelectedRowKeys( - without(selectedRowKeys, ...currentSelectedRowKeys) - ); - - await edgeTypeStore.fetchEdgeTypeList(); - - // fetch previous page data if it's empty - if ( - edgeTypeStore.requestStatus.fetchEdgeTypeList === 'success' && - size(edgeTypeStore.edgeTypes) === 0 && - edgeTypeStore.edgeTypeListPageConfig.pageNumber > 1 - ) { - edgeTypeStore.mutatePageNumber( - edgeTypeStore.edgeTypeListPageConfig.pageNumber - 1 - ); - - edgeTypeStore.fetchEdgeTypeList(); - } - - return; - } - - if (edgeTypeStore.requestStatus.deleteEdgeType === 'failed') { - Message.error({ - content: edgeTypeStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - } - }; - - const columnConfigs = [ - { - title: t('addition.common.edge-type-name'), - dataIndex: 'name', - sorter: true, - sortOrder, - width: '14%', - render(text: string, records: any[], index: number) { - return ( -
{ - edgeTypeStore.selectEdgeType(index); - - // check also need style infos - edgeTypeStore.mutateEditedSelectedEdgeType({ - ...edgeTypeStore.editedSelectedEdgeType, - style: { - color: edgeTypeStore.selectedEdgeType!.style.color, - icon: null, - with_arrow: edgeTypeStore.selectedEdgeType!.style.with_arrow, - thickness: edgeTypeStore.selectedEdgeType!.style.thickness, - display_fields: edgeTypeStore.selectedEdgeType!.style - .display_fields - } - }); - }} - > - {text} -
- ); - } - }, - { - title: t('addition.common.source-type'), - dataIndex: 'source_label', - width: '14%', - render(text: string, records: any[], index: number) { - return ( -
- {text} -
- ); - } - }, - { - title: t('addition.common.target-type'), - dataIndex: 'target_label', - width: '14%', - render(text: string, records: any[], index: number) { - return ( -
- {text} -
- ); - } - }, - { - title: t('addition.common.association-property'), - dataIndex: 'properties', - width: '14%', - render(properties: { name: string; nullable: boolean }[]) { - const text = - properties.length !== 0 - ? properties.map(({ name }) => name).join('; ') - : '-'; - - return ( -
- {text} -
- ); - } - }, - { - title: t('addition.common.distinguishing-key'), - dataIndex: 'sort_keys', - width: '10%', - render(values: string[]) { - const text = values.length !== 0 ? values.join(';') : '-'; - - return ( -
- {text} -
- ); - } - }, - { - title: t('addition.menu.type-index'), - dataIndex: 'open_label_index', - width: '8%', - render(value: boolean) { - return ( - - ); - } - }, - { - title: t('addition.common.property-index'), - dataIndex: 'property_indexes', - width: '14%', - render(indexes: { name: string; type: string; fields: string[] }[]) { - const text = - indexes.length !== 0 - ? indexes.map(({ name }) => name).join('; ') - : '-'; - - return ( -
- {text} -
- ); - } - }, - { - title: t('addition.operate.operate'), - dataIndex: 'manipulation', - width: '12%', - render(_: any, records: EdgeType, index: number) { - return ( - - ); - } - } - ]; - - const metadataDrawerOptionClass = classnames({ - 'metadata-drawer-options': true, - 'metadata-drawer-options-disabled': isEditEdge - }); - - useEffect(() => { - setTimeout(() => { - switchPreLoading(false); - }, 500); - }, [sortOrder]); - - useEffect(() => { - return () => { - const messageComponents = document.querySelectorAll( - '.new-fc-one-message' - ) as NodeListOf; - - messageComponents.forEach((messageComponent) => { - messageComponent.style.display = 'none'; - }); - }; - }); - - useEffect(() => { - if (metadataConfigsRootStore.currentId !== null) { - metadataPropertyStore.fetchMetadataPropertyList({ fetchAll: true }); - edgeTypeStore.fetchEdgeTypeList(); - } - - return () => { - edgeTypeStore.dispose(); - }; - }, [ - metadataPropertyStore, - metadataConfigsRootStore.currentId, - edgeTypeStore - ]); - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - if (edgeTypeStore.currentTabStatus === 'new') { - return ; - } - - if (edgeTypeStore.currentTabStatus === 'reuse') { - return ; - } - - return ( - -
-
- - -
- {size(currentSelectedRowKeys) !== 0 && ( -
-
- {t('addition.message.selected')} - {size(currentSelectedRowKeys)} - {t('addition.common.term')} -
- - {t('addition.common.close')} { - mutateSelectedRowKeys([]); - }} - /> -
- )} -
rowData.name} - locale={{ - emptyText: ( - } - /> - ) - }} - rowSelection={{ - selectedRowKeys, - onChange: handleSelectedTableRow - }} - onSortClick={handleSortClick} - dataSource={isLoading ? [] : edgeTypeStore.edgeTypes} - pagination={ - isLoading - ? null - : { - hideOnSinglePage: false, - pageNo: edgeTypeStore.edgeTypeListPageConfig.pageNumber, - pageSize: 10, - showSizeChange: false, - showPageJumper: false, - total: edgeTypeStore.edgeTypeListPageConfig.pageTotal, - onPageNoChange: (e: React.ChangeEvent) => { - // mutateSelectedRowKeys([]); - edgeTypeStore.mutatePageNumber(Number(e.target.value)); - edgeTypeStore.fetchEdgeTypeList(); - } - } - } - /> - { - switchShowModal(false); - }} - > -
-
- {t('addition.common.del-comfirm')} - {t('addition.common.close')} { - switchShowModal(false); - }} - /> -
-
- {t('addition.message.edge-del-confirm')} -
-
- {t('addition.message.long-time-notice')} -
-
) { - return ( - - {text} - - ); - } - } - ]} - dataSource={currentSelectedRowKeys.map((name) => ({ - name - }))} - pagination={false} - /> - - - { - if (!isEditEdge) { - switchIsEditEdge(true); - edgeTypeStore.validateEditEdgeType(); - edgeTypeStore.mutateEditedSelectedEdgeType({ - ...edgeTypeStore.editedSelectedEdgeType, - style: { - color: edgeTypeStore.selectedEdgeType!.style.color, - icon: null, - with_arrow: edgeTypeStore.selectedEdgeType!.style - .with_arrow, - thickness: edgeTypeStore.selectedEdgeType!.style - .thickness, - display_fields: edgeTypeStore.selectedEdgeType!.style - .display_fields - } - }); - } else { - await edgeTypeStore.updateEdgeType(); - - if (edgeTypeStore.requestStatus.updateEdgeType === 'failed') { - Message.error({ - content: edgeTypeStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - - return; - } - - if ( - edgeTypeStore.requestStatus.updateEdgeType === 'success' - ) { - if ( - isEmpty( - edgeTypeStore.editedSelectedEdgeType - .append_property_indexes - ) - ) { - Message.success({ - content: t('addition.operate.modify-success'), - size: 'medium', - showCloseIcon: false - }); - } else { - Message.success({ - content: ( -
-
- {t('addition.common.save-scuccess')} -
-
- {t('addition.message.index-long-time-notice')} -
-
{ - setLocation( - `/graph-management/${metadataConfigsRootStore.currentId}/async-tasks` - ); - }} - > - {t('addition.operate.view-task-management')} -
-
- ), - duration: 60 * 60 * 24 - }); - } - } - - switchIsEditEdge(false); - edgeTypeStore.selectEdgeType(null); - edgeTypeStore.fetchEdgeTypeList(); - edgeTypeStore.resetEditedSelectedEdgeType(); - } - }} - > - {isEditEdge - ? t('addition.common.save') - : t('addition.common.edit')} - , - - ]} - > - {!isEmpty(edgeTypeStore.selectedEdgeType) && ( -
-
-
- {t('addition.menu.base-info')} -
-
-
- {t('addition.common.edge-type-name')}: -
-
- {edgeTypeStore.selectedEdgeType!.name} -
-
-
-
- - {t('addition.common.edge-style')}: - -
-
- -
-
- -
-
- -
-
- -
-
- {t('addition.common.source-type')}: -
-
- {edgeTypeStore.selectedEdgeType!.source_label} -
-
-
-
- {t('addition.common.target-type')}: -
-
- {edgeTypeStore.selectedEdgeType!.target_label} -
-
-
-
- - {t('addition.common.allow-multiple-connections')}: - -
- -
-
-
- {t('addition.common.association-property')}: -
-
-
- {t('addition.common.property')} - {t('addition.common.allow-null')} -
- {edgeTypeStore.selectedEdgeType!.properties.map( - ({ name, nullable }) => ( -
-
{name}
-
- -
-
- ) - )} - {isEditEdge && - edgeTypeStore.editedSelectedEdgeType.append_properties.map( - ({ name }) => ( -
-
{name}
-
- -
-
- ) - )} - {isEditEdge && ( -
{ - switchIsAddProperty(!isAddProperty); - }} - > - - {t('addition.common.add-property')} - - toogleAddProperties -
- )} - {isEditEdge && isAddProperty && ( -
- {metadataPropertyStore.metadataProperties - .filter( - (property) => - edgeTypeStore.selectedEdgeType!.properties.find( - ({ name }) => name === property.name - ) === undefined - ) - .map((property) => ( -
- - - propertyIndex === property.name - ) !== -1 - } - onChange={() => { - const addedPropertiesInSelectedVertextType = - edgeTypeStore.addedPropertiesInSelectedEdgeType; - - addedPropertiesInSelectedVertextType.has( - property.name - ) - ? addedPropertiesInSelectedVertextType.delete( - property.name - ) - : addedPropertiesInSelectedVertextType.add( - property.name - ); - - edgeTypeStore.mutateEditedSelectedEdgeType({ - ...edgeTypeStore.editedSelectedEdgeType, - append_properties: [ - ...addedPropertiesInSelectedVertextType - ].map((propertyName) => { - const currentProperty = edgeTypeStore.newEdgeType.properties.find( - ({ name }) => name === propertyName - ); - - return { - name: propertyName, - nullable: !isUndefined( - currentProperty - ) - ? currentProperty.nullable - : true - }; - }) - }); - }} - > - {property.name} - - -
- ))} -
- )} -
-
-
-
- - {t('addition.common.distinguishing-key-property')}: - -
-
- {edgeTypeStore.selectedEdgeType!.sort_keys.join(';')} -
-
-
-
- - {t('addition.edge.display-content')}: - -
- {isEditEdge ? ( - - ) : ( -
- {edgeTypeStore.selectedEdgeType?.style.display_fields - .map((field) => - formatVertexIdText( - field, - t('addition.function-parameter.edge-type') - ) - ) - .join('-')} -
- )} -
-
- {t('addition.edge.index-info')} -
-
-
- {t('addition.menu.type-index')}: -
- -
-
-
- {t('addition.common.property-index')}: -
-
- {(edgeTypeStore.selectedEdgeType!.property_indexes - .length !== 0 || - edgeTypeStore.editedSelectedEdgeType - .append_property_indexes.length !== 0) && ( -
- {t('addition.edge.index-name')} - {t('addition.edge.index-type')} - {t('addition.common.property')} -
- )} - {edgeTypeStore - .selectedEdgeType!.property_indexes.filter( - (propertyIndex) => - isUndefined( - edgeTypeStore.editedSelectedEdgeType.remove_property_indexes.find( - (removedPropertyName) => - removedPropertyName === propertyIndex.name - ) - ) - ) - .map(({ name, type, fields }, index) => { - return ( -
-
{name}
-
{propertyIndexTypeMappings[type]}
-
- - {fields - .map( - (field, index) => index + 1 + '.' + field - ) - .join(';')} - - - {isEditEdge && ( - -

- {t( - 'addition.message.property-del-confirm' - )} -

-

- {t( - 'addition.message.index-del-confirm' - )} -

-
-
{ - const removedPropertyIndex = cloneDeep( - edgeTypeStore - .editedSelectedEdgeType - .remove_property_indexes - ); - - removedPropertyIndex.push( - edgeTypeStore.selectedEdgeType! - .property_indexes[index].name - ); - - edgeTypeStore.mutateEditedSelectedEdgeType( - { - ...edgeTypeStore.editedSelectedEdgeType, - remove_property_indexes: removedPropertyIndex - } - ); - - setDeleteExistPopIndexInDrawer( - null - ); - edgeTypeStore.validateEditEdgeType( - true - ); - }} - > - {t('addition.common.confirm')} -
-
{ - setDeleteExistPopIndexInDrawer( - null - ); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: CloseIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeleteExistPopIndexInDrawer(index); - } - }} - childrenWrapperElement="img" - /> - )} -
-
- ); - })} - {edgeTypeStore.editedSelectedEdgeType.append_property_indexes.map( - ({ name, type, fields }, index) => { - return ( -
-
- { - const propertyIndexEntities = cloneDeep( - edgeTypeStore.editedSelectedEdgeType - .append_property_indexes - ); - - propertyIndexEntities[index].name = e.value; - - edgeTypeStore.mutateEditedSelectedEdgeType({ - ...edgeTypeStore.editedSelectedEdgeType, - append_property_indexes: propertyIndexEntities - }); - }} - originInputProps={{ - onBlur() { - // check is ready to create - edgeTypeStore.validateEditEdgeType(); - } - }} - /> -
-
- -
-
- - - -

- {t( - 'addition.message.property-del-confirm' - )} -

-

- {t('addition.message.index-del-confirm')} -

-
-
{ - const appendPropertyIndexes = cloneDeep( - edgeTypeStore.editedSelectedEdgeType! - .append_property_indexes - ); - - appendPropertyIndexes.splice( - index, - 1 - ); - - edgeTypeStore.mutateEditedSelectedEdgeType( - { - ...edgeTypeStore.editedSelectedEdgeType, - append_property_indexes: appendPropertyIndexes - } - ); - - setDeleteAddedPopIndexInDrawer(null); - edgeTypeStore.validateEditEdgeType( - true - ); - }} - > - {t('addition.common.confirm')} -
-
{ - edgeTypeStore.resetEditedSelectedEdgeType(); - setDeleteAddedPopIndexInDrawer(null); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: CloseIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeleteAddedPopIndexInDrawer(index); - } - }} - childrenWrapperElement="img" - /> -
-
- ); - } - )} - {isEditEdge && ( - { - if ( - edgeTypeStore.editedSelectedEdgeType - .append_property_indexes.length === 0 || - edgeTypeStore.isEditReady - ) { - edgeTypeStore.mutateEditedSelectedEdgeType({ - ...edgeTypeStore.editedSelectedEdgeType, - append_property_indexes: [ - ...edgeTypeStore.editedSelectedEdgeType - .append_property_indexes, - { - name: '', - type: '', - fields: [] - } - ] - }); - - edgeTypeStore.validateEditEdgeType(true); - } - }} - style={{ - cursor: 'pointer', - color: edgeTypeStore.isEditReady ? '#2b65ff' : '#999' - }} - > - {t('addition.edge.add-group')} - - )} -
-
- - - )} -
- - - ); -}); - -export interface EdgeTypeListManipulation { - edgeName: string; - edgeIndex: number; - switchIsEditEdge: (flag: boolean) => void; -} - -const EdgeTypeListManipulation: React.FC = observer( - ({ edgeName, edgeIndex, switchIsEditEdge }) => { - const { edgeTypeStore } = useContext(MetadataConfigsRootStore); - const { t } = useTranslation(); - const [isPopDeleteModal, switchPopDeleteModal] = useState(false); - const [isDeleting, switchDeleting] = useState(false); - const deleteWrapperRef = useRef(null); - const isDeleteOrBatchDeleting = - isDeleting || - (edgeTypeStore.requestStatus.deleteEdgeType === 'pending' && - edgeTypeStore.selectedEdgeTypeNames.includes(edgeName)); - - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - if ( - isPopDeleteModal && - deleteWrapperRef && - deleteWrapperRef.current && - !deleteWrapperRef.current.contains(e.target as Element) - ) { - switchPopDeleteModal(false); - } - }, - [deleteWrapperRef, isPopDeleteModal] - ); - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - return ( -
- { - edgeTypeStore.selectEdgeType(edgeIndex); - edgeTypeStore.validateEditEdgeType(true); - switchIsEditEdge(true); - - edgeTypeStore.mutateEditedSelectedEdgeType({ - ...edgeTypeStore.editedSelectedEdgeType, - style: { - color: edgeTypeStore.selectedEdgeType!.style.color, - icon: null, - with_arrow: edgeTypeStore.selectedEdgeType!.style.with_arrow, - thickness: edgeTypeStore.selectedEdgeType!.style.thickness, - display_fields: edgeTypeStore.selectedEdgeType!.style - .display_fields - } - }); - }} - > - {t('addition.common.edit')} - -
- {isDeleteOrBatchDeleting && ( - - )} - -

- {t('addition.edge.confirm-del-edge-type')} -

-

{t('addition.edge.confirm-del-edge-type-again')}

-

{t('addition.message.long-time-notice')}

-
- - -
-
- } - childrenProps={{ - className: 'metadata-properties-manipulation', - title: isDeleteOrBatchDeleting - ? t('addition.operate.del-ing') - : t('addition.common.del'), - onClick() { - if (isDeleteOrBatchDeleting) { - return; - } - - switchPopDeleteModal(true); - } - }} - > - {isDeleteOrBatchDeleting - ? t('addition.operate.del-ing') - : t('addition.common.del')} - -
- - ); - } -); - -const EmptyEdgeTypeHints: React.FC = observer(() => { - const { edgeTypeStore } = useContext(MetadataConfigsRootStore); - const { t } = useTranslation(); - return ( -
- Add new property -
- {t('addition.edge.no-edge-desc')} -
-
- - -
-
- ); -}); - -export default EdgeTypeList; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.less deleted file mode 100644 index db945395a..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.less +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.new-edge-type-wrapper { - width: 100%; - background: #fff; - margin-top: 16px; - padding: 16px; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.tsx deleted file mode 100644 index 4864443af..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/NewEdgeType.tsx +++ /dev/null @@ -1,1099 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import classnames from 'classnames'; -import { isUndefined, cloneDeep } from 'lodash-es'; -import { - Input, - Select, - Button, - Switch, - Tooltip, - Checkbox, - Message -} from 'hubble-ui'; - -import { Tooltip as CustomTooltip } from '../../../common'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { formatVertexIdText } from '../../../../stores/utils'; - -import type { EdgeTypeValidatePropertyIndexes } from '../../../../stores/types/GraphManagementStore/metadataConfigsStore'; - -import HintIcon from '../../../../assets/imgs/ic_question_mark.svg'; -import BlueArrowIcon from '../../../../assets/imgs/ic_arrow_blue.svg'; -import SelectedSoilidArrowIcon from '../../../../assets/imgs/ic_arrow_selected.svg'; -import NoSelectedSoilidArrowIcon from '../../../../assets/imgs/ic_arrow.svg'; -import SelectedSoilidStraightIcon from '../../../../assets/imgs/ic_straight_selected.svg'; -import NoSelectedSoilidStraightIcon from '../../../../assets/imgs/ic_straight.svg'; -import closeIcon from '../../../../assets/imgs/ic_close_16.svg'; -import { useTranslation } from 'react-i18next'; - -const NewVertexType: React.FC = observer(() => { - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const { t } = useTranslation(); - const { metadataPropertyStore, vertexTypeStore, edgeTypeStore } = useContext( - MetadataConfigsRootStore - ); - const [isAddNewProperty, switchIsAddNewProperty] = useState(false); - const [deletePopIndex, setDeletePopIndex] = useState(null); - const dropdownWrapperRef = useRef(null); - const deleteWrapperRef = useRef(null); - - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - if ( - isAddNewProperty && - dropdownWrapperRef.current && - !dropdownWrapperRef.current.contains(e.target as Element) - ) { - switchIsAddNewProperty(false); - } - - if ( - deletePopIndex && - deleteWrapperRef.current && - !deleteWrapperRef.current.contains(e.target as Element) - ) { - setDeletePopIndex(null); - } - }, - [deletePopIndex, isAddNewProperty] - ); - - useEffect(() => { - metadataPropertyStore.fetchMetadataPropertyList({ fetchAll: true }); - vertexTypeStore.fetchVertexTypeList({ fetchAll: true }); - edgeTypeStore.validateAllNewEdgeType(true); - }, [edgeTypeStore, metadataPropertyStore, vertexTypeStore]); - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - return ( -
-
-
- {t('addition.menu.base-info')} -
-
-
- * - {t('addition.common.edge-type-name')}: -
- { - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - name: e.value - }); - }} - originInputProps={{ - onBlur() { - edgeTypeStore.validateAllNewEdgeType(true); - edgeTypeStore.validateNewEdgeType('name'); - } - }} - /> -
-
-
- * - {t('addition.common.edge-style')}: -
-
- -
-
- -
-
- -
-
- -
-
- * - {t('addition.common.source-type')}: -
- -
-
-
- * - {t('addition.common.target-type')}: -
- -
-
-
- * - {t('addition.common.allow-multiple-connections')}: - - hint - -
- { - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - link_multi_times: checked - }); - }} - /> -
-
-
- {edgeTypeStore.newEdgeType.link_multi_times && ( - * - )} - {t('addition.common.association-property')}: -
-
- {edgeTypeStore.newEdgeType.properties.length !== 0 && ( -
-
-
{t('addition.common.property')}
-
{t('addition.common.allow-null')}
-
- {edgeTypeStore.newEdgeType.properties.map((property, index) => { - const currentProperties = cloneDeep( - edgeTypeStore.newEdgeType.properties - ); - - return ( -
-
{property.name}
-
- { - currentProperties[index].nullable = - !currentProperties[index].nullable; - - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - properties: currentProperties - }); - - // remove primary keys since it could be empty value - if (checked) { - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - sort_keys: - edgeTypeStore.newEdgeType.sort_keys.filter( - (key) => key !== property.name - ) - }); - } - }} - size="large" - /> -
-
- ); - })} -
- )} -
{ - switchIsAddNewProperty(!isAddNewProperty); - }} - > - {t('addition.common.add-property')} - toggleAddProperty -
-
-
- {isAddNewProperty && ( -
-
-
- {metadataPropertyStore.metadataProperties.map((property) => ( -
- - propertyIndex === property.name - ) !== -1 - } - onChange={() => { - const addedPropertiesIndexInSelectedEdgeType = - edgeTypeStore.addedPropertiesInSelectedEdgeType; - - addedPropertiesIndexInSelectedEdgeType.has( - property.name - ) - ? addedPropertiesIndexInSelectedEdgeType.delete( - property.name - ) - : addedPropertiesIndexInSelectedEdgeType.add( - property.name - ); - - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - properties: [ - ...addedPropertiesIndexInSelectedEdgeType - ].map((propertyName) => { - const currentProperty = - edgeTypeStore.newEdgeType.properties.find( - ({ name }) => name === propertyName - ); - - return { - name: propertyName, - nullable: !isUndefined(currentProperty) - ? currentProperty.nullable - : true - }; - }) - }); - - edgeTypeStore.validateAllNewEdgeType(true); - edgeTypeStore.validateNewEdgeType('properties'); - }} - > - {property.name} - - -
- ))} -
-
- )} - - {edgeTypeStore.newEdgeType.link_multi_times && ( -
-
- * - {t('addition.common.distinguishing-key')}: -
- -
- )} - -
-
- * - {t('addition.edge.display-content')}: -
- -
- -
- - {t('addition.edge.index-info')} - - - hint - -
-
-
- * - {t('addition.menu.type-index')}: -
- { - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - open_label_index: checked - }); - }} - /> -
- -
-
- {t('addition.common.property-index')}: -
-
- {edgeTypeStore.newEdgeType.property_indexes.length !== 0 && ( -
-
- {t('addition.edge.index-name')} -
-
- {t('addition.edge.index-type')} -
-
{t('addition.common.property')}
-
- )} - {edgeTypeStore.newEdgeType.property_indexes.map( - ({ name, type, fields }, index) => ( -
-
- { - const propertyIndexEntities = cloneDeep( - edgeTypeStore.newEdgeType.property_indexes - ); - - propertyIndexEntities[index].name = e.value; - - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - property_indexes: propertyIndexEntities - }); - }} - originInputProps={{ - onBlur() { - // check is ready to create - edgeTypeStore.validateAllNewEdgeType(true); - edgeTypeStore.validateNewEdgeType('propertyIndexes'); - } - }} - /> -
-
- -
-
- -
- -

- {t('addition.message.property-del-confirm')} -

-

- {t('addition.message.index-del-confirm')} -

-
-
{ - const propertyIndexEntities = cloneDeep( - edgeTypeStore.newEdgeType.property_indexes - ); - - propertyIndexEntities.splice(index, 1); - - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - property_indexes: propertyIndexEntities - }); - - edgeTypeStore.validateAllNewEdgeType(true); - edgeTypeStore.validateNewEdgeType( - 'propertyIndexes' - ); - }} - > - {t('addition.common.confirm')} -
-
{ - setDeletePopIndex(null); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: closeIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeletePopIndex(index); - } - }} - childrenWrapperElement="img" - /> -
- ) - )} - { - if ( - edgeTypeStore.newEdgeType.property_indexes.length === 0 || - edgeTypeStore.isAddNewPropertyIndexReady - ) { - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - property_indexes: [ - ...edgeTypeStore.newEdgeType.property_indexes, - { - name: '', - type: '', - fields: [] - } - ] - }); - - edgeTypeStore.validateAllNewEdgeType(true); - // set isAddNewPropertyIndexReady to false - edgeTypeStore.validateNewEdgeType('propertyIndexes', true); - } - }} - style={{ - cursor: 'pointer', - color: edgeTypeStore.isAddNewPropertyIndexReady - ? '#2b65ff' - : '#999', - lineHeight: '32px' - }} - > - {t('addition.edge.add-group')} - -
-
- -
-
- - -
-
- - ); -}); - -export default NewVertexType; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.less deleted file mode 100644 index 71698137e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.less +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.reuse-properties-wrapper { - width: 100%; - background: #fff; - margin-top: 16px; - padding: 16px; - - .reuse-steps { - width: 860px; - margin: 16px auto 18px; - } - - .reuse-properties { - &-row { - display: flex; - align-items: center; - margin: 18px 0 32px; - font-size: 14px; - color: #333; - - &:last-child { - margin-bottom: 24px; - } - - &-name { - width: 98px; - text-align: right; - margin-right: 13.9px; - } - } - - &-manipulations { - display: flex; - justify-content: center; - margin-bottom: 88px; - } - - &-validate { - &-duplicate, - &-exist, - &-pass { - width: 58px; - margin: 0 auto; - border-radius: 2px; - letter-spacing: 0; - line-height: 22px; - text-align: center; - } - - &-duplicate { - background: #fff2f2; - border: 1px solid #ff9499; - color: #e64552; - } - - &-exist, - &-pass { - background: #f2fff4; - border: 1px solid #7ed988; - color: #39bf45; - } - } - - &-complete-hint { - display: flex; - flex-direction: column; - justify-content: center; - margin: 88px auto 327px; - - &-description { - display: flex; - justify-content: center; - - & > div { - margin-left: 20px; - } - } - - &-manipulations { - margin: 42px auto 0; - } - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.tsx deleted file mode 100644 index 6a462e4ad..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/ReuseEdgeTypes.tsx +++ /dev/null @@ -1,1237 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useState, useEffect } from 'react'; -import { observer } from 'mobx-react'; -import { - Select, - Steps, - Transfer, - Button, - Table, - Input, - Message -} from 'hubble-ui'; - -import { GraphManagementStoreContext } from '../../../../stores'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; - -import PassIcon from '../../../../assets/imgs/ic_pass.svg'; - -import './ReuseEdgeTypes.less'; -import { cloneDeep } from 'lodash-es'; -import { useTranslation } from 'react-i18next'; - -const ReuseEdgeTypes: React.FC = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const metadataConfigsRootStore = useContext(MetadataConfigsRootStore); - const { t } = useTranslation(); - const { edgeTypeStore } = metadataConfigsRootStore; - const [currentStatus, setCurrentStatus] = useState(1); - // acutally the name, not id in database - const [selectedId, mutateSelectedId] = useState<[] | string>([]); - const [selectedList, mutateSelectedList] = useState([]); - - // step 2 - const [edgeTypeEditIndex, setEdgeTypeEditIndex] = useState( - null - ); - const [vertexTypeEditIndex, setVertexTypeEditIndex] = useState( - null - ); - const [propertyEditIndex, setPropertyEditIndex] = useState( - null - ); - const [propertyIndexEditIndex, setPropertyIndexEditIndex] = useState< - number | null - >(null); - - // hack: need to call @observable at here to dispatch re-render by mobx - // since @action in onBlur() in doesn't dispatch re-render - edgeTypeStore.validateReuseErrorMessage.edgeType.toUpperCase(); - edgeTypeStore.validateReuseErrorMessage.vertexType.toUpperCase(); - edgeTypeStore.validateReuseErrorMessage.property.toUpperCase(); - edgeTypeStore.validateReuseErrorMessage.property_index.toUpperCase(); - - const edgeTypeColumnConfigs = [ - { - title: t('addition.common.edge-type-name'), - dataIndex: 'name', - width: '50%', - render(text: string, records: any, index: number) { - if (index !== edgeTypeEditIndex) { - return ( -
- {text} -
- ); - } - - return ( - { - edgeTypeStore.resetValidateReuseErrorMessage('edgeType'); - - const editedCheckedReusableData = cloneDeep( - edgeTypeStore.editedCheckedReusableData! - ); - - editedCheckedReusableData.edgelabel_conflicts[index].entity.name = - e.value; - - edgeTypeStore.mutateEditedReusableData(editedCheckedReusableData); - }} - originInputProps={{ - onBlur() { - edgeTypeStore.validateReuseData( - 'edgeType', - edgeTypeStore.checkedReusableData!.edgelabel_conflicts[index] - .entity.name, - edgeTypeStore.editedCheckedReusableData!.edgelabel_conflicts[ - index - ].entity.name - ); - } - }} - /> - ); - } - }, - { - title: t('addition.edge.verification-result'), - dataIndex: 'status', - width: '30%', - render(value: string, records: any, index: number) { - let classname = ''; - let text = ''; - - if (edgeTypeStore.reusableEdgeTypeNameChangeIndexes.has(index)) { - return ( -
- {t('addition.edge.be-verified')} -
- ); - } - - switch (value) { - case 'DUPNAME': - classname = classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.duplicate-name'); - break; - - case 'DEP_CONFLICT': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.dependency-conflict'); - break; - - case 'EXISTED': - classname = 'reuse-properties-validate-exist'; - text = t('addition.message.already-exist'); - break; - - case 'PASSED': - classname = 'reuse-properties-validate-pass'; - text = t('addition.message.pass'); - break; - } - - return ( -
- {text} -
- ); - } - }, - { - title: t('addition.operate.operate'), - dataIndex: 'manipulation', - width: '20%', - render(_: never, records: any, index: number) { - const originalName = edgeTypeStore.checkedReusableData! - .edgelabel_conflicts[index].entity.name; - const changedName = edgeTypeStore.editedCheckedReusableData! - .edgelabel_conflicts[index].entity.name; - const isChanged = changedName !== originalName; - - if (edgeTypeEditIndex === index) { - return ( -
- { - if ( - !isChanged || - !edgeTypeStore.validateReuseData( - 'edgeType', - originalName, - changedName - ) - ) { - return; - } - - edgeTypeStore.mutateReuseData( - 'edgeType', - originalName, - changedName - ); - setEdgeTypeEditIndex(null); - edgeTypeStore.mutateReusableEdgeTypeChangeIndexes(index); - }} - > - {t('addition.common.save')} - - { - edgeTypeStore.resetValidateReuseErrorMessage('edgeType'); - setEdgeTypeEditIndex(null); - edgeTypeStore.resetEditedReusableEdgeTypeName(index); - }} - > - {t('addition.common.cancel')} - -
- ); - } - - return ( -
- { - if (edgeTypeEditIndex !== null) { - return; - } - - setEdgeTypeEditIndex(index); - }} - > - {t('addition.operate.rename')} - - { - if (edgeTypeEditIndex !== null) { - return; - } - - setEdgeTypeEditIndex(null); - - // remove selected status of the property in - const newSelectedList = [...selectedList].filter( - (property) => - property !== - edgeTypeStore.editedCheckedReusableData! - .edgelabel_conflicts[index].entity.name - ); - - mutateSelectedList(newSelectedList); - - // notice: useState hooks cannot sync updated state value, so the length is still 1 - if (selectedList.length === 1) { - setCurrentStatus(1); - // remove edit status after return previous - edgeTypeStore.clearReusableNameChangeIndexes(); - return; - } - - edgeTypeStore.deleteReuseData('edgelabel_conflicts', index); - }} - > - {t('addition.common.del')} - -
- ); - } - } - ]; - - const vertexTypeColumnConfigs = [ - { - title: t('addition.common.vertex-name'), - dataIndex: 'name', - width: '50%', - render(text: string, records: any, index: number) { - if (index !== vertexTypeEditIndex) { - return text; - } - - return ( - { - edgeTypeStore.resetValidateReuseErrorMessage('vertexType'); - - const editedCheckedReusableData = cloneDeep( - edgeTypeStore.editedCheckedReusableData! - ); - - editedCheckedReusableData.vertexlabel_conflicts[ - index - ].entity.name = e.value; - - edgeTypeStore.mutateEditedReusableData(editedCheckedReusableData); - }} - originInputProps={{ - onBlur() { - edgeTypeStore.validateReuseData( - 'vertexType', - edgeTypeStore.checkedReusableData!.vertexlabel_conflicts[ - index - ].entity.name, - edgeTypeStore.editedCheckedReusableData! - .vertexlabel_conflicts[index].entity.name - ); - } - }} - /> - ); - } - }, - { - title: t('addition.edge.verification-result'), - dataIndex: 'status', - width: '30%', - render(value: string, records: any, index: number) { - let classname = ''; - let text = ''; - - if (edgeTypeStore.reusableVertexTypeNameChangeIndexes.has(index)) { - return ( -
- {t('addition.edge.be-verified')} -
- ); - } - - switch (value) { - case 'DUPNAME': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.duplicate-name'); - break; - - case 'DEP_CONFLICT': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.dependency-conflict'); - break; - - case 'EXISTED': - classname = 'reuse-properties-validate-exist'; - text = t('addition.message.already-exist'); - break; - - case 'PASSED': - classname = 'reuse-properties-validate-pass'; - text = t('addition.message.pass'); - break; - } - - return ( -
- {text} -
- ); - } - }, - { - title: t('addition.operate.operate'), - dataIndex: 'manipulation', - width: '20%', - render(_: never, records: any, index: number) { - const originalName = edgeTypeStore.checkedReusableData! - .vertexlabel_conflicts[index].entity.name; - const changedName = edgeTypeStore.editedCheckedReusableData! - .vertexlabel_conflicts[index].entity.name; - const isChanged = changedName !== originalName; - - if (index === vertexTypeEditIndex) { - return ( -
- { - if ( - !isChanged || - !edgeTypeStore.validateReuseData( - 'vertexType', - originalName, - changedName - ) - ) { - return; - } - - edgeTypeStore.mutateReuseData( - 'vertexType', - originalName, - changedName - ); - setVertexTypeEditIndex(null); - edgeTypeStore.mutateReusableVertexTypeChangeIndexes(index); - }} - > - {t('addition.common.save')} - - { - edgeTypeStore.resetValidateReuseErrorMessage('vertexType'); - setVertexTypeEditIndex(null); - edgeTypeStore.resetEditedReusableVertexTypeName(index); - }} - > - {t('addition.common.cancel')} - -
- ); - } - - return ( -
- { - if (vertexTypeEditIndex !== null) { - return; - } - - setVertexTypeEditIndex(index); - }} - > - {t('addition.operate.rename')} - -
- ); - } - } - ]; - - const metadataPropertyColumnConfigs = [ - { - title: t('addition.common.property-name'), - dataIndex: 'name', - width: '50%', - render(text: string, records: any, index: number) { - if (propertyEditIndex !== index) { - return text; - } - - return ( - { - edgeTypeStore.resetValidateReuseErrorMessage('property'); - - const editedCheckedReusableData = cloneDeep( - edgeTypeStore.editedCheckedReusableData! - ); - - editedCheckedReusableData.propertykey_conflicts[ - index - ].entity.name = e.value; - - edgeTypeStore.mutateEditedReusableData(editedCheckedReusableData); - }} - originInputProps={{ - onBlur() { - edgeTypeStore.validateReuseData( - 'property', - edgeTypeStore.checkedReusableData!.propertykey_conflicts[ - index - ].entity.name, - edgeTypeStore.editedCheckedReusableData! - .propertykey_conflicts[index].entity.name - ); - } - }} - /> - ); - } - }, - { - title: t('addition.common.data-type'), - dataIndex: 'data_type', - width: '15%', - render(text: string) { - if (text === 'TEXT') { - return 'string'; - } - - return text.toLowerCase(); - } - }, - { - title: t('addition.edge.verification-result'), - dataIndex: 'status', - align: 'center', - width: '15%', - render(value: string, records: any, index: number) { - let classname = ''; - let text = ''; - - if (edgeTypeStore.reusablePropertyNameChangeIndexes.has(index)) { - return ( -
- {t('addition.edge.be-verified')} -
- ); - } - - switch (value) { - case 'DUPNAME': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.duplicate-name'); - break; - - case 'DEP_CONFLICT': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.dependency-conflict'); - break; - - case 'EXISTED': - classname = 'reuse-properties-validate-exist'; - text = t('addition.message.already-exist'); - break; - - case 'PASSED': - classname = 'reuse-properties-validate-pass'; - text = t('addition.message.pass'); - break; - } - - return
{text}
; - } - }, - { - title: t('addition.operate.operate'), - dataIndex: 'manipulation', - width: '20%', - render(_: never, records: any, index: number) { - if (index === propertyEditIndex) { - const originalName = edgeTypeStore.checkedReusableData! - .propertykey_conflicts[index].entity.name; - const changedName = edgeTypeStore.editedCheckedReusableData! - .propertykey_conflicts[index].entity.name; - const isChanged = changedName !== originalName; - - return ( -
- { - if ( - !isChanged || - !edgeTypeStore.validateReuseData( - 'property', - originalName, - changedName - ) - ) { - return; - } - - edgeTypeStore.mutateReuseData( - 'property', - originalName, - changedName - ); - setPropertyEditIndex(null); - edgeTypeStore.mutateReusablePropertyNameChangeIndexes(index); - }} - > - {t('addition.common.save')} - - { - edgeTypeStore.resetValidateReuseErrorMessage('property'); - setPropertyEditIndex(null); - edgeTypeStore.resetEditedReusablePropertyName(index); - }} - > - {t('addition.common.cancel')} - -
- ); - } - - return ( -
- { - if (propertyEditIndex !== null) { - return; - } - - setPropertyEditIndex(index); - }} - > - {t('addition.operate.rename')} - - { - if (propertyEditIndex !== null) { - return; - } - - setPropertyEditIndex(null); - - edgeTypeStore.deleteReuseData('propertykey_conflicts', index); - }} - > - {t('addition.common.del')} - -
- ); - } - } - ]; - - const metadataPropertyIndexColumnConfigs = [ - { - title: t('addition.common.property-index-name'), - dataIndex: 'name', - width: '50%', - render(text: string, records: any, index: number) { - if (index !== propertyIndexEditIndex) { - return text; - } - - return ( - { - edgeTypeStore.resetValidateReuseErrorMessage('property_index'); - - const editedCheckedReusableData = cloneDeep( - edgeTypeStore.editedCheckedReusableData! - ); - - editedCheckedReusableData.propertyindex_conflicts[ - index - ].entity.name = e.value; - - edgeTypeStore.mutateEditedReusableData(editedCheckedReusableData); - }} - originInputProps={{ - onBlur() { - edgeTypeStore.validateReuseData( - 'property_index', - edgeTypeStore.checkedReusableData!.propertyindex_conflicts[ - index - ].entity.name, - edgeTypeStore.editedCheckedReusableData! - .propertyindex_conflicts[index].entity.name - ); - } - }} - /> - ); - } - }, - { - title: t('addition.common.corresponding-type'), - dataIndex: 'owner', - width: '15%' - }, - { - title: t('addition.edge.verification-result'), - dataIndex: 'status', - align: 'center', - width: '15%', - render(value: string, records: any, index: number) { - let classname = ''; - let text = ''; - - if (edgeTypeStore.reusablePropertyIndexNameChangeIndexes.has(index)) { - return ( -
- {t('addition.edge.be-verified')} -
- ); - } - - switch (value) { - case 'DUPNAME': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.duplicate-name'); - break; - - case 'DEP_CONFLICT': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.dependency-conflict'); - break; - - case 'EXISTED': - classname = 'reuse-properties-validate-exist'; - text = t('addition.message.already-exist'); - break; - - case 'PASSED': - classname = 'reuse-properties-validate-pass'; - text = t('addition.message.pass'); - break; - } - - return
{text}
; - } - }, - { - title: t('addition.operate.operate'), - dataIndex: 'manipulation', - width: '20%', - render(_: never, records: any, index: number) { - if (index === propertyIndexEditIndex) { - const originalName = edgeTypeStore.checkedReusableData! - .propertyindex_conflicts[index].entity.name; - const changedName = edgeTypeStore.editedCheckedReusableData! - .propertyindex_conflicts[index].entity.name; - const isChanged = changedName !== originalName; - - return ( -
- { - if ( - !isChanged || - !edgeTypeStore.validateReuseData( - 'property_index', - originalName, - changedName - ) - ) { - return; - } - - edgeTypeStore.mutateReuseData( - 'property_index', - originalName, - changedName - ); - setPropertyIndexEditIndex(null); - edgeTypeStore.mutateReusableVertexTypeChangeIndexes(index); - }} - > - {t('addition.common.save')} - - { - edgeTypeStore.resetValidateReuseErrorMessage( - 'property_index' - ); - setPropertyIndexEditIndex(null); - edgeTypeStore.resetEditedReusablePropertyIndexName(index); - }} - > - {t('addition.common.cancel')} - -
- ); - } - - return ( -
- { - if (propertyIndexEditIndex !== null) { - return; - } - - setPropertyIndexEditIndex(index); - }} - > - {t('addition.operate.rename')} - - { - if (propertyIndexEditIndex !== null) { - return; - } - - setPropertyIndexEditIndex(null); - - edgeTypeStore.deleteReuseData('propertyindex_conflicts', index); - }} - > - {t('addition.common.del')} - -
- ); - } - } - ]; - - useEffect(() => { - // unlike metadata properties, all vertex types only needs here(in reuse) - edgeTypeStore.fetchEdgeTypeList({ fetchAll: true }); - }, [edgeTypeStore]); - - return ( -
-
- {t('addition.edge.multiplexing-edge-type')} -
-
- {t('addition.edge.multiplexing-edge-type-notice')} -
-
- - {[ - t('addition.menu.select-reuse-item'), - t('addition.menu.confirm-reuse-item'), - t('addition.menu.complete-reuse') - ].map((title: string, index: number) => ( - index + 1 - ? 'finish' - : 'wait' - } - key={title} - /> - ))} - - - {currentStatus === 1 && ( - <> -
-
- * - {t('addition.newGraphConfig.id')}: -
- -
-
-
- * - {t('addition.edge.multiplexing-edge-type')}: -
- name - )} - selectedList={selectedList} - showSearchBox={false} - candidateTreeStyle={{ - width: 359, - fontSize: 14 - }} - selectedTreeStyle={{ - width: 359, - fontSize: 14 - }} - handleSelect={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - handleSelectAll={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - handleDelete={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - handleDeleteAll={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - /> -
-
- - -
- - )} - - {currentStatus === 2 && ( - <> -
- {t('addition.common.selected-edge-type')} -
-
({ - name: entity.name, - status - }) - ) - : [] - } - pagination={false} - /> - -
- {t('addition.common.selected-vertex-type')} -
-
({ - name: entity.name, - status - }) - ) - : [] - } - pagination={false} - /> - -
- {t('addition.common.selected-property')} -
-
({ - name: entity.name, - data_type: entity.data_type, - status - }) - ) - : [] - } - pagination={false} - /> - -
- {t('addition.common.selected-property-index')} -
-
({ - name: entity.name, - owner: entity.owner, - status - }) - ) - : [] - } - pagination={false} - /> - -
- - -
- - )} - - {currentStatus === 3 && ( -
-
- {t('addition.message.reuse-complete')} -
-
{t('addition.message.reuse-complete')}
-
{t('addition.message.vertex-type-reuse-success')}
-
-
-
- - -
-
- )} - - - ); -}); - -export default ReuseEdgeTypes; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/index.ts deleted file mode 100644 index 2326af6d4..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/edge-type/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import NewEdgeType from './NewEdgeType'; -import EdgeTypeList from './EdgeTypeList'; - -export { NewEdgeType, EdgeTypeList }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckAndEditEdge.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckAndEditEdge.tsx deleted file mode 100644 index 2ff3edae7..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckAndEditEdge.tsx +++ /dev/null @@ -1,1415 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import classnames from 'classnames'; -import { cloneDeep, merge, isUndefined, isEmpty } from 'lodash-es'; -import { - Drawer, - Button, - Input, - Select, - Switch, - Checkbox, - Message -} from 'hubble-ui'; - -import { Tooltip } from '../../../common'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; -import { - mapMetadataProperties, - generateGraphModeId, - formatVertexIdText, - edgeWidthMapping -} from '../../../../stores/utils'; - -import type { EdgeTypeValidatePropertyIndexes } from '../../../../stores/types/GraphManagementStore/metadataConfigsStore'; - -import BlueArrowIcon from '../../../../assets/imgs/ic_arrow_blue.svg'; -import CloseIcon from '../../../../assets/imgs/ic_close_16.svg'; -import SelectedSoilidArrowIcon from '../../../../assets/imgs/ic_arrow_selected.svg'; -import NoSelectedSoilidArrowIcon from '../../../../assets/imgs/ic_arrow.svg'; -import SelectedSoilidStraightIcon from '../../../../assets/imgs/ic_straight_selected.svg'; -import NoSelectedSoilidStraightIcon from '../../../../assets/imgs/ic_straight.svg'; -import i18next from '../../../../i18n'; -import { useTranslation } from 'react-i18next'; - -const propertyIndexTypeMappings: Record = { - SECONDARY: i18next.t('addition.menu.secondary-index'), - RANGE: i18next.t('addition.menu.range-index'), - SEARCH: i18next.t('addition.menu.full-text-index') -}; - -const CheckAndEditEdge: React.FC = observer(() => { - const { metadataPropertyStore, edgeTypeStore, graphViewStore } = useContext( - MetadataConfigsRootStore - ); - const { t } = useTranslation(); - const [isAddProperty, switchIsAddProperty] = useState(false); - const [isDeletePop, switchDeletePop] = useState(false); - const [ - deleteExistPopIndexInDrawer, - setDeleteExistPopIndexInDrawer - ] = useState(null); - const [ - deleteAddedPopIndexInDrawer, - setDeleteAddedPopIndexInDrawer - ] = useState(null); - - const deleteWrapperRef = useRef(null); - const dropdownWrapperRef = useRef(null); - const deleteWrapperInDrawerRef = useRef(null); - - const isEditEdge = graphViewStore.currentDrawer === 'edit-edge'; - - const metadataDrawerOptionClass = classnames({ - 'metadata-drawer-options': true, - 'metadata-drawer-options-disabled': isEditEdge - }); - - // need useCallback to stop infinite callings of useEffect - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - const drawerWrapper = document.querySelector( - '.new-fc-one-drawer-content-wrapper' - ); - - if ( - graphViewStore.currentDrawer === 'check-edge' && - drawerWrapper && - !drawerWrapper.contains(e.target as Element) - ) { - /* - handleOutSideClick is being called after the value assignment of data and drawer-name, - we need to judge whether a node or edge is being clicked - */ - if (graphViewStore.isNodeOrEdgeClicked) { - // if node/edge is clicked, reset state and prepare for next outside clicks - graphViewStore.switchNodeOrEdgeClicked(false); - } else { - graphViewStore.setCurrentDrawer(''); - } - } - - if ( - isEditEdge && - isAddProperty && - dropdownWrapperRef.current && - !dropdownWrapperRef.current.contains(e.target as Element) - ) { - switchIsAddProperty(false); - return; - } - - if ( - isDeletePop !== null && - deleteWrapperRef.current && - !deleteWrapperRef.current.contains(e.target as Element) - ) { - switchDeletePop(false); - } - }, - [graphViewStore, isEditEdge, isAddProperty, isDeletePop] - ); - - const handleCloseDrawer = () => { - switchIsAddProperty(false); - graphViewStore.setCurrentDrawer(''); - edgeTypeStore.selectEdgeType(null); - // clear mutations in - edgeTypeStore.resetEditedSelectedEdgeType(); - }; - - const handleDeleteEdge = async () => { - // cache vertex name here before it gets removed - const edgeName = edgeTypeStore.selectedEdgeType!.name; - const edgeId = generateGraphModeId( - edgeName, - edgeTypeStore.selectedEdgeType!.source_label, - edgeTypeStore.selectedEdgeType!.target_label - ); - const edgeInfo = graphViewStore.visDataSet!.edges.get(edgeName); - - switchDeletePop(false); - handleCloseDrawer(); - - graphViewStore.visDataSet!.edges.remove(edgeId); - - await edgeTypeStore.deleteEdgeType([edgeName]); - - if (edgeTypeStore.requestStatus.deleteEdgeType === 'success') { - Message.success({ - content: t('addition.common.del-success'), - size: 'medium', - showCloseIcon: false - }); - - edgeTypeStore.fetchEdgeTypeList({ fetchAll: true }); - } - - if (edgeTypeStore.requestStatus.deleteEdgeType === 'failed') { - Message.error({ - content: edgeTypeStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - - // if failed, re-add edge - graphViewStore.visDataSet?.edges.add(edgeInfo); - } - }; - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - if (edgeTypeStore.selectedEdgeType === null) { - return null; - } - - return ( - { - if (!isEditEdge) { - graphViewStore.setCurrentDrawer('edit-edge'); - edgeTypeStore.validateEditEdgeType(); - } else { - const id = generateGraphModeId( - edgeTypeStore.selectedEdgeType!.name, - edgeTypeStore.selectedEdgeType!.source_label, - edgeTypeStore.selectedEdgeType!.target_label - ); - const updateInfo: Record = {}; - - if ( - !isEmpty(edgeTypeStore.editedSelectedEdgeType.append_properties) - ) { - const mappedProperties = mapMetadataProperties( - edgeTypeStore.selectedEdgeType!.properties, - metadataPropertyStore.metadataProperties - ); - - const newMappedProperties = mapMetadataProperties( - edgeTypeStore.editedSelectedEdgeType.append_properties, - metadataPropertyStore.metadataProperties - ); - - const mergedProperties = merge( - mappedProperties, - newMappedProperties - ); - - updateInfo.title = ` - - - ${Object.entries(mergedProperties) - .map(([key, value]) => { - const convertedValue = - value.toLowerCase() === 'text' - ? 'string' - : value.toLowerCase(); - - return ``; - }) - .join('')} - `; - } - - if (edgeTypeStore.editedSelectedEdgeType.style.color !== null) { - updateInfo.color = { - color: edgeTypeStore.editedSelectedEdgeType.style.color, - highlight: edgeTypeStore.editedSelectedEdgeType.style.color, - hover: edgeTypeStore.editedSelectedEdgeType.style.color - }; - } - - if ( - edgeTypeStore.editedSelectedEdgeType.style.with_arrow !== null - ) { - updateInfo.arrows = - edgeTypeStore.editedSelectedEdgeType.style.with_arrow === true - ? 'to' - : ''; - } - - if ( - edgeTypeStore.editedSelectedEdgeType.style.thickness !== null - ) { - updateInfo.value = - edgeWidthMapping[ - edgeTypeStore.editedSelectedEdgeType.style.thickness - ]; - } - - if (!isEmpty(updateInfo)) { - updateInfo.id = id; - - graphViewStore.visDataSet!.edges.update(updateInfo); - } - await edgeTypeStore.updateEdgeType(); - - if (edgeTypeStore.requestStatus.updateEdgeType === 'failed') { - Message.error({ - content: edgeTypeStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - - return; - } - - if (edgeTypeStore.requestStatus.updateEdgeType === 'success') { - Message.success({ - content: t('addition.operate.modify-success'), - size: 'medium', - showCloseIcon: false - }); - } - - handleCloseDrawer(); - graphViewStore.visNetwork!.unselectAll(); - edgeTypeStore.fetchEdgeTypeList({ fetchAll: true }); - } - }} - key="drawer-manipulation" - > - {isEditEdge ? t('addition.common.save') : t('addition.common.edit')} - , - -

- {t('addition.edge.confirm-del-edge-type')} -

-

{t('addition.edge.confirm-del-edge-careful-notice')}

-

{t('addition.message.long-time-notice')}

-
-
- {t('addition.common.confirm')} -
-
{ - switchDeletePop(false); - }} - > - {t('addition.common.cancel')} -
-
- - } - childrenProps={{ - onClick() { - if (isEditEdge) { - handleCloseDrawer(); - return; - } - - switchDeletePop(true); - } - }} - > - -
- ]} - > -
-
-
- {t('addition.menu.base-info')} -
-
-
- {t('addition.common.edge-type-name')}: -
-
- {edgeTypeStore.selectedEdgeType!.name} -
-
- -
-
- - {t('addition.common.edge-style')}: - -
-
- -
-
- -
-
- -
-
-
-
- {t('addition.common.source-type')}: -
-
- {edgeTypeStore.selectedEdgeType!.source_label} -
-
-
-
- {t('addition.common.target-type')}: -
-
- {edgeTypeStore.selectedEdgeType!.target_label} -
-
-
-
- {t('addition.common.allow-multiple-connections')}: -
- -
-
-
- {t('addition.common.association-property')}: -
-
-
- {t('addition.common.property')} - {t('addition.common.allow-null')} -
- {edgeTypeStore.selectedEdgeType!.properties.map( - ({ name, nullable }) => ( -
-
{name}
-
- -
-
- ) - )} - {isEditEdge && - edgeTypeStore.editedSelectedEdgeType.append_properties.map( - ({ name }) => ( -
-
{name}
-
- -
-
- ) - )} - {isEditEdge && ( -
{ - switchIsAddProperty(!isAddProperty); - }} - > - - {t('addition.common.add-property')} - - toogleAddProperties -
- )} - {isEditEdge && isAddProperty && ( -
- {metadataPropertyStore.metadataProperties - .filter( - (property) => - edgeTypeStore.selectedEdgeType!.properties.find( - ({ name }) => name === property.name - ) === undefined - ) - .map((property) => ( -
- - - propertyIndex === property.name - ) !== -1 - } - onChange={() => { - const addedPropertiesInSelectedVertextType = - edgeTypeStore.addedPropertiesInSelectedEdgeType; - - addedPropertiesInSelectedVertextType.has( - property.name - ) - ? addedPropertiesInSelectedVertextType.delete( - property.name - ) - : addedPropertiesInSelectedVertextType.add( - property.name - ); - - edgeTypeStore.mutateEditedSelectedEdgeType({ - ...edgeTypeStore.editedSelectedEdgeType, - append_properties: [ - ...addedPropertiesInSelectedVertextType - ].map((propertyName) => { - const currentProperty = edgeTypeStore.newEdgeType.properties.find( - ({ name }) => name === propertyName - ); - - return { - name: propertyName, - nullable: !isUndefined(currentProperty) - ? currentProperty.nullable - : true - }; - }) - }); - }} - > - {property.name} - - -
- ))} -
- )} -
-
- -
-
- {t('addition.common.distinguishing-key-property')}: -
-
- {edgeTypeStore.selectedEdgeType!.sort_keys.join(';')} -
-
- -
-
- - {t('addition.edge.display-content')}: - -
- {isEditEdge ? ( - - ) : ( -
- {edgeTypeStore.selectedEdgeType?.style.display_fields - .map((field) => - formatVertexIdText( - field, - t('addition.function-parameter.edge-type') - ) - ) - .join('-')} -
- )} -
- -
- {t('addition.edge.index-info')} -
-
-
- {t('addition.menu.type-index')}: -
- -
-
-
- {t('addition.common.property-index')}: -
-
- {(edgeTypeStore.selectedEdgeType!.property_indexes.length !== 0 || - edgeTypeStore.editedSelectedEdgeType.append_property_indexes - .length !== 0) && ( -
- {t('addition.edge.index-name')} - {t('addition.edge.index-type')} - {t('addition.common.property')} -
- )} - {edgeTypeStore - .selectedEdgeType!.property_indexes.filter((propertyIndex) => - isUndefined( - edgeTypeStore.editedSelectedEdgeType.remove_property_indexes.find( - (removedPropertyName) => - removedPropertyName === propertyIndex.name - ) - ) - ) - .map(({ name, type, fields }, index) => { - return ( -
-
{name}
-
{propertyIndexTypeMappings[type]}
-
- - {fields - .map((field, index) => index + 1 + '.' + field) - .join(';')} - - - {isEditEdge && ( - -

- {t('addition.message.property-del-confirm')} -

-

- {t('addition.message.index-del-confirm')} -

-
-
{ - const removedPropertyIndex = cloneDeep( - edgeTypeStore.editedSelectedEdgeType - .remove_property_indexes - ); - - removedPropertyIndex.push( - edgeTypeStore.selectedEdgeType! - .property_indexes[index].name - ); - - edgeTypeStore.mutateEditedSelectedEdgeType( - { - ...edgeTypeStore.editedSelectedEdgeType, - remove_property_indexes: removedPropertyIndex - } - ); - - setDeleteExistPopIndexInDrawer(null); - edgeTypeStore.validateEditEdgeType(true); - }} - > - {t('addition.common.confirm')} -
-
{ - setDeleteExistPopIndexInDrawer(null); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: CloseIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeleteExistPopIndexInDrawer(index); - } - }} - childrenWrapperElement="img" - /> - )} -
-
- ); - })} - {edgeTypeStore.editedSelectedEdgeType.append_property_indexes.map( - ({ name, type, fields }, index) => { - return ( -
-
- { - const propertyIndexEntities = cloneDeep( - edgeTypeStore.editedSelectedEdgeType - .append_property_indexes - ); - - propertyIndexEntities[index].name = e.value; - - edgeTypeStore.mutateEditedSelectedEdgeType({ - ...edgeTypeStore.editedSelectedEdgeType, - append_property_indexes: propertyIndexEntities - }); - }} - originInputProps={{ - onBlur() { - // check is ready to create - edgeTypeStore.validateEditEdgeType(); - } - }} - /> -
-
- -
-
- - - -

- {t('addition.message.property-del-confirm')} -

-

- {t('addition.message.index-del-confirm')} -

-
-
{ - const appendPropertyIndexes = cloneDeep( - edgeTypeStore.editedSelectedEdgeType! - .append_property_indexes - ); - - appendPropertyIndexes.splice(index, 1); - - edgeTypeStore.mutateEditedSelectedEdgeType({ - ...edgeTypeStore.editedSelectedEdgeType, - append_property_indexes: appendPropertyIndexes - }); - - setDeleteAddedPopIndexInDrawer(null); - edgeTypeStore.validateEditEdgeType(true); - }} - > - {t('addition.common.confirm')} -
-
{ - edgeTypeStore.resetEditedSelectedEdgeType(); - setDeleteAddedPopIndexInDrawer(null); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: CloseIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeleteAddedPopIndexInDrawer(index); - } - }} - childrenWrapperElement="img" - /> -
-
- ); - } - )} - {isEditEdge && ( -
{ - if ( - edgeTypeStore.editedSelectedEdgeType - .append_property_indexes.length === 0 || - edgeTypeStore.isEditReady - ) { - edgeTypeStore.mutateEditedSelectedEdgeType({ - ...edgeTypeStore.editedSelectedEdgeType, - append_property_indexes: [ - ...edgeTypeStore.editedSelectedEdgeType - .append_property_indexes, - { - name: '', - type: '', - fields: [] - } - ] - }); - - edgeTypeStore.validateEditEdgeType(true); - } - }} - style={{ - cursor: 'pointer', - color: edgeTypeStore.isEditReady ? '#2b65ff' : '#999' - }} - > - {t('addition.edge.add-group')} -
- )} -
-
- - -
- ); -}); - -export default CheckAndEditEdge; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckAndEditVertex.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckAndEditVertex.tsx deleted file mode 100644 index c8a064209..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckAndEditVertex.tsx +++ /dev/null @@ -1,1310 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import classnames from 'classnames'; -import { cloneDeep, isUndefined, merge, isEmpty } from 'lodash-es'; -import { - Drawer, - Button, - Input, - Select, - Switch, - Checkbox, - Message -} from 'hubble-ui'; - -import { Tooltip } from '../../../common'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; -import { - mapMetadataProperties, - formatVertexIdText, - vertexRadiusMapping -} from '../../../../stores/utils'; - -import type { - VertexTypeValidatePropertyIndexes, - VertexTypeProperty -} from '../../../../stores/types/GraphManagementStore/metadataConfigsStore'; - -import BlueArrowIcon from '../../../../assets/imgs/ic_arrow_blue.svg'; -import CloseIcon from '../../../../assets/imgs/ic_close_16.svg'; -import i18next from '../../../../i18n'; -import { useTranslation } from 'react-i18next'; - -const IDStrategyMappings: Record = { - PRIMARY_KEY: i18next.t('addition.constant.primary-key-id'), - AUTOMATIC: i18next.t('addition.constant.automatic-generation'), - CUSTOMIZE_STRING: i18next.t('addition.constant.custom-string'), - CUSTOMIZE_NUMBER: i18next.t('addition.constant.custom-number'), - CUSTOMIZE_UUID: i18next.t('addition.constant.custom-uuid') -}; - -const propertyIndexTypeMappings: Record = { - SECONDARY: i18next.t('addition.menu.secondary-index'), - RANGE: i18next.t('addition.menu.range-index'), - SEARCH: i18next.t('addition.menu.full-text-index') -}; - -const CheckAndEditVertex: React.FC = observer(() => { - const { metadataPropertyStore, vertexTypeStore, graphViewStore } = useContext( - MetadataConfigsRootStore - ); - const { t } = useTranslation(); - const [isAddProperty, switchIsAddProperty] = useState(false); - const [isDeletePop, switchDeletePop] = useState(false); - const [ - deleteExistPopIndexInDrawer, - setDeleteExistPopIndexInDrawer - ] = useState(null); - const [ - deleteAddedPopIndexInDrawer, - setDeleteAddedPopIndexInDrawer - ] = useState(null); - - const deleteWrapperRef = useRef(null); - const dropdownWrapperRef = useRef(null); - const deleteWrapperInDrawerRef = useRef(null); - - const isEditVertex = graphViewStore.currentDrawer === 'edit-vertex'; - - const metadataDrawerOptionClass = classnames({ - 'metadata-drawer-options': true, - 'metadata-drawer-options-disabled': isEditVertex - }); - - // need useCallback to stop infinite callings of useEffect - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - const drawerWrapper = document.querySelector( - '.new-fc-one-drawer-content-wrapper' - ); - - if ( - graphViewStore.currentDrawer === 'check-vertex' && - drawerWrapper && - !drawerWrapper.contains(e.target as Element) - ) { - /* - handleOutSideClick is being called after the value assignment of data and drawer-name, - we need to judge whether a node or edge is being clicked - */ - if (graphViewStore.isNodeOrEdgeClicked) { - // if node/edge is clicked, reset state and prepare for next outside clicks - graphViewStore.switchNodeOrEdgeClicked(false); - } else { - graphViewStore.setCurrentDrawer(''); - } - } - - if ( - isAddProperty && - isEditVertex && - dropdownWrapperRef.current && - !dropdownWrapperRef.current.contains(e.target as Element) - ) { - switchIsAddProperty(false); - return; - } - - if ( - isDeletePop && - deleteWrapperRef.current && - !deleteWrapperRef.current.contains(e.target as Element) - ) { - switchDeletePop(false); - } - }, - [graphViewStore, isAddProperty, isEditVertex, isDeletePop] - ); - - const handleCloseDrawer = () => { - switchIsAddProperty(false); - graphViewStore.setCurrentDrawer(''); - vertexTypeStore.selectVertexType(null); - // clear mutations in - vertexTypeStore.resetEditedSelectedVertexType(); - }; - - const handleDeleteVertex = async () => { - // cache vertex name here before it gets removed - const vertexName = vertexTypeStore.selectedVertexType!.name; - const vertexInfo = graphViewStore.visDataSet?.nodes.get(vertexName); - const connectedEdgeInfos = graphViewStore.visDataSet?.edges.get( - graphViewStore.visNetwork?.getConnectedEdges(vertexName) - ); - - // close - handleCloseDrawer(); - switchDeletePop(false); - - // if node > 1, delete node on local before send request - if (graphViewStore.visDataSet!.nodes.length > 1) { - graphViewStore.visDataSet!.nodes.remove(vertexName); - } - - await vertexTypeStore.deleteVertexType([vertexName]); - - if (vertexTypeStore.requestStatus.deleteVertexType === 'success') { - Message.success({ - content: t('addition.common.del-success'), - size: 'medium', - showCloseIcon: false - }); - - vertexTypeStore.fetchVertexTypeList({ fetchAll: true }); - - // if delete the last node, fetch graph data to trigger re-render to reveal - if (graphViewStore.visDataSet?.nodes.length === 1) { - graphViewStore.switchGraphDataEmpty(true); - graphViewStore.fetchGraphViewData(); - } - } - - if (vertexTypeStore.requestStatus.deleteVertexType === 'failed') { - Message.error({ - content: vertexTypeStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - - // if failed, re-add vertex and edges - graphViewStore.visDataSet!.nodes.add(vertexInfo); - graphViewStore.visDataSet!.edges.add(connectedEdgeInfos); - } - }; - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - if (vertexTypeStore.selectedVertexType === null) { - return null; - } - - return ( - { - if (!isEditVertex) { - graphViewStore.setCurrentDrawer('edit-vertex'); - vertexTypeStore.validateEditVertexType(); - } else { - const id = vertexTypeStore.selectedVertexType!.name; - const updateInfo: Record = {}; - - if ( - !isEmpty( - vertexTypeStore.editedSelectedVertexType.append_properties - ) - ) { - const mappedProperties = mapMetadataProperties( - vertexTypeStore.selectedVertexType!.properties, - metadataPropertyStore.metadataProperties - ); - - const newMappedProperties = mapMetadataProperties( - vertexTypeStore.editedSelectedVertexType.append_properties, - metadataPropertyStore.metadataProperties - ); - - const mergedProperties = merge( - mappedProperties, - newMappedProperties - ); - - updateInfo.title = ` - - - ${Object.entries(mergedProperties) - .map(([key, value]) => { - const convertedValue = - value.toLowerCase() === 'text' - ? 'string' - : value.toLowerCase(); - - return ``; - }) - .join('')} - `; - } - - if ( - vertexTypeStore.editedSelectedVertexType.style.color !== null - ) { - updateInfo.color = { - background: - vertexTypeStore.editedSelectedVertexType.style.color, - border: vertexTypeStore.editedSelectedVertexType.style.color - }; - } - - if ( - vertexTypeStore.editedSelectedVertexType.style.size !== null - ) { - updateInfo.value = - vertexRadiusMapping[ - vertexTypeStore.editedSelectedVertexType.style.size - ]; - } - - if (!isEmpty(updateInfo)) { - updateInfo.id = id; - - graphViewStore.visDataSet!.nodes.update(updateInfo); - } - await vertexTypeStore.updateVertexType(); - - if (vertexTypeStore.requestStatus.updateVertexType === 'failed') { - Message.error({ - content: vertexTypeStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - - return; - } - - if ( - vertexTypeStore.requestStatus.updateVertexType === 'success' - ) { - Message.success({ - content: t('addition.operate.modify-success'), - size: 'medium', - showCloseIcon: false - }); - } - - handleCloseDrawer(); - graphViewStore.visNetwork!.unselectAll(); - vertexTypeStore.fetchVertexTypeList({ fetchAll: true }); - } - }} - key="drawer-manipulation" - > - {isEditVertex ? t('addition.common.save') : t('addition.common.edit')} - , - - {vertexTypeStore.vertexTypeUsingStatus && - vertexTypeStore.vertexTypeUsingStatus[ - vertexTypeStore.selectedVertexType!.name - ] ? ( -

- {t('addition.vertex.using-cannot-delete')} -

- ) : ( - <> -

- {t('addition.vertex.del-vertex-confirm')} -

-

{t('addition.edge.confirm-del-edge-careful-notice')}

-

{t('addition.message.long-time-notice')}

-
-
- {t('addition.common.confirm')} -
-
{ - switchDeletePop(false); - }} - > - {t('addition.common.cancel')} -
-
- - )} - - } - childrenProps={{ - onClick() { - if (isEditVertex) { - handleCloseDrawer(); - return; - } - - switchDeletePop(true); - } - }} - > - -
- ]} - > -
-
- {t('addition.menu.base-info')} -
-
-
- {t('addition.vertex.vertex-type-name')}: -
-
- {vertexTypeStore.selectedVertexType!.name} -
-
- -
-
- - {t('addition.vertex.vertex-style')}: - -
-
- -
-
- -
-
-
-
- {t('addition.common.id-strategy')}: -
- {IDStrategyMappings[vertexTypeStore.selectedVertexType!.id_strategy]} -
-
-
- {t('addition.common.association-property')}: -
-
-
- {t('addition.common.property')} - {t('addition.common.allow-null')} -
- {vertexTypeStore.selectedVertexType!.properties.map( - ({ name, nullable }) => ( -
-
{name}
-
- -
-
- ) - )} - {isEditVertex && - vertexTypeStore.editedSelectedVertexType.append_properties.map( - ({ name }) => ( -
-
{name}
-
- -
-
- ) - )} - {isEditVertex && ( -
{ - switchIsAddProperty(!isAddProperty); - }} - > - - {t('addition.common.add-property')} - - toogleAddProperties -
- )} - {isEditVertex && isAddProperty && ( -
- {metadataPropertyStore.metadataProperties - .filter( - (property) => - vertexTypeStore.selectedVertexType!.properties.find( - ({ name }) => name === property.name - ) === undefined - ) - .map((property) => ( -
- - propertyIndex === property.name - ) !== -1 - } - onChange={() => { - const addedPropertiesInSelectedVertextType = - vertexTypeStore.addedPropertiesInSelectedVertextType; - - addedPropertiesInSelectedVertextType.has( - property.name - ) - ? addedPropertiesInSelectedVertextType.delete( - property.name - ) - : addedPropertiesInSelectedVertextType.add( - property.name - ); - - vertexTypeStore.mutateEditedSelectedVertexType({ - ...vertexTypeStore.editedSelectedVertexType, - append_properties: [ - ...addedPropertiesInSelectedVertextType - ].map((propertyName) => { - const currentProperty = vertexTypeStore.newVertexType.properties.find( - ({ name }) => name === propertyName - ); - - return { - name: propertyName, - nullable: !isUndefined(currentProperty) - ? currentProperty.nullable - : true - }; - }) - }); - }} - > - {property.name} - - -
- ))} -
- )} -
-
-
-
- {t('addition.common.primary-key-property')}: -
-
- {vertexTypeStore.selectedVertexType!.primary_keys.join(';')} -
-
-
-
- - {t('addition.vertex.vertex-display-content')}: - -
- {isEditVertex ? ( - - ) : ( -
- {vertexTypeStore.selectedVertexType?.style.display_fields - .map((field) => - formatVertexIdText( - field, - t('addition.function-parameter.vertex-id') - ) - ) - .join('-')} -
- )} -
-
- {t('addition.edge.index-info')} -
-
-
- {t('addition.menu.type-index')}: -
- -
-
-
- {t('addition.common.property-index')}: -
-
- {(vertexTypeStore.selectedVertexType!.property_indexes.length !== - 0 || - vertexTypeStore.editedSelectedVertexType.append_property_indexes - .length !== 0) && ( -
- {t('addition.edge.index-name')} - {t('addition.edge.index-type')} - {t('addition.common.property')} -
- )} - {vertexTypeStore - .selectedVertexType!.property_indexes.filter((propertyIndex) => - isUndefined( - vertexTypeStore.editedSelectedVertexType.remove_property_indexes.find( - (removedPropertyName) => - removedPropertyName === propertyIndex.name - ) - ) - ) - .map(({ name, type, fields }, index) => { - return ( -
-
{name}
-
{propertyIndexTypeMappings[type]}
-
- - {fields - .map((field, index) => index + 1 + '.' + field) - .join(';')} - - {isEditVertex && ( - -

- {t('addition.message.property-del-confirm')} -

-

- {t('addition.message.index-del-confirm')} -

-
-
{ - const removedPropertyIndexes = cloneDeep( - vertexTypeStore.editedSelectedVertexType - .remove_property_indexes - ); - - removedPropertyIndexes.push( - vertexTypeStore.selectedVertexType! - .property_indexes[index].name - ); - - vertexTypeStore.mutateEditedSelectedVertexType( - { - ...vertexTypeStore.editedSelectedVertexType, - remove_property_indexes: removedPropertyIndexes - } - ); - - setDeleteExistPopIndexInDrawer(null); - vertexTypeStore.validateEditVertexType( - true - ); - }} - > - {t('addition.common.confirm')} -
-
{ - setDeleteExistPopIndexInDrawer(null); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: CloseIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeleteExistPopIndexInDrawer(index); - } - }} - /> - )} -
-
- ); - })} - {vertexTypeStore.editedSelectedVertexType.append_property_indexes.map( - ({ name, type, fields }, index) => { - return ( -
-
- { - const propertyIndexEntities = cloneDeep( - vertexTypeStore.editedSelectedVertexType - .append_property_indexes - ); - - propertyIndexEntities[index].name = e.value; - - vertexTypeStore.mutateEditedSelectedVertexType({ - ...vertexTypeStore.editedSelectedVertexType, - append_property_indexes: propertyIndexEntities - }); - }} - originInputProps={{ - onBlur() { - // check is ready to create - vertexTypeStore.validateEditVertexType(); - } - }} - /> -
-
- -
-
- - - -

- {t('addition.message.property-del-confirm')} -

-

- {t('addition.message.index-del-confirm')} -

-
-
{ - const appendPropertyIndexes = cloneDeep( - vertexTypeStore.editedSelectedVertexType! - .append_property_indexes - ); - - appendPropertyIndexes.splice(index, 1); - - vertexTypeStore.mutateEditedSelectedVertexType( - { - ...vertexTypeStore.editedSelectedVertexType, - append_property_indexes: appendPropertyIndexes - } - ); - - setDeleteAddedPopIndexInDrawer(null); - vertexTypeStore.validateEditVertexType(true); - }} - > - {t('addition.common.confirm')} -
-
{ - vertexTypeStore.resetEditedSelectedVertexType(); - setDeleteAddedPopIndexInDrawer(null); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: CloseIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeleteAddedPopIndexInDrawer(index); - } - }} - childrenWrapperElement="img" - /> -
-
- ); - } - )} - {isEditVertex && ( -
{ - if ( - vertexTypeStore.editedSelectedVertexType - .append_property_indexes.length === 0 || - vertexTypeStore.isEditReady - ) { - vertexTypeStore.mutateEditedSelectedVertexType({ - ...vertexTypeStore.editedSelectedVertexType, - append_property_indexes: [ - ...vertexTypeStore.editedSelectedVertexType - .append_property_indexes, - { - name: '', - type: '', - fields: [] - } - ] - }); - - vertexTypeStore.validateEditVertexType(true); - } - }} - style={{ - cursor: 'pointer', - color: vertexTypeStore.isEditReady ? '#2b65ff' : '#999' - }} - > - {t('addition.edge.add-group')} -
- )} -
- - -
- ); -}); - -export default CheckAndEditVertex; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckProperty.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckProperty.tsx deleted file mode 100644 index 0bcef5713..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CheckProperty.tsx +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import { Drawer, Table, Message } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { Tooltip } from '../../../common'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; - -import type { MetadataProperty } from '../../../../stores/types/GraphManagementStore/metadataConfigsStore'; -import { signal } from 'codemirror'; - -const CheckProperty: React.FC = observer(() => { - const { metadataPropertyStore, graphViewStore } = useContext( - MetadataConfigsRootStore - ); - const { t } = useTranslation(); - const [popIndex, setPopIndex] = useState(null); - const deleteWrapperRef = useRef(null); - - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - // note: .new-fc-one-drawer-content-wrapper sometimes only contain one single element? - // however if you capture .new-fc-one-drawer-wrapper-body-container it still returns itself and contains all children - // thus here we capture body-container as drawer - const drawerWrapper = document.querySelector( - '.new-fc-one-drawer-wrapper-body-container' - ); - - const deleteWrapper = document.querySelector('.metadata-graph-tooltips'); - - if ( - graphViewStore.currentDrawer === 'check-property' && - drawerWrapper && - !drawerWrapper.contains(e.target as Element) - ) { - if ( - deleteWrapper === null && - (e.target as Element).className !== - 'metadata-graph-property-manipulation' - ) { - graphViewStore.setCurrentDrawer(''); - } - - if ( - deleteWrapper && - !deleteWrapper.contains(e.target as Element) && - (e.target as Element).className !== - 'metadata-graph-property-manipulation' - ) { - graphViewStore.setCurrentDrawer(''); - } - } - - if ( - popIndex !== null && - deleteWrapper && - !deleteWrapper.contains(e.target as Element) - ) { - setPopIndex(null); - } - }, - [graphViewStore, popIndex] - ); - - const handleCloseDrawer = () => { - graphViewStore.setCurrentDrawer(''); - }; - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, true); - - return () => { - document.removeEventListener('click', handleOutSideClick, true); - }; - }, [handleOutSideClick]); - - const columnConfigs = [ - { - title: t('addition.common.property-name'), - dataIndex: 'name' - }, - { - title: t('addition.common.data-type'), - dataIndex: 'data_type', - render(text: string) { - const realText = text === 'TEXT' ? 'string' : text.toLowerCase(); - - return realText; - } - }, - { - title: t('addition.common.cardinal-number'), - dataIndex: 'cardinality' - }, - { - title: t('addition.operate.operate'), - render(_: any, records: MetadataProperty, index: number) { - return ( - - {metadataPropertyStore.metadataPropertyUsingStatus && - metadataPropertyStore.metadataPropertyUsingStatus[ - records.name - ] ? ( -

- {t('addition.message.property-using-cannot-delete')} -

- ) : ( - <> -

{t('addition.message.property-del-confirm')}

-

{t('addition.edge.confirm-del-edge-careful-notice')}

-
-
{ - setPopIndex(null); - await metadataPropertyStore.deleteMetadataProperty([ - records.name - ]); - if ( - metadataPropertyStore.requestStatus - .deleteMetadataProperty === 'success' - ) { - Message.success({ - content: t('addition.common.del-success'), - size: 'medium', - showCloseIcon: false - }); - metadataPropertyStore.fetchMetadataPropertyList(); - } - if ( - metadataPropertyStore.requestStatus - .deleteMetadataProperty === 'failed' - ) { - Message.error({ - content: metadataPropertyStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - } - }} - > - {t('addition.common.confirm')} -
-
{ - setPopIndex(null); - }} - > - {t('addition.common.cancel')} -
-
- - )} - - } - childrenProps={{ - className: 'metadata-graph-property-manipulation', - async onClick() { - await metadataPropertyStore.checkIfUsing([records.name]); - if ( - metadataPropertyStore.requestStatus.checkIfUsing === 'success' - ) { - setPopIndex(index); - } - } - }} - > - {t('addition.common.del')} -
- ); - } - } - ]; - - return ( - -
-
- - - ); -}); - -export default CheckProperty; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateEdge.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateEdge.tsx deleted file mode 100644 index 87268d57b..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateEdge.tsx +++ /dev/null @@ -1,1177 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import classnames from 'classnames'; -import { cloneDeep, isUndefined } from 'lodash-es'; -import { - Drawer, - Button, - Input, - Select, - Switch, - Checkbox, - Tooltip, - Message -} from 'hubble-ui'; - -import { Tooltip as CustomTooltip } from '../../../common'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; -import { EdgeTypeValidatePropertyIndexes } from '../../../../stores/types/GraphManagementStore/metadataConfigsStore'; -import { - mapMetadataProperties, - generateGraphModeId, - edgeWidthMapping, - formatVertexIdText -} from '../../../../stores/utils'; -import { useTranslation } from 'react-i18next'; - -import BlueArrowIcon from '../../../../assets/imgs/ic_arrow_blue.svg'; -import HintIcon from '../../../../assets/imgs/ic_question_mark.svg'; -import closeIcon from '../../../../assets/imgs/ic_close_16.svg'; -import SelectedSoilidArrowIcon from '../../../../assets/imgs/ic_arrow_selected.svg'; -import NoSelectedSoilidArrowIcon from '../../../../assets/imgs/ic_arrow.svg'; -import SelectedSoilidStraightIcon from '../../../../assets/imgs/ic_straight_selected.svg'; -import NoSelectedSoilidStraightIcon from '../../../../assets/imgs/ic_straight.svg'; - -const CreateEdge: React.FC = observer(() => { - const { - metadataPropertyStore, - vertexTypeStore, - edgeTypeStore, - graphViewStore - } = useContext(MetadataConfigsRootStore); - const [isAddNewProperty, switchIsAddNewProperty] = useState(false); - const [deletePopIndex, setDeletePopIndex] = useState(null); - const deleteWrapperRef = useRef(null); - const dropdownWrapperRef = useRef(null); - const { t } = useTranslation(); - // need useCallback to stop infinite callings of useEffect - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - // if clicked element is not on dropdown, collpase it - if ( - isAddNewProperty && - dropdownWrapperRef.current && - !dropdownWrapperRef.current.contains(e.target as Element) - ) { - switchIsAddNewProperty(false); - } - - if ( - deletePopIndex && - deleteWrapperRef.current && - !deleteWrapperRef.current.contains(e.target as Element) - ) { - setDeletePopIndex(null); - } - }, - [deletePopIndex, isAddNewProperty] - ); - - const handleCloseDrawer = () => { - graphViewStore.setCurrentDrawer(''); - edgeTypeStore.resetNewEdgeType(); - edgeTypeStore.resetAddedPropertiesInSelectedEdgeType(); - }; - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - return ( - { - edgeTypeStore.validateAllNewEdgeType(); - - if (!edgeTypeStore.isCreatedReady) { - return; - } - - const { - name, - source_label, - target_label, - properties, - sort_keys, - style, - ...rest - } = edgeTypeStore.newEdgeType; - - const mappedProperties = mapMetadataProperties( - properties, - metadataPropertyStore.metadataProperties - ); - - graphViewStore.visDataSet!.edges.add({ - ...rest, - id: generateGraphModeId(name, source_label, target_label), - label: name.length <= 15 ? name : name.slice(0, 15) + '...', - from: source_label, - to: target_label, - value: edgeWidthMapping[style.thickness], - font: { size: 16, strokeWidth: 0, color: '#666' }, - arrows: style.with_arrow === true ? 'to' : '', - title: ` - - - ${Object.entries(mappedProperties) - .map(([key, value]) => { - const convertedValue = - value.toLowerCase() === 'text' - ? 'string' - : value.toLowerCase(); - - const sortKeyIndex = sort_keys.findIndex( - (sortKey) => sortKey === key - ); - - return ``; - }) - .join('')} - `, - color: { - color: style.color, - highlight: style.color, - hover: style.color - } - }); - - await edgeTypeStore.addEdgeType(); - - if (edgeTypeStore.requestStatus.addEdgeType === 'success') { - edgeTypeStore.fetchEdgeTypeList(); - edgeTypeStore.resetNewEdgeType(); - edgeTypeStore.resetAddedPropertiesInSelectedEdgeType(); - graphViewStore.setCurrentDrawer(''); - - Message.success({ - content: t('addition.newGraphConfig.create-scuccess'), - size: 'medium', - showCloseIcon: false - }); - } - - if (edgeTypeStore.requestStatus.addEdgeType === 'failed') { - Message.error({ - content: edgeTypeStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - } - }} - > - {t('addition.newGraphConfig.create')} - , - - ]} - > -
-
-
-
- {t('addition.menu.base-info')} -
-
-
- * - {t('addition.common.edge-type-name')}: -
- { - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - name: e.value - }); - }} - originInputProps={{ - onBlur() { - edgeTypeStore.validateAllNewEdgeType(true); - edgeTypeStore.validateNewEdgeType('name'); - } - }} - /> -
-
-
- * - {t('addition.common.edge-style')}: -
-
- -
- -
- -
- -
- -
-
-
-
- * - {t('addition.common.source-type')}: -
- -
- -
-
- * - {t('addition.common.target-type')}: -
- -
- -
-
- * - {t('addition.common.allow-multiple-connections')}: - - hint - -
- { - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - link_multi_times: checked - }); - }} - /> -
- -
-
- {edgeTypeStore.newEdgeType.link_multi_times && ( - * - )} - {t('addition.common.association-property')}: -
-
- {edgeTypeStore.newEdgeType.properties.length !== 0 && ( -
-
-
{t('addition.common.property')}
-
{t('addition.common.allow-null')}
-
- {edgeTypeStore.newEdgeType.properties.map( - (property, index) => { - const currentProperties = cloneDeep( - edgeTypeStore.newEdgeType.properties - ); - - return ( -
-
{property.name}
-
- { - currentProperties[index].nullable = - !currentProperties[index].nullable; - - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - properties: currentProperties - }); - }} - size="large" - /> -
-
- ); - } - )} -
- )} -
{ - switchIsAddNewProperty(!isAddNewProperty); - }} - > - {t('addition.common.add-property')} - toggleAddProperty -
-
-
- - {isAddNewProperty && ( -
-
-
- {metadataPropertyStore.metadataProperties.map((property) => ( -
- - propertyIndex === property.name - ) !== -1 - } - onChange={() => { - const addedPropertiesIndexInSelectedEdgeType = - edgeTypeStore.addedPropertiesInSelectedEdgeType; - - addedPropertiesIndexInSelectedEdgeType.has( - property.name - ) - ? addedPropertiesIndexInSelectedEdgeType.delete( - property.name - ) - : addedPropertiesIndexInSelectedEdgeType.add( - property.name - ); - - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - properties: [ - ...addedPropertiesIndexInSelectedEdgeType - ].map((propertyName) => { - const currentProperty = - edgeTypeStore.newEdgeType.properties.find( - ({ name }) => name === propertyName - ); - - return { - name: propertyName, - nullable: !isUndefined(currentProperty) - ? currentProperty.nullable - : true - }; - }) - }); - - edgeTypeStore.validateAllNewEdgeType(true); - edgeTypeStore.validateNewEdgeType('properties'); - }} - > - {property.name} - - -
- ))} -
-
- )} - - {edgeTypeStore.newEdgeType.link_multi_times && ( -
-
- * - {t('addition.common.distinguishing-key')}: -
- -
- )} -
-
- * - {t('addition.edge.display-content')}: -
- -
-
- - {t('addition.edge.index-info')} - - - hint - -
- -
-
- * - {t('addition.menu.type-index')}: -
- { - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - open_label_index: checked - }); - }} - /> -
- -
-
- {t('addition.common.property-index')}: -
-
- {edgeTypeStore.newEdgeType.property_indexes.length !== 0 && ( -
-
- {t('addition.edge.index-name')} -
-
- {t('addition.edge.index-type')} -
-
{t('addition.common.property')}
-
- )} - {edgeTypeStore.newEdgeType.property_indexes.map( - ({ name, type, fields }, index) => ( -
-
- { - const propertyIndexEntities = cloneDeep( - edgeTypeStore.newEdgeType.property_indexes - ); - - propertyIndexEntities[index].name = e.value; - - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - property_indexes: propertyIndexEntities - }); - }} - originInputProps={{ - onBlur() { - // check is ready to create - edgeTypeStore.validateAllNewEdgeType(true); - edgeTypeStore.validateNewEdgeType( - 'propertyIndexes' - ); - } - }} - /> -
-
- -
-
- -
- - -

- {t('addition.message.property-del-confirm')} -

-

- {t('addition.message.index-del-confirm')} -

-
-
{ - const propertyIndexEntities = cloneDeep( - edgeTypeStore.newEdgeType.property_indexes - ); - - propertyIndexEntities.splice(index, 1); - - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - property_indexes: propertyIndexEntities - }); - - edgeTypeStore.validateAllNewEdgeType(true); - edgeTypeStore.validateNewEdgeType( - 'propertyIndexes' - ); - - setDeletePopIndex(null); - }} - > - {t('addition.common.confirm')} -
-
{ - setDeletePopIndex(null); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: closeIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeletePopIndex(index); - } - }} - childrenWrapperElement="img" - /> -
- ) - )} - { - if ( - edgeTypeStore.newEdgeType.property_indexes.length === 0 || - edgeTypeStore.isAddNewPropertyIndexReady - ) { - edgeTypeStore.mutateNewEdgeType({ - ...edgeTypeStore.newEdgeType, - property_indexes: [ - ...edgeTypeStore.newEdgeType.property_indexes, - { - name: '', - type: '', - fields: [] - } - ] - }); - - edgeTypeStore.validateAllNewEdgeType(true); - // set isAddNewPropertyIndexReady to false - edgeTypeStore.validateNewEdgeType( - 'propertyIndexes', - true - ); - } - }} - style={{ - cursor: 'pointer', - color: edgeTypeStore.isAddNewPropertyIndexReady - ? '#2b65ff' - : '#999', - lineHeight: '32px' - }} - > - {t('addition.edge.add-group')} - -
-
-
-
- -
- ); -}); - -export default CreateEdge; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateProperty.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateProperty.tsx deleted file mode 100644 index b4b2d23c8..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateProperty.tsx +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext } from 'react'; -import { observer } from 'mobx-react'; -import { Drawer, Button, Input, Select, Message } from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; - -const dataTypeOptions = [ - 'string', - 'boolean', - 'byte', - 'int', - 'long', - 'float', - 'double', - 'date', - 'uuid', - 'blob' -]; - -const cardinalityOptions = ['single', 'list', 'set']; - -const CreateProperty: React.FC = observer(() => { - const { metadataPropertyStore, graphViewStore } = useContext( - MetadataConfigsRootStore - ); - const { t } = useTranslation(); - const handleCloseDrawer = () => { - graphViewStore.setCurrentDrawer(''); - metadataPropertyStore.resetNewProperties(); - metadataPropertyStore.resetValidateNewProperty(); - }; - - return ( - { - metadataPropertyStore.validateNewProperty(); - - if (!metadataPropertyStore.isCreatedReady) { - return; - } - - await metadataPropertyStore.addMetadataProperty(); - - if ( - metadataPropertyStore.requestStatus.addMetadataProperty === - 'success' - ) { - graphViewStore.setCurrentDrawer(''); - - Message.success({ - content: t('addition.newGraphConfig.create-scuccess'), - size: 'medium', - showCloseIcon: false - }); - } - - if ( - metadataPropertyStore.requestStatus.addMetadataProperty === - 'failed' - ) { - Message.error({ - content: metadataPropertyStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - } - - metadataPropertyStore.fetchMetadataPropertyList({ fetchAll: true }); - metadataPropertyStore.resetNewProperties(); - }} - > - {t('addition.newGraphConfig.create')} - , - - ]} - > -
-
-
-
-
- * - {t('addition.common.property-name')}: -
- { - metadataPropertyStore.mutateNewProperty({ - ...metadataPropertyStore.newMetadataProperty, - _name: e.value - }); - - metadataPropertyStore.validateNewProperty(); - }} - originInputProps={{ - // no autofocus here, it will automatically dispatch blur action - onBlur() { - metadataPropertyStore.validateNewProperty(); - } - }} - /> -
-
-
- * - {t('addition.common.data-type')}: -
- -
-
-
- * - {t('addition.common.cardinal-number')}: -
- -
-
-
-
-
- ); -}); - -export default CreateProperty; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateVertex.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateVertex.tsx deleted file mode 100644 index 9a40be4ee..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/CreateVertex.tsx +++ /dev/null @@ -1,1142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import classnames from 'classnames'; -import { cloneDeep, isUndefined } from 'lodash-es'; -import { - Drawer, - Button, - Input, - Select, - Radio, - Switch, - Checkbox, - Tooltip, - Message -} from 'hubble-ui'; - -import { Tooltip as CustomTooltip } from '../../../common'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; -import { - vertexRadiusMapping, - mapMetadataProperties, - formatVertexIdText -} from '../../../../stores/utils'; -import { useTranslation } from 'react-i18next'; - -import type { VertexTypeValidatePropertyIndexes } from '../../../../stores/types/GraphManagementStore/metadataConfigsStore'; - -import BlueArrowIcon from '../../../../assets/imgs/ic_arrow_blue.svg'; -import HintIcon from '../../../../assets/imgs/ic_question_mark.svg'; -import closeIcon from '../../../../assets/imgs/ic_close_16.svg'; -import { clearObserving } from 'mobx/lib/internal'; - -const CreateVertex: React.FC = observer(() => { - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const { metadataPropertyStore, vertexTypeStore, graphViewStore } = useContext( - MetadataConfigsRootStore - ); - const { t } = useTranslation(); - const [isAddNewProperty, switchIsAddNewProperty] = useState(false); - const [deletePopIndex, setDeletePopIndex] = useState(null); - const deleteWrapperRef = useRef(null); - const dropdownWrapperRef = useRef(null); - - // need useCallback to stop infinite callings of useEffect - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - // if clicked element is not on dropdown, collpase it - if ( - isAddNewProperty && - dropdownWrapperRef.current && - !dropdownWrapperRef.current.contains(e.target as Element) - ) { - switchIsAddNewProperty(false); - } - - if ( - deletePopIndex && - deleteWrapperRef.current && - !deleteWrapperRef.current.contains(e.target as Element) - ) { - setDeletePopIndex(null); - } - }, - [deletePopIndex, isAddNewProperty] - ); - - const handleCloseDrawer = () => { - graphViewStore.setCurrentDrawer(''); - vertexTypeStore.resetNewVertextType(); - vertexTypeStore.resetAddedPropertiesInSelectedVertextType(); - }; - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - return ( - { - vertexTypeStore.validateAllNewVertexType(); - - if (!vertexTypeStore.isCreatedReady) { - return; - } - - const { - name, - properties, - primary_keys, - style, - ...rest - } = vertexTypeStore.newVertexType; - - const mappedProperties = mapMetadataProperties( - properties, - metadataPropertyStore.metadataProperties - ); - - graphViewStore.visDataSet!.nodes.add({ - ...rest, - id: name, - label: name.length <= 15 ? name : name.slice(0, 15) + '...', - vLabel: name, - properties, - value: vertexRadiusMapping[style.size], - font: { size: 16 }, - title: ` - - - ${Object.entries(mappedProperties) - .map(([key, value]) => { - const convertedValue = - value.toLowerCase() === 'text' - ? 'string' - : value.toLowerCase(); - - const primaryKeyIndex = primary_keys.findIndex( - (primaryKey) => primaryKey === key - ); - - return ``; - }) - .join('')} - `, - color: { - background: style.color, - border: style.color, - highlight: { - background: '#fb6a02', - border: '#fb6a02' - }, - hover: { background: '#ec3112', border: '#ec3112' } - }, - // reveal label when zoom to max - scaling: { - label: { - max: Infinity, - maxVisible: Infinity - } - }, - chosen: { - node( - values: any, - id: string, - selected: boolean, - hovering: boolean - ) { - if (hovering || selected) { - values.shadow = true; - values.shadowColor = 'rgba(0, 0, 0, 0.6)'; - values.shadowX = 0; - values.shadowY = 0; - values.shadowSize = 25; - } - - if (selected) { - values.size += 5; - } - } - } - }); - - await vertexTypeStore.addVertexType(); - - if (vertexTypeStore.requestStatus.addVertexType === 'success') { - vertexTypeStore.fetchVertexTypeList(); - vertexTypeStore.resetNewVertextType(); - vertexTypeStore.resetAddedPropertiesInSelectedVertextType(); - graphViewStore.setCurrentDrawer(''); - - Message.success({ - content: t('addition.newGraphConfig.create-scuccess'), - size: 'medium', - showCloseIcon: false - }); - - // if vertex is empty before, trigger re-render here to reveal - if (graphViewStore.isGraphVertexEmpty) { - graphViewStore.switchGraphDataEmpty(false); - // need to get node colors again since fetchGraphViewData() will cause re-render in - // the graph use graphNode() rather than local added node - await dataAnalyzeStore.fetchAllNodeStyle(); - graphViewStore.fetchGraphViewData( - dataAnalyzeStore.colorMappings, - dataAnalyzeStore.vertexSizeMappings, - dataAnalyzeStore.vertexWritingMappings, - dataAnalyzeStore.edgeColorMappings, - dataAnalyzeStore.edgeThicknessMappings, - dataAnalyzeStore.edgeWithArrowMappings, - dataAnalyzeStore.edgeWritingMappings - ); - } - return; - } - - if (vertexTypeStore.requestStatus.addVertexType === 'failed') { - Message.error({ - content: vertexTypeStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - } - }} - > - {t('addition.newGraphConfig.create')} - , - - ]} - > -
-
-
-
- {t('addition.menu.base-info')} -
-
-
- * - {t('addition.vertex.vertex-type-name')}: -
- { - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - name: e.value - }); - }} - originInputProps={{ - onBlur() { - vertexTypeStore.validateAllNewVertexType(true); - vertexTypeStore.validateNewVertexType('name'); - } - }} - /> -
-
-
- * - {t('addition.vertex.vertex-style')}: -
-
- -
-
- -
-
-
-
- * - {t('addition.common.id-strategy')}: -
- ) => { - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - id_strategy: e.target.value - }); - vertexTypeStore.validateAllNewVertexType(true); - vertexTypeStore.validateNewVertexType('primaryKeys'); - }} - > - - {t('addition.constant.primary-key-id')} - - - {t('addition.constant.automatic-generation')} - - - {t('addition.constant.custom-string')} - - - {t('addition.constant.custom-number')} - - - {t('addition.constant.custom-uuid')} - - -
-
-
- {vertexTypeStore.newVertexType.id_strategy === - 'PRIMARY_KEY' && ( - * - )} - {t('addition.common.association-property')}: -
-
- {vertexTypeStore.newVertexType.properties.length !== 0 && ( -
-
-
{t('addition.common.property')}
-
{t('addition.common.allow-null')}
-
- {vertexTypeStore.newVertexType.properties.map( - (property, index) => { - const currentProperties = cloneDeep( - vertexTypeStore.newVertexType.properties - ); - - return ( -
-
{property.name}
-
- { - currentProperties[ - index - ].nullable = !currentProperties[index] - .nullable; - - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - properties: currentProperties - }); - }} - size="large" - /> -
-
- ); - } - )} -
- )} -
{ - switchIsAddNewProperty(!isAddNewProperty); - }} - > - {t('addition.common.add-property')} - toggleAddProperty -
-
-
- - {isAddNewProperty && ( -
-
-
- {metadataPropertyStore.metadataProperties.map((property) => ( -
- - propertyIndex === property.name - ) !== -1 - } - onChange={() => { - const addedPropertiesInSelectedVertextType = - vertexTypeStore.addedPropertiesInSelectedVertextType; - - addedPropertiesInSelectedVertextType.has( - property.name - ) - ? addedPropertiesInSelectedVertextType.delete( - property.name - ) - : addedPropertiesInSelectedVertextType.add( - property.name - ); - - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - properties: [ - ...addedPropertiesInSelectedVertextType - ].map((propertyName) => { - const currentProperty = vertexTypeStore.newVertexType.properties.find( - ({ name }) => name === propertyName - ); - - return { - name: propertyName, - nullable: !isUndefined(currentProperty) - ? currentProperty.nullable - : true - }; - }) - }); - - vertexTypeStore.validateAllNewVertexType(true); - vertexTypeStore.validateNewVertexType('properties'); - }} - > - {property.name} - - -
- ))} -
-
- )} - - {vertexTypeStore.newVertexType.id_strategy === 'PRIMARY_KEY' && ( -
-
- * - {t('addition.common.primary-key-property')}: -
- -
- )} - -
-
- * - {t('addition.vertex.vertex-display-content')}: -
- -
- -
- - {t('addition.edge.index-info')} - - - hint - -
- -
-
- * - {t('addition.menu.type-index')}: -
- { - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - open_label_index: !vertexTypeStore.newVertexType - .open_label_index - }); - }} - size="large" - /> -
- -
-
- {t('addition.common.property-index')}: -
-
- {vertexTypeStore.newVertexType.property_indexes.length !== - 0 && ( -
-
- {t('addition.edge.index-name')} -
-
- {t('addition.edge.index-type')} -
-
{t('addition.common.property')}
-
- )} - {vertexTypeStore.newVertexType.property_indexes.map( - ({ name, type, fields }, index) => ( -
-
- { - const propertyIndexEntities = cloneDeep( - vertexTypeStore.newVertexType.property_indexes - ); - - propertyIndexEntities[index].name = e.value; - - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - property_indexes: propertyIndexEntities - }); - }} - originInputProps={{ - onBlur() { - // check is ready to create - vertexTypeStore.validateAllNewVertexType(true); - vertexTypeStore.validateNewVertexType( - 'propertyIndexes' - ); - } - }} - /> -
-
- -
-
- -
- - -

- {t('addition.message.property-del-confirm')} -

-

- {t('addition.message.index-del-confirm')} -

-
-
{ - const propertyIndexEntities = cloneDeep( - vertexTypeStore.newVertexType - .property_indexes - ); - - propertyIndexEntities.splice(index, 1); - - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - property_indexes: propertyIndexEntities - }); - - vertexTypeStore.validateAllNewVertexType( - true - ); - vertexTypeStore.validateNewVertexType( - 'propertyIndexes' - ); - - setDeletePopIndex(null); - }} - > - {t('addition.common.confirm')} -
-
{ - setDeletePopIndex(null); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: closeIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeletePopIndex(index); - } - }} - childrenWrapperElement="img" - /> -
- ) - )} - { - if ( - vertexTypeStore.newVertexType.property_indexes.length === - 0 || - vertexTypeStore.isAddNewPropertyIndexReady - ) { - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - property_indexes: [ - ...vertexTypeStore.newVertexType.property_indexes, - { - name: '', - type: '', - fields: [] - } - ] - }); - - vertexTypeStore.validateAllNewVertexType(true); - // set isAddNewPropertyIndexReady to false - vertexTypeStore.validateNewVertexType( - 'propertyIndexes', - true - ); - } - }} - style={{ - cursor: 'pointer', - color: vertexTypeStore.isAddNewPropertyIndexReady - ? '#2b65ff' - : '#999', - lineHeight: '32px' - }} - > - {t('addition.edge.add-group')} - -
-
-
-
- -
- ); -}); - -export default CreateVertex; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/GraphView.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/GraphView.less deleted file mode 100644 index 3b01eb15e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/GraphView.less +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.metadata-graph { - &-drawer-wrapper { - .metadata-graph-drawer { - &-title { - font-family: - 'PingFangSC-Medium', - 'Microsoft YaHei Bold', - '微软雅黑', - Arial, - sans-serif; - width: 115px; - font-weight: bold; - margin-bottom: 16px; - text-align: right; - word-break: keep-all; - } - - &-manipulations, - &-options { - margin-bottom: 32px; - display: flex; - align-items: center; - - &-name { - width: 125px; - margin-right: 43.9px; - text-align: right; - color: #333; - font-size: 14px; - word-break: keep-all; - line-height: 32px; - } - - &-expands { - font-size: 14px; - color: #333; - } - } - } - } - - &-view-wrapper { - height: calc(100vh - 222px); - overflow: hidden; - } - - &-view { - margin: -1px; - } - - &-view-empty-wrapper { - height: calc(100vh - 222px); - display: flex; - justify-content: center; - align-items: center; - } - - &-view-empty { - display: flex; - flex-direction: column; - align-items: center; - font-size: 14px; - color: #333; - } - - &-loading { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - height: 100%; - } - - &-loading-bg { - width: 144px; - height: 144px; - position: relative; - margin-bottom: 10px; - } - - &-loading-back { - position: absolute; - left: 22px; - top: 20px; - } - - &-loading-front { - position: absolute; - left: 57.1px; - top: 52.1px; - animation: loading-rotate 2s linear infinite; - } - - @keyframes loading-rotate { - from { - transform: rotate(0deg); - } - - to { - transform: rotate(360deg); - } - } - - &-property-manipulation { - font-size: 14px; - color: #2b65ff; - cursor: pointer; - - &:hover { - color: #527dff; - } - - &:active { - color: #184bcc; - } - } - - &-tooltips { - background: #fff; - box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15); - border-radius: 3px; - padding: 16px; - font-size: 14px; - color: #333; - - &-title { - font-size: 16px; - font-weight: 900; - margin-bottom: 16px; - } - } -} - -/* override */ - -// refer to index.less in root dir, this should be fixed in future -.metadata-graph-drawer-wrapper { - .new-fc-one-input-all-container { - position: relative; - } -} - -.metadata-graph-drawer-options-colors { - margin-left: 12px; -} - -.metadata-graph-drawer-options-color { - width: 20px; - height: 20px; -} - -.metadata-graph-drawer-options .metadata-graph-drawer-options-color { - margin-top: 6px; -} - -// refer to NewVertexType.less, color option style in dropdown -.new-fc-one-select-dropdown-menu-container .metadata-graph-drawer-options-color { - width: 20px; - height: 20px; - margin: 6px auto; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/GraphView.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/GraphView.tsx deleted file mode 100644 index bc2c17536..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/GraphView.tsx +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import { isEmpty } from 'lodash-es'; -import vis from 'vis-network'; -import 'vis-network/styles/vis-network.min.css'; -import { Button } from 'hubble-ui'; - -import CreateProperty from './CreateProperty'; -import CreateVertex from './CreateVertex'; -import CreateEdge from './CreateEdge'; -import CheckAndEditVertex from './CheckAndEditVertex'; -import CheckAndEditEdge from './CheckAndEditEdge'; -import CheckProperty from './CheckProperty'; - -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; -import { generateGraphModeId } from '../../../../stores/utils'; - -import AddIcon from '../../../../assets/imgs/ic_add.svg'; -import LoadingBackIcon from '../../../../assets/imgs/ic_loading_back.svg'; -import LoadingFrontIcon from '../../../../assets/imgs/ic_loading_front.svg'; -import { useTranslation } from 'react-i18next'; - -import '../../data-analyze/DataAnalyze.less'; -import './GraphView.less'; - -const styles = { - marginLeft: '12px' -}; - -const GraphView: React.FC = observer(() => { - const { - metadataPropertyStore, - vertexTypeStore, - edgeTypeStore, - graphViewStore - } = useContext(MetadataConfigsRootStore); - const { t } = useTranslation(); - useEffect(() => { - metadataPropertyStore.fetchMetadataPropertyList({ - fetchAll: true - }); - - vertexTypeStore.fetchVertexTypeList({ fetchAll: true }); - edgeTypeStore.fetchEdgeTypeList({ fetchAll: true }); - - return () => { - metadataPropertyStore.dispose(); - vertexTypeStore.dispose(); - edgeTypeStore.dispose(); - }; - }, [edgeTypeStore, graphViewStore, metadataPropertyStore, vertexTypeStore]); - - return ( -
-
- - - - {/* .outsideClick need id to specify logic here */} - {!isEmpty(metadataPropertyStore.metadataProperties) && ( -
- -
- )} -
- {/* note: components below all have graphView.currentDrawer in render - * if use && at here it will dispatch re-render in this component - * which cause all components below to re-render either - */} - - - - - - - -
- ); -}); - -const GraphDataView: React.FC = observer(() => { - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const { - metadataPropertyStore, - vertexTypeStore, - edgeTypeStore, - graphViewStore - } = useContext(MetadataConfigsRootStore); - const [graph, setGraph] = useState(null); - const [showLoadingGraphs, switchShowLoadingGraphs] = useState(true); - const [isGraphDataLoaded, switchIsGraphLoaded] = useState(false); - const { t } = useTranslation(); - const graphWrapper = useRef(null); - const resultWrapper = useRef(null); - - const redrawGraphs = useCallback(() => { - if (graph) { - // list mode may has scrollbar - // when switch to graph mode, scrollbar hides quickly but resize event cannot dispatch - // at this scenario we have to manually calculate the width - // however when set resultWrapper style with overflow: hidden - // window.innerWidth equals to document.body.scrollWidth - // no need to write code below: - - // let width: string; - // if (window.innerWidth - document.body.scrollWidth > 0) { - // width = String(window.innerWidth - 126) + 'px'; - // } else { - // width = getComputedStyle(resultWrapper.current!).width as string; - // } - - if ( - graphViewStore.originalGraphViewData !== null && - graphViewStore.originalGraphViewData.vertices.length === 0 && - graphViewStore.originalGraphViewData.edges.length === 0 - ) { - graph.setSize('0', '0'); - graph.redraw(); - return; - } - - const width = - String( - Number( - (getComputedStyle(resultWrapper.current!).width as string).split( - 'px' - )[0] - ) + 2 - ) + 'px'; - const height = - String( - Number( - (getComputedStyle(resultWrapper.current!).height as string).split( - 'px' - )[0] - ) + 2 - ) + 'px'; - - graph.setSize(width, height); - graph.redraw(); - } - }, [graph, graphViewStore.originalGraphViewData]); - - useEffect(() => { - graphViewStore.fetchGraphViewData( - dataAnalyzeStore.colorMappings, - dataAnalyzeStore.vertexSizeMappings, - dataAnalyzeStore.vertexWritingMappings, - dataAnalyzeStore.edgeColorMappings, - dataAnalyzeStore.edgeThicknessMappings, - dataAnalyzeStore.edgeWithArrowMappings, - dataAnalyzeStore.edgeWritingMappings - ); - - return () => { - graphViewStore.dispose(); - }; - }, [ - dataAnalyzeStore.colorMappings, - dataAnalyzeStore.vertexSizeMappings, - dataAnalyzeStore.vertexWritingMappings, - dataAnalyzeStore.edgeColorMappings, - dataAnalyzeStore.edgeThicknessMappings, - dataAnalyzeStore.edgeWithArrowMappings, - dataAnalyzeStore.edgeWritingMappings, - graphViewStore - ]); - - useEffect(() => { - const graphNodes = new vis.DataSet(graphViewStore.graphNodes); - const graphEdges = new vis.DataSet(graphViewStore.graphEdges); - - if (!graph) { - const data = { - nodes: graphNodes, - edges: graphEdges - }; - - const layout: vis.Options = { - nodes: { - shape: 'dot' - }, - edges: { - arrowStrikethrough: false, - color: { - color: 'rgba(92, 115, 230, 0.8)', - hover: 'rgba(92, 115, 230, 1)', - highlight: 'rgba(92, 115, 230, 1)' - }, - scaling: { - min: 1, - max: 3, - label: { - enabled: false - } - } - }, - interaction: { - hover: true - }, - physics: { - maxVelocity: 50, - solver: 'forceAtlas2Based', - forceAtlas2Based: { - avoidOverlap: 0 - }, - timestep: 0.3, - stabilization: { iterations: 150 } - } - }; - - if (graphWrapper.current !== null) { - const network = new vis.Network(graphWrapper!.current, data, layout); - - network.on('click', ({ nodes, edges }) => { - // click on node, note that edges(related) also has value - if (!isEmpty(nodes)) { - // note: cannot abstract switchClickOn...() and clearTimeout - // as common callings with node and edge, since click event - // would be dispatched even if click is not on node and edge - // dataAnalyzeStore.switchClickOnNodeOrEdge(true); - // clearTimeout(timer); - - // caution: nodeId is automatically converted to number - const nodeId = nodes[0]; - - if (graphViewStore.graphViewData !== null) { - const index = vertexTypeStore.vertexTypes.findIndex( - (vertex) => vertex.name === String(nodeId) - ); - - if (index === -1) { - return; - } - - vertexTypeStore.selectVertexType(index); - - // check also needs style infos - vertexTypeStore.mutateEditedSelectedVertexType({ - ...vertexTypeStore.editedSelectedVertexType, - style: { - color: vertexTypeStore.selectedVertexType!.style.color, - icon: null, - size: vertexTypeStore.selectedVertexType!.style.size, - display_fields: vertexTypeStore.selectedVertexType!.style - .display_fields - } - }); - - graphViewStore.setCurrentDrawer('check-vertex'); - graphViewStore.switchNodeOrEdgeClicked(true); - - // check if vertex type being used - vertexTypeStore.checkIfUsing([ - vertexTypeStore.selectedVertexType!.name - ]); - } - - return; - } - - if (!isEmpty(edges)) { - const edgeId = edges[0]; - - if (graphViewStore.graphViewData !== null) { - const index = edgeTypeStore.edgeTypes.findIndex( - (edge) => - generateGraphModeId( - edge.name, - edge.source_label, - edge.target_label - ) === edgeId - ); - - if (index === -1) { - return; - } - - edgeTypeStore.selectEdgeType(index); - // check also needs style infos - edgeTypeStore.mutateEditedSelectedEdgeType({ - ...edgeTypeStore.editedSelectedEdgeType, - style: { - color: edgeTypeStore.selectedEdgeType!.style.color, - icon: null, - with_arrow: edgeTypeStore.selectedEdgeType!.style.with_arrow, - thickness: edgeTypeStore.selectedEdgeType!.style.thickness, - display_fields: edgeTypeStore.selectedEdgeType!.style - .display_fields - } - }); - - graphViewStore.setCurrentDrawer('check-edge'); - graphViewStore.switchNodeOrEdgeClicked(true); - } - } - }); - - network.on('dragEnd', (e) => { - if (!isEmpty(e.nodes)) { - network.unselectAll(); - } - }); - - network.once('stabilizationIterationsDone', () => { - switchShowLoadingGraphs(false); - }); - - setGraph(network); - graphViewStore.setVisNetwork(network); - } - } else { - // if graph view data arrives, init to graph - if (graphViewStore.originalGraphViewData !== null && !isGraphDataLoaded) { - // switchIsGraphLoaded(true); - - graph.setData({ - nodes: graphNodes, - edges: graphEdges - }); - - graphViewStore.setVisDataSet({ - nodes: graphNodes, - edges: graphEdges - }); - } - - redrawGraphs(); - } - }, [ - graph, - graphViewStore.graphEdges, - graphViewStore.graphNodes, - redrawGraphs, - vertexTypeStore, - edgeTypeStore, - graphViewStore, - isGraphDataLoaded - ]); - - useEffect(() => { - window.addEventListener('resize', redrawGraphs, false); - - return () => { - window.removeEventListener('resize', redrawGraphs); - }; - }, [redrawGraphs]); - - return ( - <> -
-
- {graphViewStore.requestStatus.fetchGraphViewData === 'pending' && ( -
-
- {t('addition.operate.load-background')} - {t('addition.operate.load-spinner')} -
- {t('addition.message.data-loading')}... -
- )} - {graphViewStore.requestStatus.fetchGraphViewData === 'success' && - showLoadingGraphs && - (!isEmpty(graphViewStore.originalGraphViewData!.vertices) || - !isEmpty(graphViewStore.originalGraphViewData!.edges)) && ( -
-
- {t('addition.operate.load-background')} - {t('addition.operate.load-spinner')} -
- {t('addition.operate.rendering')}... -
- )} - {graphViewStore.requestStatus.fetchGraphViewData === 'success' && - graphViewStore.isGraphVertexEmpty && - isEmpty(graphViewStore.originalGraphViewData!.vertices) && - isEmpty(graphViewStore.originalGraphViewData!.edges) && ( - - )} -
- - ); -}); - -const EmptyGraphDataView: React.FC<{ hasProeprties: boolean }> = observer( - ({ hasProeprties }) => { - const { t } = useTranslation(); - return ( -
-
- {t('addition.message.no-metadata-notice')} -
- {hasProeprties - ? t('addition.message.no-vertex-or-edge-notice') - : t('addition.message.no-metadata-notice')} -
-
-
- ); - } -); - -export default GraphView; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/index.ts deleted file mode 100644 index 22850d2f3..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/graph-view/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import GraphView from './GraphView'; - -export { GraphView }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/index.ts deleted file mode 100644 index b242a5f99..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import MetadataConfigs from './MetadataConfigs'; - -export { MetadataConfigs }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/PropertyIndex.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/PropertyIndex.less deleted file mode 100644 index a3329baee..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/PropertyIndex.less +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.vertex-index-wrapper { - width: 100%; - background: #fff; - border-radius: 0 3px 3px 3px; - padding: 16px; -} - -.vertex-index-tab-wrapper { - display: flex; - width: 100%; - margin-top: 16px; - - & > .vertex-index-tab-index { - padding: 10px 25px; - height: 40px; - color: #333; - font-size: 14px; - text-align: center; - line-height: 20px; - cursor: pointer; - - &.active { - background-color: #fff; - color: #2b65ff; - border-radius: 3px 3px 0 0; - } - } -} - -.vertex-index-search-highlights { - background: transparent; - color: #2b65ff; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/PropertyIndex.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/PropertyIndex.tsx deleted file mode 100644 index 02502337d..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/PropertyIndex.tsx +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useState, useEffect } from 'react'; -import { observer } from 'mobx-react'; -import Highlighter from 'react-highlight-words'; -import { motion } from 'framer-motion'; -import { Input, Table } from 'hubble-ui'; - -import { LoadingDataView } from '../../../common'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; -import './PropertyIndex.less'; -import i18next from '../../../../i18n'; -import { useTranslation } from 'react-i18next'; - -const variants = { - initial: { - opacity: 0 - }, - animate: { - opacity: 1, - transition: { - duration: 0.7 - } - }, - exit: { - opacity: 0, - transition: { - duration: 0.3 - } - } -}; - -const IndexTypeMappings: Record = { - SECONDARY: i18next.t('addition.menu.secondary-index'), - RANGE: i18next.t('addition.menu.range-index'), - SEARCH: i18next.t('addition.menu.full-text-index') -}; - -const PropertyIndex: React.FC = observer(() => { - const { metadataPropertyIndexStore } = useContext(MetadataConfigsRootStore); - const [preLoading, switchPreLoading] = useState(true); - const [currentTab, switchCurrentTab] = useState<'vertex' | 'edge'>('vertex'); - const { t } = useTranslation(); - const isLoading = - preLoading || - metadataPropertyIndexStore.requestStatus.fetchMetadataPropertIndexes === - 'pending'; - - const handleSearchChange = (e: React.ChangeEvent) => { - metadataPropertyIndexStore.mutateSearchWords(e.target.value); - }; - - const handleSearch = () => { - metadataPropertyIndexStore.mutatePageNumber(1); - metadataPropertyIndexStore.switchIsSearchedStatus(true); - metadataPropertyIndexStore.fetchMetadataPropertIndexes(currentTab); - }; - - const handleClearSearch = () => { - metadataPropertyIndexStore.mutateSearchWords(''); - metadataPropertyIndexStore.mutatePageNumber(1); - metadataPropertyIndexStore.switchIsSearchedStatus(false); - metadataPropertyIndexStore.fetchMetadataPropertIndexes(currentTab); - }; - - const handlePageNumberChange = (e: React.ChangeEvent) => { - metadataPropertyIndexStore.mutatePageNumber(Number(e.target.value)); - metadataPropertyIndexStore.fetchMetadataPropertIndexes(currentTab); - }; - - useEffect(() => { - setTimeout(() => { - switchPreLoading(false); - }, 500); - }, [currentTab]); - - useEffect(() => { - metadataPropertyIndexStore.fetchMetadataPropertIndexes(currentTab); - - return () => { - metadataPropertyIndexStore.dispose(); - }; - }, [currentTab, metadataPropertyIndexStore]); - - const columnConfigs = [ - { - title: - currentTab === 'vertex' - ? t('addition.vertex.vertex-type-name') - : t('addition.common.edge-type-name'), - dataIndex: 'owner', - render(text: string, records: any[], index: number) { - if (metadataPropertyIndexStore.collpaseInfo === null) { - // need highlighter here since searched result could be one row - return ( - - ); - } - - const [collpaseStartIndexes, collpaseNumbers] = - metadataPropertyIndexStore.collpaseInfo; - - const startIndex = collpaseStartIndexes.findIndex( - (indexNumber) => indexNumber === index - ); - - return startIndex !== -1 - ? { - children: ( -
- -
- ), - props: { - rowSpan: collpaseNumbers[startIndex] - } - } - : { - children: ( -
- -
- ), - props: { - rowSpan: 0 - } - }; - } - }, - { - title: t('addition.edge.index-name'), - dataIndex: 'name', - render(text: string) { - return ( -
- -
- ); - } - }, - { - title: t('addition.edge.index-type'), - dataIndex: 'type', - render(text: string) { - return IndexTypeMappings[text]; - } - }, - { - title: t('addition.common.property'), - dataIndex: 'fields', - render(properties: string[]) { - return ( -
- -
- ); - } - } - ]; - - return ( - -
-
{ - if (currentTab !== 'vertex') { - metadataPropertyIndexStore.fetchMetadataPropertIndexes('vertex'); - } - - metadataPropertyIndexStore.mutateSearchWords(''); - metadataPropertyIndexStore.mutatePageNumber(1); - metadataPropertyIndexStore.switchIsSearchedStatus(false); - switchCurrentTab('vertex'); - switchPreLoading(true); - }} - className={ - currentTab === 'vertex' - ? 'vertex-index-tab-index active' - : 'vertex-index-tab-index' - } - > - {t('addition.vertex.vertex-index')} -
-
{ - if (currentTab !== 'edge') { - metadataPropertyIndexStore.fetchMetadataPropertIndexes('edge'); - } - - metadataPropertyIndexStore.mutateSearchWords(''); - metadataPropertyIndexStore.mutatePageNumber(1); - metadataPropertyIndexStore.switchIsSearchedStatus(false); - switchCurrentTab('edge'); - switchPreLoading(true); - }} - className={ - currentTab === 'edge' - ? 'vertex-index-tab-index active' - : 'vertex-index-tab-index' - } - > - {t('addition.edge.edge-index')} -
-
-
-
- -
-
{t('addition.common.no-result')} - ) : ( - {t('addition.message.no-index-notice')} - ) - } - /> - ) - }} - dataSource={ - isLoading ? [] : metadataPropertyIndexStore.metadataPropertyIndexes - } - pagination={ - isLoading - ? null - : { - hideOnSinglePage: false, - pageNo: - metadataPropertyIndexStore.metadataPropertyIndexPageConfig - .pageNumber, - pageSize: 10, - showSizeChange: false, - showPageJumper: false, - total: - metadataPropertyIndexStore.metadataPropertyIndexPageConfig - .pageTotal, - onPageNoChange: handlePageNumberChange - } - } - /> - - - ); -}); - -export default PropertyIndex; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/index.ts deleted file mode 100644 index e851e9b3d..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property-index/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import PropertyIndex from './PropertyIndex'; - -export { PropertyIndex }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/MetadataProperties.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/MetadataProperties.less deleted file mode 100644 index cdcdbff7f..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/MetadataProperties.less +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.metadata-configs { - .metadata-properties { - &-selected-reveals { - width: 100%; - height: 40px; - padding: 0 16px; - display: flex; - background: #2b65ff; - border-radius: 3px 3px 0 0; - font-size: 14px; - align-items: center; - color: #fff; - - & > div { - margin-right: 12px; - } - - & > img { - margin-left: auto; - cursor: pointer; - } - } - - &-manipulation { - font-size: 14px; - color: #2b65ff; - cursor: pointer; - - &:hover { - color: #527dff; - } - - &:active { - color: #184bcc; - } - } - - &-search-highlights { - background: transparent; - color: #2b65ff; - cursor: pointer; - } - } -} - -.metadata-properties-modal { - &-title { - display: flex; - justify-content: space-between; - margin-bottom: 20px; - - & > img { - cursor: pointer; - } - } - - &-description { - margin-bottom: 16px; - color: #333; - } -} - -.property-status-not-used { - width: 58px; - height: 28px; - background: #f2fff4; - border: 1px solid #7ed988; - border-radius: 2px; - font-size: 14px; - color: #39bf45; - letter-spacing: 0; - line-height: 28px; - text-align: center; -} - -.property-status-is-using { - width: 58px; - height: 28px; - background: #fff2f2; - border: 1px solid #ff9499; - border-radius: 2px; - font-size: 14px; - color: #e64552; - letter-spacing: 0; - line-height: 28px; - text-align: center; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/MetadataProperties.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/MetadataProperties.tsx deleted file mode 100644 index 52537647b..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/MetadataProperties.tsx +++ /dev/null @@ -1,912 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import { intersection, size, without, values } from 'lodash-es'; -import { motion } from 'framer-motion'; -import { - Input, - Button, - Table, - Modal, - Select, - Message, - Loading -} from 'hubble-ui'; -import Highlighter from 'react-highlight-words'; - -import { Tooltip, LoadingDataView } from '../../../common'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; - -import type { MetadataProperty } from '../../../../stores/types/GraphManagementStore/metadataConfigsStore'; - -import AddIcon from '../../../../assets/imgs/ic_add.svg'; -import CloseIcon from '../../../../assets/imgs/ic_close_16.svg'; -import WhiteCloseIcon from '../../../../assets/imgs/ic_close_white.svg'; -import './MetadataProperties.less'; -import ReuseProperties from './ReuseProperties'; -import { useTranslation } from 'react-i18next'; - -const styles = { - button: { - marginLeft: '12px', - width: 78 - }, - extraMargin: { - marginRight: 4 - }, - deleteWrapper: { - display: 'flex', - justifyContent: 'flex-end' - }, - loading: { - padding: 0, - marginRight: 4 - } -}; - -const dataTypeOptions = [ - 'string', - 'boolean', - 'byte', - 'int', - 'long', - 'float', - 'double', - 'date', - 'uuid', - 'blob' -]; - -const cardinalityOptions = ['single', 'list', 'set']; - -const variants = { - initial: { - opacity: 0 - }, - animate: { - opacity: 1, - transition: { - duration: 0.7 - } - }, - exit: { - opacity: 0, - transition: { - duration: 0.3 - } - } -}; - -const MetadataProperties: React.FC = observer(() => { - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const { t } = useTranslation(); - const metadataConfigsRootStore = useContext(MetadataConfigsRootStore); - const { metadataPropertyStore, graphViewStore } = metadataConfigsRootStore; - const [preLoading, switchPreLoading] = useState(true); - const [sortOrder, setSortOrder] = useState(''); - const [selectedRowKeys, mutateSelectedRowKeys] = useState([]); - const [isShowModal, switchShowModal] = useState(false); - - const isLoading = - preLoading || - metadataPropertyStore.requestStatus.fetchMetadataPropertyList === 'pending'; - - const currentSelectedRowKeys = intersection( - selectedRowKeys, - metadataPropertyStore.metadataProperties.map(({ name }) => name) - ); - - const printError = () => { - Message.error({ - content: metadataPropertyStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - }; - - const handleSearchChange = (e: React.ChangeEvent) => { - metadataPropertyStore.mutateSearchWords(e.target.value); - }; - - const handleSearch = async () => { - metadataPropertyStore.mutatePageNumber(1); - metadataPropertyStore.switchIsSearchedStatus(true); - await metadataPropertyStore.fetchMetadataPropertyList(); - - if ( - metadataPropertyStore.requestStatus.fetchMetadataPropertyList === 'failed' - ) { - printError(); - } - }; - - const handleClearSearch = () => { - metadataPropertyStore.mutateSearchWords(''); - metadataPropertyStore.mutatePageNumber(1); - metadataPropertyStore.switchIsSearchedStatus(false); - metadataPropertyStore.fetchMetadataPropertyList(); - }; - - const handleSelectedTableRow = ( - newSelectedRowKeys: string[], - selectedRows: MetadataProperty[] - ) => { - mutateSelectedRowKeys(newSelectedRowKeys); - // mutateSelectedRowKeys(selectedRows.map(({ name }) => name)); - }; - - const handleSortClick = () => { - switchPreLoading(true); - - if (sortOrder === 'descend') { - metadataPropertyStore.mutatePageSort('asc'); - setSortOrder('ascend'); - } else { - metadataPropertyStore.mutatePageSort('desc'); - setSortOrder('descend'); - } - - metadataPropertyStore.fetchMetadataPropertyList(); - }; - - const handlePageChange = async (e: React.ChangeEvent) => { - // mutateSelectedRowKeys([]); - metadataPropertyStore.mutatePageNumber(Number(e.target.value)); - await metadataPropertyStore.fetchMetadataPropertyList(); - - if ( - metadataPropertyStore.requestStatus.fetchMetadataPropertyList === 'failed' - ) { - printError(); - } - }; - - const batchDeleteProperties = async () => { - if ( - values(currentSelectedRowKeys).every( - (key) => metadataPropertyStore.metadataPropertyUsingStatus?.[key] - ) - ) { - Message.error({ - content: t('addition.message.no-property-can-delete'), - size: 'medium', - showCloseIcon: false - }); - - return; - } - - switchShowModal(false); - // need to set a copy in store since local row key state would be cleared - metadataPropertyStore.mutateSelectedMetadataProperyNames( - currentSelectedRowKeys - ); - // mutateSelectedRowKeys([]); - await metadataPropertyStore.deleteMetadataProperty(currentSelectedRowKeys); - // metadataPropertyStore.mutateSelectedMetadataProperyNames([]); - - if ( - metadataPropertyStore.requestStatus.deleteMetadataProperty === 'success' - ) { - Message.success({ - content: t('addition.common.del-success'), - size: 'medium', - showCloseIcon: false - }); - - mutateSelectedRowKeys( - without(selectedRowKeys, ...currentSelectedRowKeys) - ); - - await metadataPropertyStore.fetchMetadataPropertyList(); - - // fetch previous page data if it's empty - if ( - metadataPropertyStore.requestStatus.fetchMetadataPropertyList === - 'success' && - size(metadataPropertyStore.metadataProperties) === 0 && - metadataPropertyStore.metadataPropertyPageConfig.pageNumber > 1 - ) { - metadataPropertyStore.mutatePageNumber( - metadataPropertyStore.metadataPropertyPageConfig.pageNumber - 1 - ); - - metadataPropertyStore.fetchMetadataPropertyList(); - } - - return; - } - - if ( - metadataPropertyStore.requestStatus.deleteMetadataProperty === 'failed' - ) { - printError(); - } - }; - - // hack: need to call @observable at here to dispatch re-render by mobx - // since @action in onBlur() in doesn't dispatch re-render - metadataPropertyStore.validateNewPropertyErrorMessage.name.toLowerCase(); - - const columnConfigs = [ - { - title: t('addition.common.property-name'), - dataIndex: 'name', - width: '45%', - sorter: true, - sortOrder, - render(text: string, records: any, index: number) { - if (metadataPropertyStore.isCreateNewProperty === true && index === 0) { - return ( - { - metadataPropertyStore.mutateNewProperty({ - ...metadataPropertyStore.newMetadataProperty, - _name: e.value - }); - - metadataPropertyStore.validateNewProperty(); - }} - originInputProps={{ - autoFocus: 'autoFocus', - onBlur() { - metadataPropertyStore.validateNewProperty(); - } - }} - /> - ); - } - - return ( -
- {metadataPropertyStore.isSearched.status ? ( - - ) : ( - {text} - )} -
- ); - } - }, - { - title: t('addition.common.data-type'), - dataIndex: 'data_type', - width: '20%', - render(text: string, records: any, index: number) { - if (metadataPropertyStore.isCreateNewProperty === true && index === 0) { - return ( - - ); - } - - const realText = text === 'TEXT' ? 'string' : text.toLowerCase(); - - return ( -
- {realText} -
- ); - } - }, - { - title: t('addition.common.cardinal-number'), - dataIndex: 'cardinality', - width: '20%', - render(text: string, records: any, index: number) { - if (metadataPropertyStore.isCreateNewProperty === true && index === 0) { - return ( - - ); - } - - return ( -
- {text.toLowerCase()} -
- ); - } - }, - { - title: t('addition.operate.operate'), - dataIndex: 'manipulation', - width: '15%', - align: 'right', - render(_: any, records: any, index: number) { - return ( - - ); - } - } - ]; - - useEffect(() => { - setTimeout(() => { - switchPreLoading(false); - }, 500); - }, [sortOrder]); - - useEffect(() => { - if (metadataConfigsRootStore.currentId !== null) { - metadataPropertyStore.fetchMetadataPropertyList(); - } - - return () => { - metadataPropertyStore.dispose(); - }; - }, [ - metadataPropertyStore, - metadataConfigsRootStore.currentId, - graphViewStore - ]); - - // these would be called before rendered, pre-load some data here - // useEffect(() => { - // dataAnalyzeStore.fetchAllNodeStyle(); - // dataAnalyzeStore.fetchAllEdgeStyle(); - // }, [dataAnalyzeStore]); - - if (metadataPropertyStore.currentTabStatus === 'reuse') { - return ; - } - - return ( - -
-
- - - -
- {size(currentSelectedRowKeys) !== 0 && ( -
-
- {t('addition.message.selected')} - {size(currentSelectedRowKeys)} - {t('addition.common.term')} -
- - {t('addition.common.close')} { - mutateSelectedRowKeys([]); - }} - /> -
- )} -
rowData.name} - locale={{ - emptyText: ( - {t('addition.common.no-result')} - ) : ( - - ) - } - /> - ) - }} - rowSelection={{ - selectedRowKeys, - onChange: handleSelectedTableRow - }} - onSortClick={handleSortClick} - dataSource={ - isLoading - ? [] - : metadataPropertyStore.isCreateNewProperty - ? metadataPropertyStore.reunionMetadataProperty - : metadataPropertyStore.metadataProperties - } - pagination={ - isLoading - ? null - : { - hideOnSinglePage: false, - pageNo: - metadataPropertyStore.metadataPropertyPageConfig.pageNumber, - pageSize: 10, - showSizeChange: false, - showPageJumper: false, - total: - metadataPropertyStore.metadataPropertyPageConfig.pageTotal, - onPageNoChange: handlePageChange - } - } - /> - { - switchShowModal(false); - }} - > -
-
- {t('addition.common.del-comfirm')} - {t('addition.common.close')} { - switchShowModal(false); - }} - /> -
-
- {t('addition.message.del-unused-property-notice')} -
-
) { - return ( - - {text} - - ); - } - }, - { - title: t('addition.common.status'), - dataIndex: 'status', - render(isUsing: boolean) { - return ( -
- {isUsing - ? t('addition.common.in-use') - : t('addition.common.not-used')} -
- ); - } - } - ]} - dataSource={currentSelectedRowKeys.map((name) => { - return { - name, - status: - metadataPropertyStore.metadataPropertyUsingStatus !== - null && - // data may have some delay which leads to no matching propety value - !!metadataPropertyStore.metadataPropertyUsingStatus[name] - }; - })} - pagination={false} - /> - - - - - ); -}); - -export interface MetadataPropertiesManipulationProps { - propertyName: string; - propertyIndex: number; - // allSelectedKeys: number[]; -} - -const MetadataPropertiesManipulation: React.FC = - observer(({ propertyName, propertyIndex }) => { - const { metadataPropertyStore } = useContext(MetadataConfigsRootStore); - const { t } = useTranslation(); - const [isPopDeleteModal, switchPopDeleteModal] = useState(false); - const [isDeleting, switchDeleting] = useState(false); - const deleteWrapperRef = useRef(null); - const isDeleteOrBatchDeleting = - isDeleting || - (metadataPropertyStore.requestStatus.deleteMetadataProperty === - 'pending' && - metadataPropertyStore.selectedMetadataPropertyNames.includes( - propertyName - )); - - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - if ( - isPopDeleteModal && - deleteWrapperRef && - deleteWrapperRef.current && - !deleteWrapperRef.current.contains(e.target as Element) - ) { - switchPopDeleteModal(false); - } - }, - [deleteWrapperRef, isPopDeleteModal] - ); - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - if ( - metadataPropertyStore.isCreateNewProperty === true && - propertyIndex === 0 - ) { - return ( -
- { - metadataPropertyStore.validateNewProperty(); - - if (!metadataPropertyStore.isCreatedReady) { - return; - } - - metadataPropertyStore.switchIsCreateNewProperty(false); - await metadataPropertyStore.addMetadataProperty(); - - if ( - metadataPropertyStore.requestStatus.addMetadataProperty === - 'success' - ) { - Message.success({ - content: t('addition.newGraphConfig.create-scuccess'), - size: 'medium', - showCloseIcon: false - }); - } - - if ( - metadataPropertyStore.requestStatus.addMetadataProperty === - 'failed' - ) { - Message.error({ - content: metadataPropertyStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - } - - metadataPropertyStore.fetchMetadataPropertyList(); - metadataPropertyStore.resetNewProperties(); - }} - > - {t('addition.newGraphConfig.create')} - - { - metadataPropertyStore.switchIsCreateNewProperty(false); - metadataPropertyStore.resetNewProperties(); - metadataPropertyStore.resetValidateNewProperty(); - - if (metadataPropertyStore.metadataProperties.length === 0) { - metadataPropertyStore.changeCurrentTabStatus('empty'); - } - }} - > - {t('addition.common.cancel')} - -
- ); - } - - return ( -
- {isDeleteOrBatchDeleting && ( - - )} - - {metadataPropertyStore.metadataPropertyUsingStatus && - metadataPropertyStore.metadataPropertyUsingStatus[ - propertyName - ] ? ( -

- {t('addition.message.property-using-cannot-delete')} -

- ) : ( - <> -

- {t('addition.message.property-del-confirm')} -

-

{t('addition.message.property-del-confirm-again')}

-

{t('addition.message.long-time-notice')}

-
- - -
- - )} -
- } - childrenProps={{ - className: 'metadata-properties-manipulation no-line-break', - style: styles.extraMargin, - title: isDeleteOrBatchDeleting - ? t('addition.operate.del-ing') - : t('addition.common.del'), - async onClick() { - if (isDeleteOrBatchDeleting) { - return; - } - - await metadataPropertyStore.checkIfUsing([propertyName]); - - if ( - metadataPropertyStore.requestStatus.checkIfUsing === 'success' - ) { - switchPopDeleteModal(true); - } - } - }} - > - {isDeleteOrBatchDeleting - ? t('addition.operate.del-ing') - : t('addition.common.del')} - - - ); - }); - -const EmptyPropertyHints: React.FC = observer(() => { - const { metadataPropertyStore } = useContext(MetadataConfigsRootStore); - const { t } = useTranslation(); - return ( -
- Add new property -
- {t('addition.message.property-create-desc')} -
-
- - -
-
- ); -}); - -export default MetadataProperties; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/ReuseProperties.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/ReuseProperties.less deleted file mode 100644 index 71698137e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/ReuseProperties.less +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.reuse-properties-wrapper { - width: 100%; - background: #fff; - margin-top: 16px; - padding: 16px; - - .reuse-steps { - width: 860px; - margin: 16px auto 18px; - } - - .reuse-properties { - &-row { - display: flex; - align-items: center; - margin: 18px 0 32px; - font-size: 14px; - color: #333; - - &:last-child { - margin-bottom: 24px; - } - - &-name { - width: 98px; - text-align: right; - margin-right: 13.9px; - } - } - - &-manipulations { - display: flex; - justify-content: center; - margin-bottom: 88px; - } - - &-validate { - &-duplicate, - &-exist, - &-pass { - width: 58px; - margin: 0 auto; - border-radius: 2px; - letter-spacing: 0; - line-height: 22px; - text-align: center; - } - - &-duplicate { - background: #fff2f2; - border: 1px solid #ff9499; - color: #e64552; - } - - &-exist, - &-pass { - background: #f2fff4; - border: 1px solid #7ed988; - color: #39bf45; - } - } - - &-complete-hint { - display: flex; - flex-direction: column; - justify-content: center; - margin: 88px auto 327px; - - &-description { - display: flex; - justify-content: center; - - & > div { - margin-left: 20px; - } - } - - &-manipulations { - margin: 42px auto 0; - } - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/ReuseProperties.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/ReuseProperties.tsx deleted file mode 100644 index 032257db3..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/ReuseProperties.tsx +++ /dev/null @@ -1,542 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useState, useEffect } from 'react'; -import { observer } from 'mobx-react'; -import { - Select, - Steps, - Transfer, - Button, - Table, - Input, - Message -} from 'hubble-ui'; -import { cloneDeep } from 'lodash-es'; -import { useTranslation } from 'react-i18next'; - -import { GraphManagementStoreContext } from '../../../../stores'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; - -import PassIcon from '../../../../assets/imgs/ic_pass.svg'; - -import './ReuseProperties.less'; - -const ReuseProperties: React.FC = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const metadataConfigsRootStore = useContext(MetadataConfigsRootStore); - const { metadataPropertyStore } = metadataConfigsRootStore; - const { t } = useTranslation(); - const [currentStatus, setCurrentStatus] = useState(1); - // acutally the name, not id in database - const [selectedId, mutateSelectedId] = useState<[] | string>([]); - const [selectedList, mutateSelectedList] = useState([]); - - // step 2 - const [editIndex, setEditIndex] = useState(null); - - // hack: need to call @observable at here to dispatch re-render by mobx - // since @action in onBlur() in doesn't dispatch re-render - metadataPropertyStore.validateRenameReusePropertyErrorMessage.name.toUpperCase(); - - const columnConfigs = [ - { - title: t('addition.common.property-name'), - dataIndex: 'name', - width: '50%', - render(text: string, records: any, index: number) { - if (editIndex !== index) { - return ( -
- {text} -
- ); - } - - return ( - { - const editedCheckedReusableProperties = cloneDeep( - metadataPropertyStore.editedCheckedReusableProperties! - ); - - editedCheckedReusableProperties.propertykey_conflicts[ - index - ].entity.name = e.value; - - metadataPropertyStore.mutateEditedReusableProperties( - editedCheckedReusableProperties - ); - }} - originInputProps={{ - onBlur() { - metadataPropertyStore.validateRenameReuseProperty(index); - } - }} - /> - ); - } - }, - { - title: t('addition.common.data-type'), - dataIndex: 'data_type', - width: '15%', - render(text: string) { - if (text === 'TEXT') { - return ( -
- string -
- ); - } - - return ( -
- {text.toLowerCase()} -
- ); - } - }, - { - title: t('addition.edge.verification-result'), - dataIndex: 'status', - align: 'center', - width: '15%', - render(value: string, records: any, index: number) { - let classname = ''; - let text = ''; - - if ( - metadataPropertyStore.reusablePropertyNameChangeIndexes.has(index) - ) { - return ( -
- {t('addition.edge.be-verified')} -
- ); - } - - switch (value) { - case 'DUPNAME': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.duplicate-name'); - break; - - case 'EXISTED': - classname = 'reuse-properties-validate-exist'; - text = t('addition.message.already-exist'); - break; - - case 'PASSED': - classname = 'reuse-properties-validate-pass'; - text = t('addition.message.pass'); - break; - } - - return
{text}
; - } - }, - { - title: t('addition.operate.operate'), - dataIndex: 'manipulation', - width: '20%', - render(_: never, records: any, index: number) { - if (index === editIndex) { - return ( -
- { - const isReady = metadataPropertyStore.validateRenameReuseProperty( - index - ); - - if (isReady) { - setEditIndex(null); - - metadataPropertyStore.mutateReusablePropertyNameChangeIndexes( - index - ); - } - }} - > - {t('addition.common.save')} - - { - setEditIndex(null); - metadataPropertyStore.resetValidateRenameReuseProperty(); - metadataPropertyStore.resetEditedReusablePropertyName(index); - }} - > - {t('addition.common.cancel')} - -
- ); - } - - return ( -
- { - if (editIndex !== null) { - return; - } - - setEditIndex(index); - }} - > - {t('addition.operate.rename')} - - { - if (editIndex !== null) { - return; - } - - setEditIndex(null); - - const editedCheckedReusableProperties = cloneDeep( - metadataPropertyStore.editedCheckedReusableProperties! - ); - - editedCheckedReusableProperties.propertykey_conflicts.splice( - index, - 1 - ); - - // remove selected status of the property in - mutateSelectedList( - [...selectedList].filter( - (property) => - property !== - metadataPropertyStore.editedCheckedReusableProperties! - .propertykey_conflicts[index].entity.name - ) - ); - - // remove property in Table - metadataPropertyStore.mutateEditedReusableProperties( - editedCheckedReusableProperties - ); - }} - > - {t('addition.common.del')} - -
- ); - } - } - ]; - - useEffect(() => { - return () => { - // reset validate error message before unmount to avoid conflict with other component validation - metadataPropertyStore.resetValidateRenameReuseProperty(); - }; - }, [metadataPropertyStore]); - - return ( -
-
- {t('addition.operate.reuse-property')} -
-
- - {[ - t('addition.menu.select-reuse-item'), - t('addition.menu.confirm-reuse-item'), - t('addition.menu.complete-reuse') - ].map((title: string, index: number) => ( - index + 1 - ? 'finish' - : 'wait' - } - key={title} - /> - ))} - - - {currentStatus === 1 && ( - <> -
-
- * - {t('addition.newGraphConfig.id')}: -
- -
-
-
- * - {t('addition.operate.reuse-property')}: -
- name - )} - selectedList={selectedList} - showSearchBox={false} - candidateTreeStyle={{ - width: 359, - fontSize: 14 - }} - selectedTreeStyle={{ - width: 359, - fontSize: 14 - }} - handleSelect={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - handleSelectAll={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - handleDelete={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - handleDeleteAll={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - /> -
-
- - -
- - )} - - {currentStatus === 2 && ( - <> -
- {t('addition.common.selected-property')} -
-
({ - name: entity.name, - data_type: entity.data_type, - status - }) - ) - : [] - } - pagination={false} - /> -
- - -
- - )} - - {currentStatus === 3 && ( -
-
- {t('addition.message.reuse-complete')} -
-
{t('addition.message.reuse-complete')}
-
{t('addition.message.reuse-property-success')}
-
-
-
- - -
-
- )} - - - ); -}); - -export default ReuseProperties; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/index.ts deleted file mode 100644 index f83cd5d41..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/property/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import MetadataProperties from './MetadataProperties'; -import ReuseProperties from './ReuseProperties'; - -export { MetadataProperties, ReuseProperties }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.less deleted file mode 100644 index 362db1ec2..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.less +++ /dev/null @@ -1,1637 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.new-vertex-type-wrapper { - width: 100%; - background: #fff; - margin-top: 16px; - padding: 30px 0; - display: flex; - flex-direction: column; - align-items: center; - - .new-vertex-type { - &-title { - // prettier-ignore - font-family: - 'PingFangSC-Medium', - 'Microsoft YaHei Bold', - '微软雅黑', - Arial, - sans-serif; - width: 115px; - font-weight: bold; - margin-bottom: 16px; - text-align: right; - word-break: keep-all; - } - - &-manipulations, - &-options { - margin-bottom: 32px; - display: flex; - align-items: center; - - &-name { - width: 125px; - margin-right: 43.9px; - text-align: right; - color: #333; - font-size: 14px; - word-break: keep-all; - line-height: 32px; - } - - &-expands { - font-size: 14px; - color: #333; - } - } - } -} - -.metadata-drawer-options-name-edit { - line-height: 34px; -} - -// retrive from parent since drawer doesn't hangs on body element -.new-vertex-type-options-colors, -.new-vertex-type-options-sizes, -.new-vertex-type-options-arrows { - margin-right: 12px; -} - -.new-vertex-type-options-color { - width: 23px; - height: 23px; - line-height: 23px; -} - -.new-vertex-type-select { - width: 20px; - height: 20px; - line-height: 20px; -} - -.new-vertex-type-options-border { - border: #dae7fb solid 2px; -} - -.new-vertex-type-options-no-border { - border: white solid 2px; -} - -.new-vertex-type-options-no-border:hover { - border: #f5f5f5 solid 2px; -} - -.new-vertex-type-options { - margin-top: 5px; -} - -.new-fc-one-select-dropdown-menu-container .new-vertex-type-options-color { - width: 14px; - height: 14px; - margin: auto; -} - -/* override */ -.new-vertex-type-options-sizes .new-fc-one-select-dropdown-menu-container { - padding: 4px 0; -} - -/* stylelint-disable */ - -/** - * Colors - */ - -/* Brand colors */ - -/* Contextual colors */ - -/* Gray scale colors */ - -/** - * Typography - */ - -/** - * Spacing - */ - -/** - * Background colors - */ - -/** - * Borders - */ - -/* Border colors */ - -/* Separator colors */ - -/* Border radii */ - -/* Shadows */ - -/* Icons */ - -/* Font sizes */ - -/* Metrics */ - -/* Stylistic variants */ - -/* Focus rings */ - -/* Button group separator */ - -/* Font sizes */ - -/* Text decorations */ - -/* Stylistic variants */ - -/* Typography */ - -/* Metrics */ - -/* Colors */ - -/* Focus ring */ - -/* Checkbox group */ - -/* Typography */ - -/* Metrics */ - -/* Colors */ - -/* Focus ring */ - -/* Strong variant */ - -/* Checkbox group */ - -/* Metrics */ - -/* Colors */ - -/* Typography */ - -/* Font sizes */ - -/* Metrics */ - -/* Colors & states */ - -/* Focus rings */ - -/* Typography */ - -/* Metrics */ - -/* Character count */ - -/* Metrics */ - -/* Font sizes */ - -/* Metrics */ - -/* States */ - -/* Option group title */ - -/* Option dropdown */ - -/* Widths */ - -/* Metrics */ - -/* Colors */ - -/* Metrics */ - -/* Colors */ - -/* Typography */ - -/* Markers */ - -/* Spacing */ - -/* Statuses */ - -/* Metrics */ - -/* Colors */ - -/* Typography */ - -/* Metrics */ - -/* Colors */ - -/* Metrics */ - -/* Colors & States */ - -/* Metrics */ - -/* Headers */ - -/* Colors */ - -/* Metrics */ - -/* Typography */ - -/* Container */ - -/* Metrics */ - -/* Colors */ - -/* Indicators */ - -/* Stylistic variants */ - -/* Metrics */ - -/* Colors */ - -/* Metrics */ - -/* Colors */ - -/* Metrics */ - -/* Stylistic variants */ - -/* Metrics */ - -/* Colors */ - -/* Metrics */ - -/* Colors */ - -/* Pages */ - -/* Indicators */ - -/* Controls */ - -/* Pages */ -button::-moz-focus-inner, -input[type='reset']::-moz-focus-inner, -input[type='button']::-moz-focus-inner, -input[type='submit']::-moz-focus-inner, -input[type='file'] > input[type='button']::-moz-focus-inner { - border: none; -} - -@keyframes loadingCircle { - 0% { - transform-origin: 50% 50%; - transform: rotate(0deg); - } - - 100% { - transform-origin: 50% 50%; - transform: rotate(360deg); - } -} - -@font-face { - font-family: 'new-fc-one-icon'; - src: url('data:application/x-font-ttf;charset=utf-8;base64,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') - format('truetype'); - font-weight: normal; - font-style: normal; -} - -.new-fc-one-icon { - /* use !important to prevent issues with browser extensions that change fonts */ - font-family: 'new-fc-one-icon' !important; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.new-fc-one-icon-arrow-to-top::before { - content: '\e900'; -} - -.new-fc-one-icon-bullseye::before { - content: '\e901'; -} - -.new-fc-one-icon-calendar::before { - content: '\e91b'; -} - -.new-fc-one-icon-time::before { - content: '\e91f'; -} - -.new-fc-one-icon-ellipsis::before { - content: '\e902'; -} - -.new-fc-one-icon-envelope::before { - content: '\e903'; -} - -.new-fc-one-icon-fail::before { - content: '\e904'; -} - -.new-fc-one-icon-warning::before { - content: '\e905'; -} - -.new-fc-one-icon-file::before { - content: '\e906'; -} - -.new-fc-one-icon-flag::before { - content: '\e907'; -} - -.new-fc-one-icon-folder-open::before { - content: '\e908'; -} - -.new-fc-one-icon-folder::before { - content: '\e909'; -} - -.new-fc-one-icon-home::before { - content: '\e90a'; -} - -.new-fc-one-icon-info::before { - content: '\e90b'; -} - -.new-fc-one-icon-loading::before { - content: '\e90c'; -} - -.new-fc-one-icon-minus::before { - content: '\e90d'; -} - -.new-fc-one-icon-plus::before { - content: '\e90e'; -} - -.new-fc-one-icon-question::before { - content: '\e90f'; -} - -.new-fc-one-icon-search::before { - content: '\e910'; -} - -.new-fc-one-icon-success::before { - content: '\e911'; -} - -.new-fc-one-icon-sync-alt::before { - content: '\e912'; -} - -.new-fc-one-icon-heart-active::before { - content: '\e921'; - color: #f85d5d; -} - -.new-fc-one-icon-recommend::before { - content: '\e918'; -} - -.new-fc-one-icon-material::before { - content: '\e91d'; -} - -.new-fc-one-icon-delete::before { - content: '\e931'; - color: #666; -} - -.new-fc-one-icon-heart-o::before { - content: '\e932'; - color: #999; -} - -.new-fc-one-icon-fund::before { - content: '\e917'; -} - -.new-fc-one-icon-volume::before { - content: '\e930'; -} - -.new-fc-one-icon-suggest::before { - content: '\e913'; -} - -.new-fc-one-icon-budget::before { - content: '\e914'; -} - -.new-fc-one-icon-verify::before { - content: '\e915'; -} - -.new-fc-one-icon-accumulate::before { - content: '\e916'; -} - -.new-fc-one-icon-cost::before { - content: '\e919'; -} - -.new-fc-one-icon-transform::before { - content: '\e91a'; -} - -.new-fc-one-icon-filter::before { - content: '\e91c'; -} - -.new-fc-one-icon-refresh::before { - content: '\e91e'; -} - -.new-fc-one-icon-sorting::before { - content: '\e920'; -} - -.new-fc-one-icon-upload::before { - content: '\e923'; -} - -.new-fc-one-icon-angle-down::before { - content: '\e925'; -} - -.new-fc-one-icon-angle-left::before { - content: '\e926'; -} - -.new-fc-one-icon-angle-right::before { - content: '\e927'; -} - -.new-fc-one-icon-angle-up::before { - content: '\e928'; -} - -.new-fc-one-icon-append::before { - content: '\e929'; -} - -.new-fc-one-icon-arrow-down::before { - content: '\e92a'; -} - -.new-fc-one-icon-arrow-up::before { - content: '\e92b'; -} - -.new-fc-one-icon-check::before { - content: '\e92d'; -} - -.new-fc-one-icon-close::before { - content: '\e92e'; -} - -.new-fc-one-icon-copy::before { - content: '\e92f'; -} - -.new-fc-one-select-another-xsmall { - font-size: 12px; - border-radius: 2px; -} - -.new-fc-one-select-another-xsmall .new-fc-one-select-another-selection { - border-radius: 2px; -} - -.new-fc-one-select-another-xsmall - .new-fc-one-select-another-selection-text-error { - font-size: 12px; -} - -.new-fc-one-select-another-xsmall - .new-fc-one-select-another-selection__rendered { - line-height: 22px; -} - -.new-fc-one-select-another-xsmall - .new-fc-one-select-another-selection--multiple { - min-height: 22px; -} - -.new-fc-one-select-another-xsmall - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-selection__choice { - height: 16px; - line-height: 16px; - margin-top: 4px; - margin-bottom: 4px; -} - -.new-fc-one-select-another-xsmall - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-selection__clear, -.new-fc-one-select-another-xsmall - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-arrow { - top: 12px; -} - -.new-fc-one-select-another-xsmall - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-search__field__wrap - input { - font-size: 12px; -} - -.new-fc-one-select-another-dropdown-xsmall - .new-fc-one-select-another-dropdown-menu-item { - height: 24px; - line-height: 24px; - font-size: 12px; -} - -.new-fc-one-select-another-dropdown-xsmall - .new-fc-one-select-another-dropdown-menu-item - .new-fc-one-checkbox-wrapper - + span { - font-size: 12px; -} - -.new-fc-one-select-another-dropdown-xsmall - .new-fc-one-select-another-dropdown-menu-item-group-title { - height: 24px; - line-height: 24px; - font-size: 12px; -} - -.new-fc-one-select-another-small { - font-size: 12px; - border-radius: 2px; -} - -.new-fc-one-select-another-small .new-fc-one-select-another-selection { - border-radius: 2px; -} - -.new-fc-one-select-another-small - .new-fc-one-select-another-selection-text-error { - font-size: 12px; -} - -.new-fc-one-select-another-small - .new-fc-one-select-another-selection__rendered { - line-height: 26px; -} - -.new-fc-one-select-another-small - .new-fc-one-select-another-selection--multiple { - min-height: 26px; -} - -.new-fc-one-select-another-small - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-selection__choice { - height: 20px; - line-height: 20px; - margin-top: 4px; - margin-bottom: 4px; -} - -.new-fc-one-select-another-small - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-selection__clear, -.new-fc-one-select-another-small - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-arrow { - top: 14px; -} - -.new-fc-one-select-another-small - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-search__field__wrap - input { - font-size: 12px; -} - -.new-fc-one-select-another-dropdown-small - .new-fc-one-select-another-dropdown-menu-item { - height: 28px; - line-height: 28px; - font-size: 12px; -} - -.new-fc-one-select-another-dropdown-small - .new-fc-one-select-another-dropdown-menu-item - .new-fc-one-checkbox-wrapper - + span { - font-size: 12px; -} - -.new-fc-one-select-another-dropdown-small - .new-fc-one-select-another-dropdown-menu-item-group-title { - height: 28px; - line-height: 28px; - font-size: 12px; -} - -.new-fc-one-select-another-medium { - font-size: 14px; - border-radius: 3px; -} - -.new-fc-one-select-another-medium .new-fc-one-select-another-selection { - border-radius: 3px; -} - -.new-fc-one-select-another-medium - .new-fc-one-select-another-selection-text-error { - font-size: 14px; -} - -.new-fc-one-select-another-medium - .new-fc-one-select-another-selection__rendered { - line-height: 30px; -} - -.new-fc-one-select-another-medium - .new-fc-one-select-another-selection--multiple { - min-height: 30px; -} - -.new-fc-one-select-another-medium - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-selection__choice { - height: 24px; - line-height: 24px; - margin-top: 4px; - margin-bottom: 4px; -} - -.new-fc-one-select-another-medium - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-selection__clear, -.new-fc-one-select-another-medium - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-arrow { - top: 16px; -} - -.new-fc-one-select-another-medium - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-search__field__wrap - input { - font-size: 14px; -} - -.new-fc-one-select-another-dropdown-medium - .new-fc-one-select-another-dropdown-menu-item { - height: 32px; - line-height: 32px; - font-size: 14px; -} - -.new-fc-one-select-another-dropdown-medium - .new-fc-one-select-another-dropdown-menu-item - .new-fc-one-checkbox-wrapper - + span { - font-size: 14px; -} - -.new-fc-one-select-another-dropdown-medium - .new-fc-one-select-another-dropdown-menu-item-group-title { - height: 32px; - line-height: 32px; - font-size: 14px; -} - -.new-fc-one-select-another-large { - font-size: 16px; - border-radius: 4px; -} - -.new-fc-one-select-another-large .new-fc-one-select-another-selection { - border-radius: 4px; -} - -.new-fc-one-select-another-large - .new-fc-one-select-another-selection-text-error { - font-size: 16px; -} - -.new-fc-one-select-another-large - .new-fc-one-select-another-selection__rendered { - line-height: 34px; -} - -.new-fc-one-select-another-large - .new-fc-one-select-another-selection--multiple { - min-height: 34px; -} - -.new-fc-one-select-another-large - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-selection__choice { - height: 28px; - line-height: 28px; - margin-top: 4px; - margin-bottom: 4px; -} - -.new-fc-one-select-another-large - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-selection__clear, -.new-fc-one-select-another-large - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-arrow { - top: 18px; -} - -.new-fc-one-select-another-large - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-search__field__wrap - input { - font-size: 16px; -} - -.new-fc-one-select-another-dropdown-large - .new-fc-one-select-another-dropdown-menu-item { - height: 36px; - line-height: 36px; - font-size: 16px; -} - -.new-fc-one-select-another-dropdown-large - .new-fc-one-select-another-dropdown-menu-item - .new-fc-one-checkbox-wrapper - + span { - font-size: 16px; -} - -.new-fc-one-select-another-dropdown-large - .new-fc-one-select-another-dropdown-menu-item-group-title { - height: 36px; - line-height: 36px; - font-size: 16px; -} - -.new-fc-one-select-another-disabled { - border: 1px solid #eee; - background-color: #fafafa; - color: #ccc; - cursor: not-allowed; -} - -.new-fc-one-select-another-disabled:hover, -.new-fc-one-select-another-disabled:active, -.new-fc-one-select-another-disabled:focus { - border-color: #eee; -} - -.new-fc-one-select-another-disabled - .new-fc-one-select-another-selection--multiple[type='list'] { - cursor: not-allowed; -} - -.new-fc-one-select-another-disabled - .new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice { - cursor: not-allowed; - background-color: #fafafa; - border: 1px solid #eee; -} - -.new-fc-one-select-another-disabled - .new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice:hover, -.new-fc-one-select-another-disabled - .new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice:active, -.new-fc-one-select-another-disabled - .new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice:focus { - background-color: #fafafa; -} - -.new-fc-one-select-another-disabled - .new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice__remove { - cursor: not-allowed; -} - -.new-fc-one-select-another:not(.new-fc-one-select-another-disabled) { - border: 1px solid #e0e0e0; - background-color: #fff; - color: #333; - cursor: pointer; -} - -.new-fc-one-select-another:not(.new-fc-one-select-another-disabled):hover, -.new-fc-one-select-another:not(.new-fc-one-select-another-disabled):active { - border-color: #999; -} - -.new-fc-one-select-another:not(.new-fc-one-select-another-disabled):focus { - border-color: #3d88f2; -} - -.new-fc-one-select-another { - line-height: 1; - box-sizing: border-box; - margin: 0; - padding: 0; - list-style: none; - display: inline-block; - position: relative; - outline: 0; - width: 120px; - padding: 0 12px; -} - -.new-fc-one-select-another-focused { - border-color: #3d88f2; -} - -.new-fc-one-select-another-open { - border-color: #999; -} - -.new-fc-one-select-another-open .new-fc-one-select-another-arrow { - transform: scale(0.7, 0.7) rotate(180deg); -} - -.new-fc-one-select-another ul, -.new-fc-one-select-another ol { - margin: 0; - padding: 0; - list-style: none; -} - -.new-fc-one-select-another > ul > li > a { - padding: 0; - background-color: #fff; -} - -.new-fc-one-select-another-error-line { - border: 1px solid #e64552 !important; -} - -.new-fc-one-select-another-error-line:hover, -.new-fc-one-select-another-error-line:focus, -.new-fc-one-select-another-error-line:active { - border-color: #e64552 !important; -} - -.new-fc-one-select-another-error-line:focus { - box-shadow: 0 0 0 2px rgba(230, 69, 82, 0.2); -} - -.new-fc-one-select-another-selection__clear, -.new-fc-one-select-another-custom-key, -.new-fc-one-select-another-arrow { - position: absolute; - top: 50%; - right: 0; - line-height: 1; - margin-top: -6px; - color: #666; - font-size: calc(1em - 4px); - transition: transform 0.3s; - width: 1em; - height: 1em; - background: #fff; -} - -.new-fc-one-select-another-arrow { - transform: scale(0.7, 0.7); -} - -.new-fc-one-select-another-selection__clear { - transform: scale(1); - color: #999; - z-index: 1; - opacity: 0; -} - -.new-fc-one-select-another-selection { - position: relative; - outline: none; - user-select: none; - box-sizing: border-box; - display: block; - border-radius: 0; - transition: all 0.3s ease-in-out; -} - -.new-fc-one-select-another-selection:hover - .new-fc-one-select-another-selection__clear { - opacity: 1; -} - -.new-fc-one-select-another-selection-selected-value { - float: left; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - width: 100%; -} - -.new-fc-one-select-another-selection-text-error { - color: #e64552; - margin-top: 4px; -} - -.new-fc-one-select-another-disabled - .new-fc-one-select-another-selection__clear { - display: none; - visibility: hidden; - pointer-events: none; -} - -.new-fc-one-select-another-disabled - .new-fc-one-select-another-selection--multiple - .new-fc-one-select-another-selection__choice__remove { - display: none; -} - -.new-fc-one-select-another-selection--single { - position: relative; -} - -.new-fc-one-select-another-selection__rendered { - display: block; - position: relative; - padding-right: 14px; -} - -.new-fc-one-select-another-selection__rendered::after { - content: '.'; - visibility: hidden; - pointer-events: none; - display: inline-block; - width: 0; - height: 0; -} - -.new-fc-one-select-another-selection__placeholder, -.new-fc-one-select-another-search__field__placeholder { - position: absolute; - left: 0; - right: 14px; - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - text-align: left; - color: #999; -} - -.new-fc-one-select-another-search__field__placeholder { - left: 8px; -} - -.new-fc-one-select-another-search__field__mirror { - position: absolute; - top: -2px; - left: 0; - white-space: pre; - pointer-events: none; - opacity: 0; - color: #333; -} - -.new-fc-one-select-another-search--inline { - position: absolute; - height: 100%; - width: 100%; -} - -.new-fc-one-select-another-search--inline - .new-fc-one-select-another-search__field__wrap { - width: 100%; - height: 100%; -} - -.new-fc-one-select-another-search--inline - .new-fc-one-select-another-search__field { - border-width: 0; - height: 100%; - width: calc(100% - 12px); - background: transparent; - outline: 0; - border-radius: 0; - line-height: 1; - color: #333; -} - -.new-fc-one-select-another-search--inline > i { - float: right; -} - -.new-fc-one-select-another-selection--multiple[type='list'] { - cursor: text; - zoom: 1; - position: relative; -} - -.new-fc-one-select-another-selection--multiple[type='list']::before, -.new-fc-one-select-another-selection--multiple[type='list']::after { - content: ' '; - display: table; -} - -.new-fc-one-select-another-selection--multiple[type='list']::after { - clear: both; - visibility: hidden; - font-size: 0; - height: 0; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-search--inline { - float: left; - position: relative; - top: 1px; - left: 0; - width: auto; - padding: 0; - max-width: calc(100% - 12px); -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-search--inline - .new-fc-one-select-another-search__field { - max-width: 100%; - width: 0.75em; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-search-hidden { - height: 0; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-search-ul { - padding: 0; - margin: 0; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-search-ul::after { - content: ' '; - display: table; - clear: both; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__rendered { - height: auto; - padding-right: 40px; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__rendered::after { - display: none; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice { - color: #333; - background-color: #f5f5f5; - border-radius: 2px; - float: left; - margin-right: 4px; - max-width: 99%; - position: relative; - overflow: hidden; - transition: padding 0.3s ease-in-out; - padding: 0 26px 0 8px; - cursor: pointer; - border: 1px solid #e0e0e0; - box-sizing: border-box; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice:hover { - background-color: #eee; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice:focus { - background-color: #eee; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice:active { - background-color: #e0e0e0; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice__disabled { - cursor: not-allowed; - background-color: #fafafa; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice__content { - display: inline-block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 100%; - transition: margin 0.3s ease-in-out; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__choice__remove { - color: #666; - line-height: inherit; - cursor: pointer; - display: inline-block; - font-weight: bold; - transition: all 0.3s; - position: absolute; - right: 8px; - transform: scale(0.7, 0.7); - top: 1px; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__clear { - top: 16px; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__total_count { - right: 0; - position: absolute; - color: #999; - bottom: 4px; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__total_count-error { - color: #e64552; -} - -.new-fc-one-select-another-selection--multiple[type='list'] - .new-fc-one-select-another-selection__total_count-min { - right: 20px; - top: 50%; - transform: translateY(-50%); - height: 20px; - line-height: 20px; -} - -.new-fc-one-select-another-hidden { - display: none; -} - -.new-fc-one-select-another-multiple .new-fc-one-select-another { - width: 300px; -} - -.new-fc-one-select-another-dropdown { - line-height: 1; - margin: 0; - padding: 0; - list-style: none; - font-variant: initial; - background-color: #fff; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15); - border-radius: 3px; - box-sizing: border-box; - z-index: 1051; - left: -9999px; - top: -9999px; - position: absolute; - outline: none; -} - -.new-fc-one-select-another-dropdown.slide-up-enter.slide-up-enter-active.new-fc-one-select-another-dropdown-placement-topLeft, -.new-fc-one-select-another-dropdown.slide-up-appear.slide-up-appear-active.new-fc-one-select-another-dropdown-placement-topLeft { - animation-name: oneUISlideDownInEffect; -} - -.new-fc-one-select-another-dropdown.slide-up-leave.slide-up-leave-active.new-fc-one-select-another-dropdown-placement-bottomLeft { - animation-name: oneUISlideUpOutEffect; -} - -.new-fc-one-select-another-dropdown.slide-up-leave.slide-up-leave-active.new-fc-one-select-another-dropdown-placement-topLeft { - animation-name: oneUISlideDownOutEffect; -} - -.new-fc-one-select-another-dropdown-hidden { - display: none; -} - -.new-fc-one-select-another-dropdown-menu { - outline: none; - margin: 0; - padding-left: 0; - list-style: none; - overflow: auto; -} - -.new-fc-one-select-another-dropdown-menu-item-group-list { - margin: 0; - padding: 0; -} - -.new-fc-one-select-another-dropdown-menu-item-group-list - > .new-fc-one-select-another-dropdown-menu-item { - padding-left: 8px; -} - -.new-fc-one-select-another-dropdown-menu-item-group-title { - color: #999; - padding: 0 8px; -} - -.new-fc-one-select-another-dropdown-menu-item-group-list - .new-fc-one-select-another-dropdown-menu-item:first-child:not(:last-child), -.new-fc-one-select-another-dropdown-menu-item-group:not(:last-child) - .new-fc-one-select-another-dropdown-menu-item-group-list - .new-fc-one-select-another-dropdown-menu-item:last-child { - border-radius: 0; -} - -.new-fc-one-select-another-dropdown-menu-item-group:not(:last-child) { - padding-bottom: 2px; - border-bottom: 1px solid #999; -} - -.new-fc-one-select-another-dropdown-menu-item[type='custom'] { - position: relative; - display: block; - padding: 0 8px; -} - -.new-fc-one-select-another-dropdown-menu-item { - position: relative; - display: block; - padding: 0 8px; - white-space: nowrap; - cursor: pointer; - overflow: hidden; - text-overflow: ellipsis; - transition: background 0.3s ease; - background-color: #fff; - color: #333; -} - -.new-fc-one-select-another-dropdown-menu-item:hover { - background-color: #f5f5f5; - color: #000; -} - -.new-fc-one-select-another-dropdown-menu-item:active { - background-color: #eee; - color: #000; -} - -.new-fc-one-select-another-dropdown-menu-item:focus { - background-color: #f2f7ff; - color: #000; -} - -.new-fc-one-select-another-dropdown-menu-item-selected { - background-color: #fff; - color: #3d88f2; -} - -.new-fc-one-select-another-dropdown-menu-item-selected:hover { - background-color: #f5f5f5; - color: #3d88f2; -} - -.new-fc-one-select-another-dropdown-menu-item-selected:active { - background-color: #eee; - color: #3d88f2; -} - -.new-fc-one-select-another-dropdown-menu-item-selected:focus { - background-color: #f2f7ff; - color: #3d88f2; -} - -.new-fc-one-select-another-dropdown-menu-item-divider { - height: 1px; - margin: 1px 0; - overflow: hidden; - background-color: #eee; - line-height: 0; -} - -.new-fc-one-select-another-dropdown-menu-item-disabled { - background-color: #fafafa; - color: #ccc; - cursor: not-allowed; -} - -.new-fc-one-select-another-dropdown-menu-item-disabled:hover { - background-color: #fafafa; - color: #ccc; -} - -.new-fc-one-select-another-dropdown-menu-item-disabled:active { - background-color: #fafafa; - color: #ccc; -} - -.new-fc-one-select-another-dropdown-menu-item-disabled:focus { - background-color: #fafafa; - color: #ccc; -} - -.new-fc-one-select-another-dropdown-menu-container { - width: 172px; - height: 152px; - overflow: auto; -} - -.new-fc-one-select-another-dropdown-menu .new-fc-one-checkbox-wrapper { - font-size: inherit; -} - -.new-fc-one-select-another-dropdown--multiple - .new-fc-one-select-another-dropdown-menu-item-selected - .new-fc-one-checkbox-wrapper - + span { - background-color: transparent; - color: #333; -} - -.new-fc-one-select-another-dropdown--multiple - .new-fc-one-select-another-dropdown-menu-item-selected - .new-fc-one-checkbox-wrapper - + span:hover { - background-color: transparent; - color: #000; -} - -.new-fc-one-select-another-dropdown--multiple - .new-fc-one-select-another-dropdown-menu-item-selected - .new-fc-one-checkbox-wrapper - + span:active { - background-color: transparent; - color: #000; -} - -.new-fc-one-select-another-dropdown--multiple - .new-fc-one-select-another-dropdown-menu-item-selected - .new-fc-one-checkbox-wrapper - + span:focus { - background-color: transparent; - color: #000; -} - -.new-fc-one-select-another-dropdown-xsmall - .new-fc-one-select-another-dropdown-menu { - max-height: 248px; -} - -.new-fc-one-select-another-dropdown-small - .new-fc-one-select-another-dropdown-menu { - max-height: 288px; -} - -.new-fc-one-select-another-dropdown-medium - .new-fc-one-select-another-dropdown-menu { - max-height: 328px; -} - -.new-fc-one-select-another-dropdown-large - .new-fc-one-select-another-dropdown-menu { - max-height: 368px; -} - -.new-fc-one-select-another-search-text-highlight { - color: #f27c49; -} - -.new-fc-one-single-select { - background: #fff; - cursor: pointer; - position: relative; - color: #333; - border: 1px solid #dbdbdb; - padding-right: 20px; - box-sizing: border-box; - height: 32px; - line-height: 1; - display: inline-block; - vertical-align: middle; -} - -.new-fc-one-single-select-text { - font-size: 12px; - padding: 0 10px; - display: inline-block; - line-height: 30px; - height: 30px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - width: 100%; -} - -.new-fc-one-single-select:hover { - border: 1px solid #999; -} - -.new-fc-one-select-another-focused .new-fc-one-single-select, -.new-fc-one-single-select:focus, -.new-fc-one-single-select:active { - border: 1px solid #999; -} - -.new-fc-one-single-select-open .new-fc-one-icon { - transform: rotate(180deg) scale(0.7); -} - -.new-fc-one-single-select-disabled { - background: #eee; - cursor: not-allowed; - color: #b8b8b8; -} - -.new-fc-one-single-select-disabled:hover { - border: 1px solid #dbdbdb; -} - -.new-fc-one-select-another-focused .new-fc-one-single-select-disabled, -.new-fc-one-single-select-disabled:focus, -.new-fc-one-single-select-disabled:active { - border: 1px solid #dbdbdb; -} - -.new-fc-one-multiple-select { - position: relative; -} - -.new-fc-one-multiple-select-open .new-fc-one-icon { - transform: rotate(180deg) scale(0.7); -} - -.new-fc-one-multiple-select-text-label { - display: inline-block; -} - -.new-fc-one-select-another-popover { - line-height: 1; - margin: 0; - padding: 0; - list-style: none; - padding: 8px; - font-variant: initial; - background-color: #fff; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15); - border-radius: 0; - box-sizing: border-box; - z-index: 1051; - left: -9999px; - top: -9999px; - position: absolute; - outline: none; -} - -.new-fc-one-select-another-popover.slide-up-enter.slide-up-enter-active.new-fc-one-select-another-popover-placement-topLeft, -.new-fc-one-select-another-popover.slide-up-appear.slide-up-appear-active.new-fc-one-select-another-popover-placement-topLeft { - animation-name: oneUISlideDownInEffect; -} - -.new-fc-one-select-another-popover.slide-up-leave.slide-up-leave-active.new-fc-one-select-another-popover-placement-bottomLeft { - animation-name: oneUISlideUpOutEffect; -} - -.new-fc-one-select-another-popover.slide-up-leave.slide-up-leave-active.new-fc-one-select-another-popover-placement-topLeft { - animation-name: oneUISlideDownOutEffect; -} - -.new-fc-one-select-another-popover-hidden { - display: none; -} - -.new-fc-one-select-another-popover-container { - width: 288px; -} - -.new-fc-one-select-another-popover-container-open - .new-fc-one-select-another-arrow { - transform: scale(0.7, 0.7) rotate(180deg); -} - -.new-fc-one-select-another-popover-container - .new-fc-one-select-another-selection__total { - top: 0 !important; - left: 8px !important; -} - -.new-fc-one-select-another-popover-container - .new-fc-one-select-another-selection { - cursor: auto; -} - -.new-fc-one-select-another-popover-inner { - width: 100%; -} - -.new-fc-one-select-another-popover-inner-container { - display: inline-block; - width: 100%; -} - -.new-fc-one-select-another-popover-inner-container-custom { - margin-bottom: 8px; -} - -.new-fc-one-select-another-popover-inner-container-button-item { - margin-right: 8px; -} - -.new-fc-one-select-another-pop { - line-height: 1; - margin: 0; - padding: 0; - list-style: none; - font-variant: initial; - background-color: #fff; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15); - border-radius: 0; - box-sizing: border-box; - z-index: 1051; - left: -9999px; - top: -9999px; - position: absolute; - outline: none; -} - -.new-fc-one-select-another-pop.slide-up-enter.slide-up-enter-active.new-fc-one-select-another-pop-placement-topLeft, -.new-fc-one-select-another-pop.slide-up-appear.slide-up-appear-active.new-fc-one-select-another-pop-placement-topLeft { - animation-name: oneUISlideDownInEffect; -} - -.new-fc-one-select-another-pop.slide-up-leave.slide-up-leave-active.new-fc-one-select-another-pop-placement-bottomLeft { - animation-name: oneUISlideUpOutEffect; -} - -.new-fc-one-select-another-pop.slide-up-leave.slide-up-leave-active.new-fc-one-select-another-pop-placement-topLeft { - animation-name: oneUISlideDownOutEffect; -} - -.new-fc-one-select-another-pop-hidden { - display: none; -} - -.new-fc-one-select-another-container { - display: inline-block; -} - -.new-fc-one-select-another-selection-item { - position: relative; - top: -10px; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.tsx deleted file mode 100644 index 7bf17bd6d..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/NewVertexType.tsx +++ /dev/null @@ -1,1023 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import classnames from 'classnames'; -import { cloneDeep, isUndefined } from 'lodash-es'; -import { - Input, - Radio, - Select, - Button, - Switch, - Tooltip, - Checkbox, - Message -} from 'hubble-ui'; -import { useTranslation } from 'react-i18next'; - -import { Tooltip as CustomTooltip } from '../../../common/'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { formatVertexIdText } from '../../../../stores/utils'; - -import type { VertexTypeValidatePropertyIndexes } from '../../../../stores/types/GraphManagementStore/metadataConfigsStore'; - -import HintIcon from '../../../../assets/imgs/ic_question_mark.svg'; -import BlueArrowIcon from '../../../../assets/imgs/ic_arrow_blue.svg'; -import closeIcon from '../../../../assets/imgs/ic_close_16.svg'; - -import './NewVertexType.less'; - -const NewVertexType: React.FC = observer(() => { - const dataAnalyzeStore = useContext(DataAnalyzeStore); - const { metadataPropertyStore, vertexTypeStore } = useContext( - MetadataConfigsRootStore - ); - const { t } = useTranslation(); - const [isAddNewProperty, switchIsAddNewProperty] = useState(false); - const [deletePopIndex, setDeletePopIndex] = useState(null); - const deleteWrapperRef = useRef(null); - const dropdownWrapperRef = useRef(null); - - // need useCallback to stop infinite callings of useEffect - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - // if clicked element is not on dropdown, collpase it - if ( - isAddNewProperty && - dropdownWrapperRef.current && - !dropdownWrapperRef.current.contains(e.target as Element) - ) { - switchIsAddNewProperty(false); - } - - if ( - deletePopIndex && - deleteWrapperRef.current && - !deleteWrapperRef.current.contains(e.target as Element) - ) { - setDeletePopIndex(null); - } - }, - [deletePopIndex, isAddNewProperty] - ); - - useEffect(() => { - metadataPropertyStore.fetchMetadataPropertyList({ fetchAll: true }); - vertexTypeStore.validateAllNewVertexType(true); - }, [metadataPropertyStore, vertexTypeStore]); - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - return ( -
-
-
- {t('addition.menu.base-info')} -
-
-
- * - {t('addition.vertex.vertex-type-name')}: -
- { - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - name: e.value - }); - }} - originInputProps={{ - onBlur() { - vertexTypeStore.validateAllNewVertexType(true); - vertexTypeStore.validateNewVertexType('name'); - } - }} - /> -
- -
-
- * - {t('addition.vertex.vertex-style')}: -
-
- -
-
- -
-
- -
-
- * - {t('addition.common.id-strategy')}: -
- ) => { - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - id_strategy: e.target.value - }); - - vertexTypeStore.validateAllNewVertexType(true); - vertexTypeStore.validateNewVertexType('primaryKeys'); - }} - > - - {t('addition.constant.primary-key-id')} - - - {t('addition.constant.automatic-generation')} - - - {t('addition.constant.custom-string')} - - - {t('addition.constant.custom-number')} - - - {t('addition.constant.custom-uuid')} - - -
-
-
- {vertexTypeStore.newVertexType.id_strategy === 'PRIMARY_KEY' && ( - * - )} - {t('addition.common.association-property')}: -
-
- {vertexTypeStore.newVertexType.properties.length !== 0 && ( -
-
-
{t('addition.common.property')}
-
{t('addition.common.allow-null')}
-
- {vertexTypeStore.newVertexType.properties.map( - (property, index) => { - const currentProperties = cloneDeep( - vertexTypeStore.newVertexType.properties - ); - - return ( -
-
{property.name}
-
- { - currentProperties[index].nullable = checked; - - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - properties: currentProperties - }); - - // remove primary keys since it could be empty value - if (checked) { - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - primary_keys: - vertexTypeStore.newVertexType.primary_keys.filter( - (key) => key !== property.name - ) - }); - } - }} - size="large" - /> -
-
- ); - } - )} -
- )} -
{ - switchIsAddNewProperty(!isAddNewProperty); - }} - > - {t('addition.common.add-property')} - toggleAddProperty -
-
-
- {isAddNewProperty && ( -
-
-
- {metadataPropertyStore.metadataProperties.map((property) => ( -
- - propertyIndex === property.name - ) !== -1 - } - onChange={() => { - const addedPropertiesInSelectedVertextType = - vertexTypeStore.addedPropertiesInSelectedVertextType; - - addedPropertiesInSelectedVertextType.has(property.name) - ? addedPropertiesInSelectedVertextType.delete( - property.name - ) - : addedPropertiesInSelectedVertextType.add( - property.name - ); - - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - properties: [ - ...addedPropertiesInSelectedVertextType - ].map((propertyName) => { - const currentProperty = - vertexTypeStore.newVertexType.properties.find( - ({ name }) => name === propertyName - ); - - return { - name: propertyName, - nullable: !isUndefined(currentProperty) - ? currentProperty.nullable - : true - }; - }) - }); - - vertexTypeStore.validateAllNewVertexType(true); - vertexTypeStore.validateNewVertexType('properties'); - }} - > - {property.name} - - -
- ))} -
-
- )} - {vertexTypeStore.newVertexType.id_strategy === 'PRIMARY_KEY' && ( -
-
- * - {t('addition.common.primary-key-property')}: -
- -
- )} - -
-
- * - {t('addition.vertex.vertex-display-content')}: -
- -
- -
- - {t('addition.edge.index-info')} - - - hint - -
-
-
- * - {t('addition.menu.type-index')}: -
- { - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - open_label_index: - !vertexTypeStore.newVertexType.open_label_index - }); - }} - size="large" - /> -
-
-
- {t('addition.common.property-index')}: -
-
- {vertexTypeStore.newVertexType.property_indexes.length !== 0 && ( -
-
- {t('addition.edge.index-name')} -
-
- {t('addition.edge.index-type')} -
-
{t('addition.common.property')}
-
- )} - {vertexTypeStore.newVertexType.property_indexes.map( - ({ name, type, fields }, index) => ( -
-
- { - const propertyIndexEntities = cloneDeep( - vertexTypeStore.newVertexType.property_indexes - ); - - propertyIndexEntities[index].name = e.value; - - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - property_indexes: propertyIndexEntities - }); - }} - originInputProps={{ - onBlur() { - // check is ready to create - vertexTypeStore.validateAllNewVertexType(true); - vertexTypeStore.validateNewVertexType( - 'propertyIndexes' - ); - } - }} - /> -
-
- -
-
- -
- - -

- {t('addition.message.property-del-confirm')} -

-

- {t('addition.message.index-del-confirm')} -

-
-
{ - const propertyIndexEntities = cloneDeep( - vertexTypeStore.newVertexType.property_indexes - ); - - propertyIndexEntities.splice(index, 1); - - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - property_indexes: propertyIndexEntities - }); - - vertexTypeStore.validateAllNewVertexType(true); - vertexTypeStore.validateNewVertexType( - 'propertyIndexes' - ); - - setDeletePopIndex(null); - }} - > - {t('addition.common.confirm')} -
-
{ - setDeletePopIndex(null); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: closeIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeletePopIndex(index); - } - }} - childrenWrapperElement="img" - /> -
- ) - )} - { - if ( - vertexTypeStore.newVertexType.property_indexes.length === 0 || - vertexTypeStore.isAddNewPropertyIndexReady - ) { - vertexTypeStore.mutateNewProperty({ - ...vertexTypeStore.newVertexType, - property_indexes: [ - ...vertexTypeStore.newVertexType.property_indexes, - { - name: '', - type: '', - fields: [] - } - ] - }); - - vertexTypeStore.validateAllNewVertexType(true); - // set isAddNewPropertyIndexReady to false - vertexTypeStore.validateNewVertexType( - 'propertyIndexes', - true - ); - } - }} - style={{ - cursor: 'pointer', - color: vertexTypeStore.isAddNewPropertyIndexReady - ? '#2b65ff' - : '#999', - lineHeight: '32px' - }} - > - {t('addition.edge.add-group')} - -
-
- -
-
- - -
-
- - ); -}); - -export default NewVertexType; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.less deleted file mode 100644 index 71698137e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.less +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.reuse-properties-wrapper { - width: 100%; - background: #fff; - margin-top: 16px; - padding: 16px; - - .reuse-steps { - width: 860px; - margin: 16px auto 18px; - } - - .reuse-properties { - &-row { - display: flex; - align-items: center; - margin: 18px 0 32px; - font-size: 14px; - color: #333; - - &:last-child { - margin-bottom: 24px; - } - - &-name { - width: 98px; - text-align: right; - margin-right: 13.9px; - } - } - - &-manipulations { - display: flex; - justify-content: center; - margin-bottom: 88px; - } - - &-validate { - &-duplicate, - &-exist, - &-pass { - width: 58px; - margin: 0 auto; - border-radius: 2px; - letter-spacing: 0; - line-height: 22px; - text-align: center; - } - - &-duplicate { - background: #fff2f2; - border: 1px solid #ff9499; - color: #e64552; - } - - &-exist, - &-pass { - background: #f2fff4; - border: 1px solid #7ed988; - color: #39bf45; - } - } - - &-complete-hint { - display: flex; - flex-direction: column; - justify-content: center; - margin: 88px auto 327px; - - &-description { - display: flex; - justify-content: center; - - & > div { - margin-left: 20px; - } - } - - &-manipulations { - margin: 42px auto 0; - } - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.tsx deleted file mode 100644 index ba1540f2f..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/ReuseVertexTypes.tsx +++ /dev/null @@ -1,1052 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { useContext, useState, useEffect } from 'react'; -import { observer } from 'mobx-react'; -import { - Select, - Steps, - Transfer, - Button, - Table, - Input, - Message -} from 'hubble-ui'; - -import { GraphManagementStoreContext } from '../../../../stores'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; - -import PassIcon from '../../../../assets/imgs/ic_pass.svg'; - -import './ReuseVertexTypes.less'; -import { cloneDeep } from 'lodash-es'; -import { useTranslation } from 'react-i18next'; - -const ReuseVertexTypes: React.FC = observer(() => { - const graphManagementStore = useContext(GraphManagementStoreContext); - const metadataConfigsRootStore = useContext(MetadataConfigsRootStore); - const { vertexTypeStore } = metadataConfigsRootStore; - const { t } = useTranslation(); - const [currentStatus, setCurrentStatus] = useState(1); - // acutally the name, not id in database - const [selectedId, mutateSelectedId] = useState<[] | string>([]); - const [selectedList, mutateSelectedList] = useState([]); - - // step 2 - const [vertexTypeEditIndex, setVertexTypeEditIndex] = useState( - null - ); - const [propertyEditIndex, setPropertyEditIndex] = useState( - null - ); - const [propertyIndexEditIndex, setPropertyIndexEditIndex] = useState< - number | null - >(null); - - // hack: need to call @observable at here to dispatch re-render by mobx - // since @action in onBlur() in doesn't dispatch re-render - vertexTypeStore.validateReuseErrorMessage.vertexType.toUpperCase(); - vertexTypeStore.validateReuseErrorMessage.property.toUpperCase(); - vertexTypeStore.validateReuseErrorMessage.property_index.toUpperCase(); - - const vertexTypeColumnConfigs = [ - { - title: t('addition.common.vertex-name'), - dataIndex: 'name', - width: '50%', - render(text: string, records: any, index: number) { - if (index !== vertexTypeEditIndex) { - return ( -
- {text} -
- ); - } - - return ( - { - // remove validate message after user input changes - vertexTypeStore.resetValidateReuseErrorMessage('vertexType'); - - const editedCheckedReusableData = cloneDeep( - vertexTypeStore.editedCheckedReusableData! - ); - - editedCheckedReusableData.vertexlabel_conflicts[ - index - ].entity.name = e.value; - - vertexTypeStore.mutateEditedReusableData( - editedCheckedReusableData - ); - }} - originInputProps={{ - onBlur() { - vertexTypeStore.validateReuseData( - 'vertexType', - vertexTypeStore.checkedReusableData!.vertexlabel_conflicts[ - index - ].entity.name, - vertexTypeStore.editedCheckedReusableData! - .vertexlabel_conflicts[index].entity.name - ); - } - }} - /> - ); - } - }, - { - title: t('addition.edge.verification-result'), - dataIndex: 'status', - width: '30%', - render(value: string, records: any, index: number) { - let classname = ''; - let text = ''; - - if (vertexTypeStore.reusableVertexTypeNameChangeIndexes.has(index)) { - return ( -
- {t('addition.edge.be-verified')} -
- ); - } - - switch (value) { - case 'DUPNAME': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.duplicate-name'); - break; - - case 'DEP_CONFLICT': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.dependency-conflict'); - break; - - case 'EXISTED': - classname = 'reuse-properties-validate-exist'; - text = t('addition.message.already-exist'); - break; - - case 'PASSED': - classname = 'reuse-properties-validate-pass'; - text = t('addition.message.pass'); - break; - } - - return ( -
- {text} -
- ); - } - }, - { - title: t('addition.operate.operate'), - dataIndex: 'manipulation', - width: '20%', - render(_: never, records: any, index: number) { - if (index === vertexTypeEditIndex) { - const originalName = vertexTypeStore.checkedReusableData! - .vertexlabel_conflicts[index].entity.name; - const changedName = vertexTypeStore.editedCheckedReusableData! - .vertexlabel_conflicts[index].entity.name; - const isChanged = changedName !== originalName; - - return ( -
- { - if ( - !isChanged || - !vertexTypeStore.validateReuseData( - 'vertexType', - originalName, - changedName - ) - ) { - return; - } - - vertexTypeStore.mutateReuseData( - 'vertexType', - originalName, - changedName - ); - setVertexTypeEditIndex(null); - vertexTypeStore.mutateReusableVertexTypeChangeIndexes(index); - }} - > - {t('addition.common.save')} - - { - vertexTypeStore.resetValidateReuseErrorMessage('vertexType'); - setVertexTypeEditIndex(null); - vertexTypeStore.resetEditedReusableVertexTypeName(index); - }} - > - {t('addition.common.cancel')} - -
- ); - } - - return ( -
- { - if (vertexTypeEditIndex !== null) { - return; - } - - setVertexTypeEditIndex(index); - }} - > - {t('addition.operate.rename')} - - { - if (vertexTypeEditIndex !== null) { - return; - } - - setPropertyEditIndex(null); - - // remove selected status of the property in - const newSelectedList = [...selectedList].filter( - (property) => - property !== - vertexTypeStore.editedCheckedReusableData! - .vertexlabel_conflicts[index].entity.name - ); - - mutateSelectedList(newSelectedList); - - // notice: useState hooks cannot sync updated state value, so the length is still 1 - if (selectedList.length === 1) { - setCurrentStatus(1); - // remove edit status after return previous - vertexTypeStore.clearReusableNameChangeIndexes(); - return; - } - - vertexTypeStore.deleteReuseData('vertexlabel_conflicts', index); - }} - > - {t('addition.common.del')} - -
- ); - } - } - ]; - - const metadataPropertyColumnConfigs = [ - { - title: t('addition.common.property-name'), - dataIndex: 'name', - width: '50%', - render(text: string, records: any, index: number) { - if (index !== propertyEditIndex) { - return text; - } - - return ( - { - // remove validate message after user input changes - vertexTypeStore.resetValidateReuseErrorMessage('property'); - - const editedCheckedReusableData = cloneDeep( - vertexTypeStore.editedCheckedReusableData! - ); - - editedCheckedReusableData.propertykey_conflicts[ - index - ].entity.name = e.value; - - vertexTypeStore.mutateEditedReusableData( - editedCheckedReusableData - ); - }} - originInputProps={{ - onBlur() { - vertexTypeStore.validateReuseData( - 'property', - vertexTypeStore.checkedReusableData!.propertykey_conflicts[ - index - ].entity.name, - vertexTypeStore.editedCheckedReusableData! - .propertykey_conflicts[index].entity.name - ); - } - }} - /> - ); - } - }, - { - title: t('addition.common.data-type'), - dataIndex: 'data_type', - width: '15%', - render(text: string) { - if (text === 'TEXT') { - return 'string'; - } - - return text.toLowerCase(); - } - }, - { - title: t('addition.edge.verification-result'), - dataIndex: 'status', - align: 'center', - width: '15%', - render(value: string, records: any, index: number) { - let classname = ''; - let text = ''; - - if (vertexTypeStore.reusablePropertyNameChangeIndexes.has(index)) { - return ( -
- {t('addition.edge.be-verified')} -
- ); - } - - switch (value) { - case 'DUPNAME': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.duplicate-name'); - break; - - case 'DEP_CONFLICT': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.dependency-conflict'); - break; - - case 'EXISTED': - classname = 'reuse-properties-validate-exist'; - text = t('addition.message.already-exist'); - break; - - case 'PASSED': - classname = 'reuse-properties-validate-pass'; - text = t('addition.message.pass'); - break; - } - - return
{text}
; - } - }, - { - title: t('addition.operate.operate'), - dataIndex: 'manipulation', - width: '20%', - render(_: never, records: any, index: number) { - if (index === propertyEditIndex) { - const originalName = vertexTypeStore.checkedReusableData! - .propertykey_conflicts[index].entity.name; - const changedName = vertexTypeStore.editedCheckedReusableData! - .propertykey_conflicts[index].entity.name; - const isChanged = changedName !== originalName; - - return ( -
- { - if ( - !isChanged || - !vertexTypeStore.validateReuseData( - 'property', - originalName, - changedName - ) - ) { - return; - } - - vertexTypeStore.mutateReuseData( - 'property', - originalName, - changedName - ); - - setPropertyEditIndex(null); - vertexTypeStore.mutateReusablePropertyNameChangeIndexes( - index - ); - }} - > - {t('addition.common.save')} - - { - vertexTypeStore.resetValidateReuseErrorMessage('property'); - setPropertyEditIndex(null); - vertexTypeStore.resetEditedReusablePropertyName(index); - }} - > - {t('addition.common.cancel')} - -
- ); - } - - return ( -
- { - if (propertyEditIndex !== null) { - return; - } - - setPropertyEditIndex(index); - }} - > - {t('addition.operate.rename')} - - { - if (propertyEditIndex !== null) { - return; - } - - setPropertyEditIndex(null); - - vertexTypeStore.deleteReuseData('propertykey_conflicts', index); - }} - > - {t('addition.common.del')} - -
- ); - } - } - ]; - - const metadataPropertyIndexColumnConfigs = [ - { - title: t('addition.common.property-index-name'), - dataIndex: 'name', - width: '50%', - render(text: string, records: any, index: number) { - if (index !== propertyIndexEditIndex) { - return text; - } - - return ( - { - vertexTypeStore.resetValidateReuseErrorMessage('property_index'); - - const editedCheckedReusableData = cloneDeep( - vertexTypeStore.editedCheckedReusableData! - ); - - editedCheckedReusableData.propertyindex_conflicts[ - index - ].entity.name = e.value; - - vertexTypeStore.mutateEditedReusableData( - editedCheckedReusableData - ); - }} - originInputProps={{ - onBlur() { - vertexTypeStore.validateReuseData( - 'property_index', - vertexTypeStore.checkedReusableData!.propertyindex_conflicts[ - index - ].entity.name, - vertexTypeStore.editedCheckedReusableData! - .propertyindex_conflicts[index].entity.name - ); - } - }} - /> - ); - } - }, - { - title: t('addition.vertex.corresponding-vertex-type'), - dataIndex: 'owner', - width: '15%' - }, - { - title: t('addition.edge.verification-result'), - dataIndex: 'status', - align: 'center', - width: '15%', - render(value: string, records: any, index: number) { - let classname = ''; - let text = ''; - - if (vertexTypeStore.reusablePropertyIndexNameChangeIndexes.has(index)) { - return ( -
- {t('addition.edge.be-verified')} -
- ); - } - - switch (value) { - case 'DUPNAME': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.duplicate-name'); - break; - - case 'DEP_CONFLICT': - classname = 'reuse-properties-validate-duplicate'; - text = t('addition.message.dependency-conflict'); - break; - - case 'EXISTED': - classname = 'reuse-properties-validate-exist'; - text = t('addition.message.already-exist'); - break; - - case 'PASSED': - classname = 'reuse-properties-validate-pass'; - text = t('addition.message.pass'); - break; - } - - return
{text}
; - } - }, - { - title: t('addition.operate.operate'), - dataIndex: 'manipulation', - width: '20%', - render(_: never, records: any, index: number) { - if (index === propertyIndexEditIndex) { - const originalName = vertexTypeStore.checkedReusableData! - .propertyindex_conflicts[index].entity.name; - const changedName = vertexTypeStore.editedCheckedReusableData! - .propertyindex_conflicts[index].entity.name; - const isChanged = changedName !== originalName; - - return ( -
- { - if ( - !isChanged || - !vertexTypeStore.validateReuseData( - 'property_index', - originalName, - changedName - ) - ) { - return; - } - - vertexTypeStore.mutateReuseData( - 'property_index', - originalName, - changedName - ); - - setPropertyIndexEditIndex(null); - vertexTypeStore.mutateReusablePropertyIndexNameChangeIndexes( - index - ); - }} - > - {t('addition.common.save')} - - { - vertexTypeStore.resetValidateReuseErrorMessage( - 'property_index' - ); - setPropertyIndexEditIndex(null); - vertexTypeStore.resetEditedReusablePropertyIndexName(index); - }} - > - {t('addition.common.cancel')} - -
- ); - } - - return ( -
- { - if (propertyIndexEditIndex !== null) { - return; - } - - setPropertyIndexEditIndex(index); - }} - > - {t('addition.operate.rename')} - - { - if (propertyIndexEditIndex !== null) { - return; - } - - setPropertyIndexEditIndex(null); - - vertexTypeStore.deleteReuseData( - 'propertyindex_conflicts', - index - ); - }} - > - {t('addition.common.del')} - -
- ); - } - } - ]; - - useEffect(() => { - // unlike metadata properties, all vertex types only needs here(in reuse) - vertexTypeStore.fetchVertexTypeList({ fetchAll: true }); - }, [vertexTypeStore]); - - return ( -
-
- {t('addition.operate.reuse-vertex-type')} -
-
- {t('addition.message.reuse-vertex-type-notice')} -
-
- - {[ - t('addition.menu.select-reuse-item'), - t('addition.menu.confirm-reuse-item'), - t('addition.menu.complete-reuse') - ].map((title: string, index: number) => ( - index + 1 - ? 'finish' - : 'wait' - } - key={title} - /> - ))} - - - {currentStatus === 1 && ( - <> -
-
- * - {t('addition.newGraphConfig.id')}: -
- -
-
-
- * - {t('addition.operate.reuse-vertex-type')}: -
- name - )} - selectedList={selectedList} - showSearchBox={false} - candidateTreeStyle={{ - width: 355, - fontSize: 14 - }} - selectedTreeStyle={{ - width: 355, - fontSize: 14 - }} - handleSelect={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - handleSelectAll={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - handleDelete={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - handleDeleteAll={(selectedList: string[]) => { - mutateSelectedList(selectedList); - }} - /> -
-
- - -
- - )} - - {currentStatus === 2 && ( - <> -
- {t('addition.common.selected-vertex-type')} -
-
({ - name: entity.name, - status - }) - ) - : [] - } - pagination={false} - /> - -
- {t('addition.common.selected-property')} -
-
({ - name: entity.name, - data_type: entity.data_type, - status - }) - ) - : [] - } - pagination={false} - /> - -
- {t('addition.common.selected-property-index')} -
-
({ - name: entity.name, - owner: entity.owner, - status - }) - ) - : [] - } - pagination={false} - /> - -
- - -
- - )} - - {currentStatus === 3 && ( -
-
- {t('addition.message.reuse-complete')} -
-
{t('addition.message.reuse-complete')}
-
{t('addition.message.vertex-type-reuse-success')}
-
-
-
- - -
-
- )} - - - ); -}); - -export default ReuseVertexTypes; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.less deleted file mode 100644 index 20b083faa..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.less +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -.vertex-type-list-wrapper { - width: 100%; - background: #fff; - margin-top: 16px; - padding: 16px; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.tsx deleted file mode 100644 index eaa7197c6..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/VertexTypeList.tsx +++ /dev/null @@ -1,1888 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React, { - useContext, - useState, - useEffect, - useRef, - useCallback -} from 'react'; -import { observer } from 'mobx-react'; -import { - cloneDeep, - intersection, - size, - without, - isEmpty, - isUndefined, - values -} from 'lodash-es'; -import { useLocation } from 'wouter'; -import classnames from 'classnames'; -import { motion } from 'framer-motion'; -import { - Button, - Table, - Switch, - Modal, - Drawer, - Input, - Select, - Checkbox, - Message, - Loading -} from 'hubble-ui'; - -import { Tooltip, LoadingDataView } from '../../../common'; -import NewVertexType from './NewVertexType'; -import ReuseVertexTypes from './ReuseVertexTypes'; -import MetadataConfigsRootStore from '../../../../stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore'; -import DataAnalyzeStore from '../../../../stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import { formatVertexIdText } from '../../../../stores/utils'; - -import type { - VertexTypeValidatePropertyIndexes, - VertexType -} from '../../../../stores/types/GraphManagementStore/metadataConfigsStore'; - -import AddIcon from '../../../../assets/imgs/ic_add.svg'; -import BlueArrowIcon from '../../../../assets/imgs/ic_arrow_blue.svg'; -import WhiteCloseIcon from '../../../../assets/imgs/ic_close_white.svg'; -import CloseIcon from '../../../../assets/imgs/ic_close_16.svg'; -import i18next from '../../../../i18n'; -import { useTranslation } from 'react-i18next'; - -import './VertexTypeList.less'; - -const styles = { - button: { - marginLeft: 12, - width: 78 - }, - header: { - marginBottom: 16 - }, - manipulation: { - marginRight: 12 - }, - deleteWrapper: { - display: 'flex', - justifyContent: 'flex-end' - }, - loading: { - padding: 0, - marginRight: 4 - } -}; - -const variants = { - initial: { - opacity: 0 - }, - animate: { - opacity: 1, - transition: { - duration: 0.7 - } - }, - exit: { - opacity: 0, - transition: { - duration: 0.3 - } - } -}; - -const IDStrategyMappings: Record = { - PRIMARY_KEY: i18next.t('addition.constant.primary-key-id'), - AUTOMATIC: i18next.t('addition.constant.automatic-generation'), - CUSTOMIZE_STRING: i18next.t('addition.constant.custom-string'), - CUSTOMIZE_NUMBER: i18next.t('addition.constant.custom-number'), - CUSTOMIZE_UUID: i18next.t('addition.constant.custom-uuid') -}; - -const propertyIndexTypeMappings: Record = { - SECONDARY: i18next.t('addition.menu.secondary-index'), - RANGE: i18next.t('addition.menu.range-index'), - SEARCH: i18next.t('addition.menu.full-text-index') -}; - -const VertexTypeList: React.FC = observer(() => { - const metadataConfigsRootStore = useContext(MetadataConfigsRootStore); - const { t } = useTranslation(); - const { metadataPropertyStore, vertexTypeStore } = metadataConfigsRootStore; - const [preLoading, switchPreLoading] = useState(true); - const [sortOrder, setSortOrder] = useState(''); - const [selectedRowKeys, mutateSelectedRowKeys] = useState([]); - const [isShowModal, switchShowModal] = useState(false); - const [isAddProperty, switchIsAddProperty] = useState(false); - const [isEditVertex, switchIsEditVertex] = useState(false); - const [ - deleteExistPopIndexInDrawer, - setDeleteExistPopIndexInDrawer - ] = useState(null); - const [ - deleteAddedPopIndexInDrawer, - setDeleteAddedPopIndexInDrawer - ] = useState(null); - const [, setLocation] = useLocation(); - - const dropdownWrapperRef = useRef(null); - const deleteWrapperInDrawerRef = useRef(null); - - const isLoading = - preLoading || - vertexTypeStore.requestStatus.fetchVertexTypeList === 'pending'; - - const currentSelectedRowKeys = intersection( - selectedRowKeys, - vertexTypeStore.vertexTypes.map(({ name }) => name) - ); - - // need useCallback to stop infinite callings of useEffect - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - // if clicked element is not on dropdown, collpase it - if ( - isEditVertex && - isAddProperty && - dropdownWrapperRef.current && - !dropdownWrapperRef.current.contains(e.target as Element) - ) { - switchIsAddProperty(false); - } - - if ( - (deleteExistPopIndexInDrawer || deleteAddedPopIndexInDrawer) && - deleteWrapperInDrawerRef.current && - !deleteWrapperInDrawerRef.current.contains(e.target as Element) - ) { - setDeleteExistPopIndexInDrawer(null); - setDeleteAddedPopIndexInDrawer(null); - } - }, - [deleteExistPopIndexInDrawer, deleteAddedPopIndexInDrawer, isAddProperty] - ); - - const handleSelectedTableRow = (newSelectedRowKeys: string[]) => { - mutateSelectedRowKeys(newSelectedRowKeys); - }; - - const handleCloseDrawer = () => { - switchIsAddProperty(false); - switchIsEditVertex(false); - vertexTypeStore.selectVertexType(null); - // clear mutations in - vertexTypeStore.resetEditedSelectedVertexType(); - }; - - const handleSortClick = () => { - switchPreLoading(true); - - if (sortOrder === 'descend') { - vertexTypeStore.mutatePageSort('asc'); - setSortOrder('ascend'); - } else { - vertexTypeStore.mutatePageSort('desc'); - setSortOrder('descend'); - } - - vertexTypeStore.fetchVertexTypeList(); - }; - - const batchDeleteProperties = async () => { - if ( - values(currentSelectedRowKeys).every( - (key) => vertexTypeStore.vertexTypeUsingStatus?.[key] - ) - ) { - Message.error({ - content: t('addition.message.no-can-delete-vertex-type'), - size: 'medium', - showCloseIcon: false - }); - - return; - } - - switchShowModal(false); - // need to set a copy in store since local row key state would be cleared - vertexTypeStore.mutateSelectedVertexTypeNames(currentSelectedRowKeys); - // mutateSelectedRowKeys([]); - await vertexTypeStore.deleteVertexType(currentSelectedRowKeys); - - if (vertexTypeStore.requestStatus.deleteVertexType === 'success') { - Message.success({ - content: t('addition.common.del-success'), - size: 'medium', - showCloseIcon: false - }); - - mutateSelectedRowKeys( - without(selectedRowKeys, ...currentSelectedRowKeys) - ); - - await vertexTypeStore.fetchVertexTypeList(); - - // fetch previous page data if it's empty - if ( - vertexTypeStore.requestStatus.fetchVertexTypeList === 'success' && - size(vertexTypeStore.vertexTypes) === 0 && - vertexTypeStore.vertexListPageConfig.pageNumber > 1 - ) { - vertexTypeStore.mutatePageNumber( - vertexTypeStore.vertexListPageConfig.pageNumber - 1 - ); - - vertexTypeStore.fetchVertexTypeList(); - } - - return; - } - - if (vertexTypeStore.requestStatus.deleteVertexType === 'failed') { - Message.error({ - content: vertexTypeStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - } - }; - - const columnConfigs = [ - { - title: t('addition.vertex.vertex-type-name'), - dataIndex: 'name', - sorter: true, - sortOrder, - width: '20%', - render(text: string, records: any[], index: number) { - return ( -
{ - vertexTypeStore.selectVertexType(index); - - // check also need style infos - vertexTypeStore.mutateEditedSelectedVertexType({ - ...vertexTypeStore.editedSelectedVertexType, - style: { - color: vertexTypeStore.selectedVertexType!.style.color, - icon: null, - size: vertexTypeStore.selectedVertexType!.style.size, - display_fields: vertexTypeStore.selectedVertexType!.style - .display_fields - } - }); - }} - > - {text} -
- ); - } - }, - { - title: t('addition.common.association-property'), - dataIndex: 'properties', - width: '20%', - render(properties: { name: string; nullable: boolean }[]) { - const joinedProperties = - properties.length !== 0 - ? properties.map(({ name }) => name).join('; ') - : '-'; - - return ( -
- {joinedProperties} -
- ); - } - }, - { - title: t('addition.common.id-strategy'), - dataIndex: 'id_strategy', - width: '10%', - render(text: string) { - return ( -
- {IDStrategyMappings[text]} -
- ); - } - }, - { - title: t('addition.common.primary-key-property'), - dataIndex: 'primary_keys', - width: '10%', - render(properties: string[]) { - const joinedProperties = - properties.length !== 0 ? properties.join('; ') : '-'; - - return ( -
- {joinedProperties} -
- ); - } - }, - { - title: t('addition.menu.type-index'), - dataIndex: 'open_label_index', - width: '10%', - render(value: boolean) { - return ( - - ); - } - }, - { - title: t('addition.common.property-index'), - dataIndex: 'property_indexes', - width: '17%', - render(indexes: { name: string; type: string; fields: string[] }[]) { - const joindedIndexes = - indexes.length !== 0 - ? indexes.map(({ name }) => name).join('; ') - : '-'; - - return ( -
- {joindedIndexes} -
- ); - } - }, - { - title: t('addition.operate.operate'), - dataIndex: 'manipulation', - width: '13%', - render(_: any, records: VertexType, index: number) { - return ( - - ); - } - } - ]; - - const metadataDrawerOptionClass = classnames({ - 'metadata-drawer-options': true, - 'metadata-drawer-options-disabled': isEditVertex - }); - - useEffect(() => { - setTimeout(() => { - switchPreLoading(false); - }, 500); - }, [sortOrder]); - - useEffect(() => { - return () => { - const messageComponents = document.querySelectorAll( - '.new-fc-one-message' - ) as NodeListOf; - - messageComponents.forEach((messageComponent) => { - messageComponent.style.display = 'none'; - }); - }; - }); - - useEffect(() => { - if (metadataConfigsRootStore.currentId !== null) { - metadataPropertyStore.fetchMetadataPropertyList({ fetchAll: true }); - vertexTypeStore.fetchVertexTypeList(); - } - - return () => { - vertexTypeStore.dispose(); - }; - }, [ - metadataPropertyStore, - metadataConfigsRootStore.currentId, - vertexTypeStore - ]); - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - if (vertexTypeStore.currentTabStatus === 'new') { - return ; - } - - if (vertexTypeStore.currentTabStatus === 'reuse') { - return ; - } - - return ( - -
-
- - -
- {size(currentSelectedRowKeys) !== 0 && ( -
-
- {t('addition.message.selected')} - {size(currentSelectedRowKeys)} - {t('addition.common.term')} -
- - {t('addition.common.close')} { - mutateSelectedRowKeys([]); - }} - /> -
- )} -
rowData.name} - locale={{ - emptyText: ( - } - /> - ) - }} - rowSelection={{ - selectedRowKeys, - onChange: handleSelectedTableRow - }} - onSortClick={handleSortClick} - dataSource={isLoading ? [] : vertexTypeStore.vertexTypes} - pagination={ - isLoading - ? null - : { - hideOnSinglePage: false, - pageNo: vertexTypeStore.vertexListPageConfig.pageNumber, - pageSize: 10, - showSizeChange: false, - showPageJumper: false, - total: vertexTypeStore.vertexListPageConfig.pageTotal, - onPageNoChange: (e: React.ChangeEvent) => { - // mutateSelectedRowKeys([]); - vertexTypeStore.mutatePageNumber(Number(e.target.value)); - vertexTypeStore.fetchVertexTypeList(); - } - } - } - /> - - { - switchShowModal(false); - }} - > -
-
- {t('addition.common.del-comfirm')} - {t('addition.common.close')} { - switchShowModal(false); - }} - /> -
-
- {t('addition.vertex.using-cannot-delete-confirm')} -
-
- {t('addition.message.long-time-notice')} -
-
) { - return ( - - {text} - - ); - } - }, - { - title: t('addition.common.status'), - dataIndex: 'status', - render(isUsing: boolean) { - return ( -
- {isUsing - ? t('addition.common.in-use') - : t('addition.common.not-used')} -
- ); - } - } - ]} - dataSource={currentSelectedRowKeys.map((name) => { - return { - name, - status: - vertexTypeStore.vertexTypeUsingStatus !== null && - // data may have some delay which leads to no matching propety value - !!vertexTypeStore.vertexTypeUsingStatus[name] - }; - })} - pagination={false} - /> - - - - { - if (!isEditVertex) { - switchIsEditVertex(true); - vertexTypeStore.validateEditVertexType(); - vertexTypeStore.mutateEditedSelectedVertexType({ - ...vertexTypeStore.editedSelectedVertexType, - style: { - color: vertexTypeStore.selectedVertexType!.style.color, - icon: null, - size: vertexTypeStore.selectedVertexType!.style.size, - display_fields: vertexTypeStore.selectedVertexType!.style - .display_fields - } - }); - } else { - await vertexTypeStore.updateVertexType(); - - if ( - vertexTypeStore.requestStatus.updateVertexType === 'failed' - ) { - Message.error({ - content: vertexTypeStore.errorMessage, - size: 'medium', - showCloseIcon: false - }); - - return; - } - - if ( - vertexTypeStore.requestStatus.updateVertexType === 'success' - ) { - if ( - isEmpty( - vertexTypeStore.editedSelectedVertexType - .append_property_indexes - ) - ) { - Message.success({ - content: t('addition.operate.modify-success'), - size: 'medium', - showCloseIcon: false - }); - } else { - Message.success({ - content: ( -
-
- {t('addition.common.save-scuccess')} -
-
- {t('addition.message.index-long-time-notice')} -
-
{ - setLocation( - `/graph-management/${metadataConfigsRootStore.currentId}/async-tasks` - ); - }} - > - {t('addition.operate.view-task-management')} -
-
- ), - duration: 60 * 60 * 24 - }); - } - } - - switchIsEditVertex(false); - vertexTypeStore.selectVertexType(null); - vertexTypeStore.fetchVertexTypeList(); - vertexTypeStore.resetEditedSelectedVertexType(); - } - }} - key="drawer-manipulation" - > - {isEditVertex - ? t('addition.common.save') - : t('addition.common.edit')} - , - - ]} - > - {!isEmpty(vertexTypeStore.selectedVertexType) && ( -
-
- {t('addition.menu.base-info')} -
-
-
- {t('addition.vertex.vertex-type-name')}: -
-
- {vertexTypeStore.selectedVertexType!.name} -
-
-
-
- - {t('addition.vertex.vertex-style')}: - -
-
- -
-
- -
-
-
-
- {t('addition.common.id-strategy')}: -
- { - IDStrategyMappings[ - vertexTypeStore.selectedVertexType!.id_strategy - ] - } -
-
-
- {t('addition.common.association-property')}: -
-
-
- {t('addition.common.property')} - {t('addition.common.allow-null')} -
- {vertexTypeStore.selectedVertexType!.properties.map( - ({ name, nullable }) => ( -
-
{name}
-
- -
-
- ) - )} - {isEditVertex && - vertexTypeStore.editedSelectedVertexType.append_properties.map( - ({ name }) => ( -
-
{name}
-
- -
-
- ) - )} - {isEditVertex && ( -
{ - switchIsAddProperty(!isAddProperty); - }} - > - - {t('addition.common.add-property')} - - toogleAddProperties -
- )} - {isEditVertex && isAddProperty && ( -
- {metadataPropertyStore.metadataProperties - .filter( - (property) => - vertexTypeStore.selectedVertexType!.properties.find( - ({ name }) => name === property.name - ) === undefined - ) - .map((property) => ( -
- - - propertyIndex === property.name - ) !== -1 - } - onChange={() => { - const addedPropertiesInSelectedVertextType = - vertexTypeStore.addedPropertiesInSelectedVertextType; - - addedPropertiesInSelectedVertextType.has( - property.name - ) - ? addedPropertiesInSelectedVertextType.delete( - property.name - ) - : addedPropertiesInSelectedVertextType.add( - property.name - ); - - vertexTypeStore.mutateEditedSelectedVertexType( - { - ...vertexTypeStore.editedSelectedVertexType, - append_properties: [ - ...addedPropertiesInSelectedVertextType - ].map((propertyName) => { - const currentProperty = vertexTypeStore.newVertexType.properties.find( - ({ name }) => name === propertyName - ); - - return { - name: propertyName, - nullable: !isUndefined( - currentProperty - ) - ? currentProperty.nullable - : true - }; - }) - } - ); - }} - > - {property.name} - - -
- ))} -
- )} -
-
-
-
- {t('addition.common.primary-key-property')}: -
- {vertexTypeStore.selectedVertexType!.primary_keys.join(';')} -
-
-
- - {t('addition.vertex.vertex-display-content')}: - -
- {isEditVertex ? ( - - ) : ( -
- {vertexTypeStore.selectedVertexType?.style.display_fields - .map((field) => - formatVertexIdText( - field, - t('addition.function-parameter.vertex-id') - ) - ) - .join('-')} -
- )} -
- -
- {t('addition.edge.index-info')} -
-
-
- {t('addition.menu.type-index')}: -
- -
-
-
- {t('addition.common.property-index')}: -
-
- {(vertexTypeStore.selectedVertexType!.property_indexes - .length !== 0 || - vertexTypeStore.editedSelectedVertexType - .append_property_indexes.length !== 0) && ( -
- {t('addition.edge.index-name')} - {t('addition.edge.index-type')} - {t('addition.common.property')} -
- )} - {vertexTypeStore - .selectedVertexType!.property_indexes.filter( - (propertyIndex) => - isUndefined( - vertexTypeStore.editedSelectedVertexType.remove_property_indexes.find( - (removedPropertyName) => - removedPropertyName === propertyIndex.name - ) - ) - ) - .map(({ name, type, fields }, index) => { - return ( -
-
{name}
-
{propertyIndexTypeMappings[type]}
-
- - {fields - .map((field, index) => index + 1 + '.' + field) - .join(';')} - - - {isEditVertex && ( - -

- {t( - 'addition.message.property-del-confirm' - )} -

-

- {t('addition.message.index-del-confirm')} -

-
-
{ - const removedPropertyIndexes = cloneDeep( - vertexTypeStore - .editedSelectedVertexType - .remove_property_indexes - ); - - removedPropertyIndexes.push( - vertexTypeStore.selectedVertexType! - .property_indexes[index].name - ); - - vertexTypeStore.mutateEditedSelectedVertexType( - { - ...vertexTypeStore.editedSelectedVertexType, - remove_property_indexes: removedPropertyIndexes - } - ); - - setDeleteExistPopIndexInDrawer(null); - vertexTypeStore.validateEditVertexType( - true - ); - }} - > - {t('addition.common.confirm')} -
-
{ - setDeleteExistPopIndexInDrawer(null); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: CloseIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeleteExistPopIndexInDrawer(index); - } - }} - childrenWrapperElement="img" - /> - )} -
-
- ); - })} - {vertexTypeStore.editedSelectedVertexType.append_property_indexes.map( - ({ name, type, fields }, index) => { - return ( -
-
- { - const propertyIndexEntities = cloneDeep( - vertexTypeStore.editedSelectedVertexType - .append_property_indexes - ); - - propertyIndexEntities[index].name = e.value; - - vertexTypeStore.mutateEditedSelectedVertexType({ - ...vertexTypeStore.editedSelectedVertexType, - append_property_indexes: propertyIndexEntities - }); - }} - originInputProps={{ - onBlur() { - // check is ready to create - vertexTypeStore.validateEditVertexType(); - } - }} - /> -
-
- -
-
- - - -

- {t('addition.message.property-del-confirm')} -

-

- {t('addition.message.index-del-confirm')} -

-
-
{ - const appendPropertyIndexes = cloneDeep( - vertexTypeStore.editedSelectedVertexType! - .append_property_indexes - ); - - appendPropertyIndexes.splice(index, 1); - - vertexTypeStore.mutateEditedSelectedVertexType( - { - ...vertexTypeStore.editedSelectedVertexType, - append_property_indexes: appendPropertyIndexes - } - ); - - setDeleteAddedPopIndexInDrawer(null); - vertexTypeStore.validateEditVertexType( - true - ); - }} - > - {t('addition.common.confirm')} -
-
{ - vertexTypeStore.resetEditedSelectedVertexType(); - setDeleteAddedPopIndexInDrawer(null); - }} - > - {t('addition.common.cancel')} -
-
-
- } - childrenProps={{ - src: CloseIcon, - alt: 'close', - style: { cursor: 'pointer' }, - onClick() { - setDeleteAddedPopIndexInDrawer(index); - } - }} - childrenWrapperElement="img" - /> -
-
- ); - } - )} - {isEditVertex && ( - { - if ( - vertexTypeStore.editedSelectedVertexType - .append_property_indexes.length === 0 || - vertexTypeStore.isEditReady - ) { - vertexTypeStore.mutateEditedSelectedVertexType({ - ...vertexTypeStore.editedSelectedVertexType, - append_property_indexes: [ - ...vertexTypeStore.editedSelectedVertexType - .append_property_indexes, - { - name: '', - type: '', - fields: [] - } - ] - }); - - vertexTypeStore.validateEditVertexType(true); - } - }} - style={{ - cursor: 'pointer', - color: vertexTypeStore.isEditReady ? '#2b65ff' : '#999' - }} - > - {t('addition.edge.add-group')} - - )} -
- - - )} -
- - - ); -}); - -export interface VertexTypeListManipulation { - vertexName: string; - vertexIndex: number; - switchIsEditVertex: (flag: boolean) => void; -} - -const VertexTypeListManipulation: React.FC = observer( - ({ vertexName, vertexIndex, switchIsEditVertex }) => { - const { vertexTypeStore } = useContext(MetadataConfigsRootStore); - const [isPopDeleteModal, switchPopDeleteModal] = useState(false); - const [isDeleting, switchDeleting] = useState(false); - const { t } = useTranslation(); - const deleteWrapperRef = useRef(null); - const isDeleteOrBatchDeleting = - isDeleting || - (vertexTypeStore.requestStatus.deleteVertexType === 'pending' && - vertexTypeStore.selectedVertexTypeNames.includes(vertexName)); - - const handleOutSideClick = useCallback( - (e: MouseEvent) => { - if ( - isPopDeleteModal && - deleteWrapperRef && - deleteWrapperRef.current && - !deleteWrapperRef.current.contains(e.target as Element) - ) { - switchPopDeleteModal(false); - } - }, - [deleteWrapperRef, isPopDeleteModal] - ); - - useEffect(() => { - document.addEventListener('click', handleOutSideClick, false); - - return () => { - document.removeEventListener('click', handleOutSideClick, false); - }; - }, [handleOutSideClick]); - - return ( -
- { - vertexTypeStore.selectVertexType(vertexIndex); - vertexTypeStore.validateEditVertexType(true); - switchIsEditVertex(true); - - vertexTypeStore.mutateEditedSelectedVertexType({ - ...vertexTypeStore.editedSelectedVertexType, - style: { - color: vertexTypeStore.selectedVertexType!.style.color, - icon: null, - size: vertexTypeStore.selectedVertexType!.style.size, - display_fields: vertexTypeStore.selectedVertexType!.style - .display_fields - } - }); - }} - > - {t('addition.common.edit')} - -
- {isDeleteOrBatchDeleting && ( - - )} - - {vertexTypeStore.vertexTypeUsingStatus && - vertexTypeStore.vertexTypeUsingStatus[vertexName] ? ( -

- {t('addition.vertex.using-cannot-delete')} -

- ) : ( - <> -

- {t('addition.vertex.del-vertex-confirm')} -

-

{t('addition.vertex.del-vertex-confirm-again')}

-

{t('addition.message.long-time-notice')}

-
- - -
- - )} -
- } - childrenProps={{ - className: 'metadata-properties-manipulation', - title: isDeleteOrBatchDeleting - ? t('addition.operate.del-ing') - : t('addition.common.del'), - async onClick() { - if (isDeleteOrBatchDeleting) { - return; - } - - await vertexTypeStore.checkIfUsing([vertexName]); - - if (vertexTypeStore.requestStatus.checkIfUsing === 'success') { - switchPopDeleteModal(true); - } - } - }} - > - {isDeleteOrBatchDeleting - ? t('addition.operate.del-ing') - : t('addition.common.del')} - -
- - ); - } -); - -const EmptyVertxTypeHints: React.FC = observer(() => { - const { vertexTypeStore } = useContext(MetadataConfigsRootStore); - const { t } = useTranslation(); - - return ( -
- Add new property -
- {t('addition.vertex.no-vertex-type-desc')} -
-
- - -
-
- ); -}); - -export default VertexTypeList; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/index.ts deleted file mode 100644 index acd50f8f0..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/graph-management/metadata-configs/vertex-type/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import VertexTypeList from './VertexTypeList'; -import NewVertexType from './NewVertexType'; - -export { NewVertexType, VertexTypeList }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/hubble-ui/index.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/hubble-ui/index.tsx deleted file mode 100644 index f856514e6..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/hubble-ui/index.tsx +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -/* eslint-disable */ -import { - Transfer as TransferAntD, - Popover, - Pagination as PaginationAntD, - Steps as StepsAntD, - Progress as ProgressAntD, - Checkbox as CheckboxAntD, - Menu as MenuAntD, - Spin, - Breadcrumb as BreadcrumbAntD, - Calendar as CalendarAntD, - InputNumber, - Switch as SwitchAntd, - Table as TableAntD, - Radio as RadioAntD, - Tooltip as TooltipAntD, - Alert as AlertAntD, - Button as ButtonAntD, - Modal as ModalAntD, - Drawer as DrawerAntD, - Input as InputAntD, - message, - Select as SelectAntD, - Dropdown as DropdownAntd -} from 'antd'; -import * as React from 'react'; - -// In order to make the project run, let the components of antd replace baiduUI -// Special Note: All check boxes can be selected, but some check boxes cannot see -// the selection content, but it does not affect the submission. If you need to see -// the selection, you need to modify the value property of the corresponding Select -// component. There is no uniform modification here - -const changeSize = (props: any): any => { - let _size = props.size; - if (_size === 'medium') { - _size = 'middle'; - } - if (!_size) { - _size = 'small'; - } - return { - ...props, - size: _size - }; -}; - -export const Alert = (props: any) => { - return ; -}; - -export const Button = (props: any) => { - return {props.children}; -}; - -export const Modal = ModalAntD; - -export const Drawer = (props: any) => { - return {props.children}; -}; - -export const Input = (props: any) => { - let _blur = () => {}; - if (props.originInputProps && props.originInputProps.onBlur) { - _blur = props.originInputProps.onBlur; - } - // change e.value to eventTarget.currentTarget - const _props = { - ...props, - onChange: (e: any) => { - props.onChange({ - value: e.currentTarget.value - }); - } - }; - return ( -
- - {props.errorMessage ? ( -
- {props.errorMessage} -
- ) : ( - '' - )} -
- ); -}; -Input.Search = (props: any) => { - return ( - - ); -}; - -export const Message = { - info: (data: any) => { - message.info(data.content); - }, - success: (data: any) => { - message.success(data.content); - }, - error: (data: any) => { - message.error(data.content); - }, - warning: (data: any) => { - message.warning(data.content); - }, - loading: (data: any) => { - message.loading(data.content); - } -}; - -export const Select: any = (props: any) => { - return ( - - {props.children} - - ); -}; -Select.Option = SelectAntD.Option; -export const Tooltip: any = TooltipAntD; - -export const Dropdown: any = { - Button(props: any) { - let _overlay: any = []; - if (props.options) { - _overlay = ( - - {props.options.map((item: any) => ( - - {item.label} - - ))} - - ); - } - - return ( - {}) - }} - > - {props.title} - - ); - } -}; -export const Radio: any = RadioAntD; - -export const Table: any = (props: any) => { - let pagination = {}; - let pageChangerTag = false; - if (props.pagination) { - pagination = { - ...props.pagination, - onChange: (page: any, size: any) => { - if (pageChangerTag) { - return; - } - props.pagination.onPageNoChange({ - target: { - value: page - } - }); - }, - showQuickJumper: props.pagination.showPageJumper, - current: props.pagination.pageNo, - onShowSizeChange: (e: any, size: any) => { - pageChangerTag = true; - props.pagination.onPageSizeChange({ - target: { - value: size - } - }); - setTimeout(() => { - pageChangerTag = false; - }); - } - }; - } - let _handleChange: any = props.onChange || (() => {}); - // able to sort - if (!props.onChange && props.onSortClick) { - _handleChange = props.onSortClick; - } - return ( - - {props.children} - - ); -}; - -export const Switch: any = (props: any) => { - return ( - - ); -}; - -export const NumberBox: any = InputNumber; - -export const Calendar = (props: any) => { - props.onSelect = props.onSelectDay; - return ; -}; -export const Breadcrumb: any = BreadcrumbAntD; - -export const Loading: any = Spin; - -export const Menu: any = MenuAntD; - -export const Checkbox: any = CheckboxAntD; - -export const Progress: any = ProgressAntD; - -export const Steps: any = StepsAntD; - -export const Embedded: any = (props: any) => { - return ( - - {props.children} - - ); -}; -export const Pagination = (props: any) => { - return ( - - ); -}; - -export const PopLayer: any = (props: any) => { - return ( - {props.children} - ); -}; - -export const Transfer: any = (props: any) => { - const _treeName = props.treeName; - const dataSource = props.dataSource || []; - const allDataMap = props.allDataMap; - if (allDataMap) { - for (const key in allDataMap) { - dataSource.push(allDataMap[key]); - } - } - return ( - { - props.handleSelect(targetKeys); - }, - titles: [`可选${_treeName}`, `已选${_treeName}`], - render: (item) => `${item.title}` - }} - > - {props.children} - - ); -}; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/hubble-ui/src/index.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/components/hubble-ui/src/index.less deleted file mode 100644 index a7e8f030e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/components/hubble-ui/src/index.less +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -@import '~antd/dist/antd.css'; -.new-fc-one-input-count-visible { - display: inline-block; -} - -.new-fc-one-input-count-error { - color: #e64552; -} - -.new-fc-one-input-all-container, -.new-fc-one-input-all-container .new-fc-one-input-detail { - display: inline-block; - position: relative; -} - -.new-fc-one-input-all-container-error .new-fc-one-input { - border: 1px solid #e64552; - background-color: #fff; - color: #333; -} - -.new-fc-one-input-all-container-error .new-fc-one-input:active, -.new-fc-one-input-all-container-error .new-fc-one-input:focus, -.new-fc-one-input-all-container-error .new-fc-one-input:hover { - outline: 0; - border-color: #e64552; -} - -.new-fc-one-input-all-container-error .new-fc-one-input:focus { - box-shadow: 0 0 0 2px rgba(230, 69, 82, 0.2); -} - -.new-fc-one-input-error { - color: #e64552; -} - -.new-fc-one-input-error-bottom { - margin-top: 8px; -} - -.new-fc-one-input-error-right { - display: inline-block; - margin-left: 8px; -} - -.new-fc-one-input-error-layer { - line-height: 100%; - z-index: 2; - box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15); - background: #fff; - position: absolute; - left: 0; - display: inline-block; - padding: 16px; - color: #e64552; -} - -.new-fc-one-input-error-layer:before { - content: ''; - width: 0; - height: 0; - left: 16px; - border: 8px solid transparent; - border-bottom-color: #fff; - top: -12px; - position: absolute; -} - -.new-fc-one-input-group-addon > div { - border: 1px solid #e0e0e0 !important; -} - -.new-fc-one-input-group-addon-before > div { - border-right: 0 !important; -} - -.new-fc-one-input-group-addon-after > div { - border-left: 0 !important; -} - -.new-fc-one-input-group { - display: flex; -} - -.new-fc-one-input-group .new-fc-one-input { - border-radius: 0; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/index.ts deleted file mode 100644 index e0bc572e4..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import useMultiKeyPress from './useMultiKeyPress'; -import useInitDataImport from './useInitDataImport'; -import useLocationWithConfirmation from './useLocationWithConfirmation'; - -export { useMultiKeyPress, useInitDataImport, useLocationWithConfirmation }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useInitDataImport.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useInitDataImport.tsx deleted file mode 100644 index 6140b40e1..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useInitDataImport.tsx +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { useState, useEffect, useContext } from 'react'; -import { useRoute, useLocation } from 'wouter'; -import { isNull, isEmpty, isUndefined } from 'lodash-es'; - -import { - GraphManagementStoreContext, - ImportManagerStoreContext, - DataImportRootStoreContext -} from '../stores'; - -export default function useInitDataImport() { - const graphManagementStore = useContext(GraphManagementStoreContext); - const importManagerStore = useContext(ImportManagerStoreContext); - const dataImportRootStore = useContext(DataImportRootStoreContext); - const { dataMapStore, serverDataImportStore } = dataImportRootStore; - const [initReady, setInitReady] = useState( - !isEmpty(importManagerStore.importJobList) - ); - const [, setLocation] = useLocation(); - - const [, params] = useRoute( - '/graph-management/:id/data-import/import-manager/:jobId/import-tasks/:status' - ); - - useEffect(() => { - const init = async (params: Record) => { - const { id, jobId, status } = params!; - // sidebar data - graphManagementStore.fetchIdList(); - - // init importManagerStore - importManagerStore.setCurrentId(Number(id)); - // import job list - await importManagerStore.fetchImportJobList(); - importManagerStore.setSelectedJob(Number(jobId)); - - // init dataImportRootStore - dataImportRootStore.setCurrentId(Number(id)); - dataImportRootStore.setCurrentJobId(Number(jobId)); - - await dataMapStore.fetchDataMaps(); - - const job = importManagerStore.importJobList.find( - ({ id: _jobId }) => _jobId === Number(jobId) - ); - - if (isUndefined(job)) { - return; - } - - const defautlSelectedFileId = dataMapStore.fileMapInfos.filter( - ({ file_status }) => file_status === 'COMPLETED' - )[0]?.id; - - dataImportRootStore.setCurrentStatus(job.job_status); - - if (status === 'upload') { - if (job.job_status === 'DEFAULT' || job.job_status === 'UPLOADING') { - } - - if (job.job_status === 'MAPPING') { - dataMapStore.setSelectedFileId(defautlSelectedFileId); - dataMapStore.setSelectedFileInfo(); - dataMapStore.switchIrregularProcess(true); - serverDataImportStore.syncImportConfigs( - dataMapStore.selectedFileInfo!.load_parameter - ); - - // setLocation( - // `/graph-management/${id}/data-import/import-manager/${jobId}/import-tasks/mapping` - // ); - } - - if (job.job_status === 'SETTING' || job.job_status === 'LOADING') { - dataMapStore.setSelectedFileId(defautlSelectedFileId); - dataMapStore.setSelectedFileInfo(); - dataMapStore.switchIrregularProcess(true); - - serverDataImportStore.syncImportConfigs( - dataMapStore.selectedFileInfo!.load_parameter - ); - serverDataImportStore.switchIrregularProcess(true); - - // setLocation( - // `/graph-management/${id}/data-import/import-manager/${jobId}/import-tasks/loading` - // ); - } - - if (job.job_status === 'LOADING') { - dataMapStore.switchLock(true); - serverDataImportStore.switchImportConfigReadOnly(true); - - setLocation( - `/graph-management/${id}/data-import/import-manager/${jobId}/import-tasks/loading` - ); - } - - if (job.job_status === 'SUCCESS' || job.job_status === 'FAILED') { - setLocation(`/graph-management/${id}/data-import/import-manager`); - importManagerStore.setSelectedJob(null); - } - } - - if (status === 'mapping') { - if (job.job_status === 'DEFAULT' || job.job_status === 'UPLOADING') { - dataMapStore.setSelectedFileId(defautlSelectedFileId); - dataMapStore.setSelectedFileInfo(); - dataMapStore.switchIrregularProcess(true); - serverDataImportStore.syncImportConfigs( - dataMapStore.selectedFileInfo!.load_parameter - ); - - // setLocation( - // `/graph-management/${id}/data-import/import-manager/${jobId}/import-tasks/mapping` - // ); - } - - if (job.job_status === 'MAPPING') { - dataMapStore.setSelectedFileId(defautlSelectedFileId); - dataMapStore.setSelectedFileInfo(); - dataMapStore.switchIrregularProcess(true); - serverDataImportStore.syncImportConfigs( - dataMapStore.selectedFileInfo!.load_parameter - ); - } - - if (job.job_status === 'SETTING' || job.job_status === 'LOADING') { - dataMapStore.setSelectedFileId(defautlSelectedFileId); - dataMapStore.setSelectedFileInfo(); - dataMapStore.switchIrregularProcess(true); - serverDataImportStore.syncImportConfigs( - dataMapStore.selectedFileInfo!.load_parameter - ); - serverDataImportStore.switchIrregularProcess(true); - - // setLocation( - // `/graph-management/${id}/data-import/import-manager/${jobId}/import-tasks/loading` - // ); - } - - if (job.job_status === 'LOADING') { - dataMapStore.switchLock(true); - serverDataImportStore.switchImportConfigReadOnly(true); - setLocation( - `/graph-management/${id}/data-import/import-manager/${jobId}/import-tasks/loading` - ); - } - - if (job.job_status === 'SUCCESS' || job.job_status === 'FAILED') { - setLocation(`/graph-management/${id}/data-import/import-manager`); - importManagerStore.setSelectedJob(null); - } - } - - if (status === 'loading') { - if (job.job_status === 'DEFAULT' || job.job_status === 'UPLOADING') { - setLocation( - `/graph-management/${id}/data-import/import-manager/${jobId}/import-tasks/upload` - ); - } - - if (job.job_status === 'MAPPING') { - dataMapStore.setSelectedFileId(defautlSelectedFileId); - dataMapStore.setSelectedFileInfo(); - dataMapStore.switchIrregularProcess(true); - serverDataImportStore.syncImportConfigs( - dataMapStore.selectedFileInfo!.load_parameter - ); - - setLocation( - `/graph-management/${id}/data-import/import-manager/${jobId}/import-tasks/mapping` - ); - } - - if (job.job_status === 'SETTING' || job.job_status === 'LOADING') { - dataMapStore.setSelectedFileId(defautlSelectedFileId); - dataMapStore.setSelectedFileInfo(); - dataMapStore.switchIrregularProcess(true); - - serverDataImportStore.syncImportConfigs( - dataMapStore.selectedFileInfo!.load_parameter - ); - serverDataImportStore.switchIrregularProcess(true); - } - - if (job.job_status === 'SETTING') { - dataMapStore.switchReadOnly(false); - } - - if (job.job_status === 'LOADING') { - dataMapStore.switchLock(true); - serverDataImportStore.switchImportConfigReadOnly(true); - } - - if (job.job_status === 'SUCCESS' || job.job_status === 'FAILED') { - setLocation(`/graph-management/${id}/data-import/import-manager`); - importManagerStore.setSelectedJob(null); - } - } - - setInitReady(true); - }; - - // if importJobList is empty, users may refresh their page - // if fileMapInfos is empty, users may click back/forward button on browser - if ( - !isNull(params) && - (isEmpty(importManagerStore.importJobList) || - isNull(importManagerStore.selectedJob)) - ) { - init(params); - } - }, [ - params?.status, - importManagerStore.importJobList, - importManagerStore.selectedJob?.id - ]); - - return initReady; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useLocationWithConfirmation.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useLocationWithConfirmation.tsx deleted file mode 100644 index 27eff539d..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useLocationWithConfirmation.tsx +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { useContext } from 'react'; -import useLocation from 'wouter/use-location'; -import { last } from 'lodash-es'; - -import i18next from '../i18n'; -import { - ImportManagerStoreContext, - DataImportRootStoreContext -} from '../stores'; - -export default function useLocationWithConfirmation() { - const importManagerStore = useContext(ImportManagerStoreContext); - const dataImportRootStore = useContext(DataImportRootStoreContext); - const [location, setLocation] = useLocation(); - const status = last(location.split('/')); - - return [ - location, - (newLocation: string) => { - let perfomNavigation = true; - const category = last(newLocation.split('/')); - - if ( - status === 'upload' && - category === 'import-manager' && - dataImportRootStore.fileUploadTasks.some( - ({ status }) => status === 'uploading' - ) - ) { - perfomNavigation = window.confirm( - i18next.t('server-data-import.hint.confirm-navigation') - ); - } - - if (perfomNavigation) { - if ( - ['upload', 'mapping', 'loading'].includes(String(status)) && - category === 'import-manager' - ) { - importManagerStore.setSelectedJob(null); - importManagerStore.fetchImportJobList(); - } - - setLocation(newLocation); - } - } - ]; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useMultiKeyPress.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useMultiKeyPress.tsx deleted file mode 100644 index c206df56a..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/hooks/useMultiKeyPress.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { useState, useEffect } from 'react'; - -export default function useMultiKeyPress() { - const [keysPressed, setKeyPressed] = useState>(new Set()); - - const keydownHandler = (e: KeyboardEvent) => { - // use e.key here may cause some unexpected behavior with shift key - setKeyPressed((prev) => new Set(prev.add(e.code))); - }; - - const keyupHandler = (e: KeyboardEvent) => { - // use e.key here may cause some unexpected behavior with shift key - if (navigator.platform.includes('Mac') && e.code.includes('Meta')) { - // weired, like above we need to mutate keysPressed first - keysPressed.clear(); - setKeyPressed(new Set()); - return; - } - - keysPressed.delete(e.code); - setKeyPressed(new Set(keysPressed)); - }; - - useEffect(() => { - window.addEventListener('keydown', keydownHandler); - window.addEventListener('keyup', keyupHandler); - - return () => { - window.removeEventListener('keydown', keydownHandler); - window.removeEventListener('keyup', keyupHandler); - }; - }, []); - - return keysPressed; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/index.ts deleted file mode 100644 index 4ecdfc2d1..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import i18n from 'i18next'; -import { initReactI18next } from 'react-i18next'; - -import { zhCNResources, enUSResources } from './resources'; - -i18n.use(initReactI18next).init({ - lng: localStorage.getItem('languageType') || 'zh-CN', - fallbackLng: 'zh-CN', - - resources: { - 'zh-CN': zhCNResources, - 'en-US': enUSResources - }, - - interpolation: { - escapeValue: false // not needed for react as it escapes by default - } -}); - -export default i18n; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/AsyncTasks.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/AsyncTasks.json deleted file mode 100644 index d02ae887f..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/AsyncTasks.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "async-tasks": { - "title": "Task Management", - "placeholders": { - "search": "Enter task ID or name to search" - }, - "table-column-title": { - "task-id": "Task ID", - "task-name": "Task Name", - "task-type": "Task Type", - "create-time": "Create Time", - "time-consuming": "Time Consuming", - "status": "Status", - "manipulation": "Operation" - }, - "table-filters": { - "task-type": { - "all": "All", - "gremlin": "Gremlin Task", - "algorithm": "Algorithm Task", - "remove-schema": "Remove Metadata", - "create-index": "Create Index", - "rebuild-index": "Rebuild Index" - }, - "status": { - "all": "All", - "scheduling": "Scheduling", - "scheduled": "Queued", - "queued": "Queued", - "running": "Running", - "restoring": "Restoring", - "success": "Success", - "failed": "Failed", - "cancelling": "Cancelled", - "cancelled": "Cancelled" - } - }, - "table-selection": { - "selected": "Selected {{number}} items", - "delete-batch": "Batch Delete" - }, - "manipulations": { - "abort": "Abort", - "aborting": "Aborting", - "delete": "Delete", - "check-result": "Check Result", - "check-reason": "Check Reason" - }, - "hint": { - "delete-confirm": "Delete Confirmation", - "delete-description": "Are you sure you want to delete this task? Deletion is irreversible, please proceed with caution", - "delete-succeed": "Delete Successful", - "delete-batch-confirm": "Batch Delete", - "delete-batch-description": "Confirm deletion of the following tasks? Deletion is irreversible, please proceed with caution", - "delete": "Delete", - "cancel": "Cancel", - "no-data": "No Data Available", - "empty": "You currently have no tasks", - "select-disabled": "Task {{id}} cannot be selected for deletion", - "check-details": "Check Details", - "creation-failed": "Creation Failed" - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/GraphManagementSidebar.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/GraphManagementSidebar.json deleted file mode 100644 index 4ffabfc8b..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/GraphManagementSidebar.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "data-import": "Data import", - "import-task": "Import task", - "map-templates": "Mapping template" -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/addition.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/addition.json deleted file mode 100644 index ebbfa2d81..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/addition.json +++ /dev/null @@ -1,348 +0,0 @@ -{ - "addition": { - "function-parameter": { - "edge-type": "Edge Type", - "vertex-id": "Vertex ID" - }, - "store": { - "required": "Required", - "item-is-required": "This item is required", - "no-match-input-requirements": "Does not match input requirements", - "rule1": "Please enter letters, numbers, or special characters", - "rule2": "Please enter a number in the range of 1-65535", - "rule3": "Username and password must be filled in at the same time", - "rule4": "Must be in Chinese, English, numbers, and underscores", - "illegal-data-format": "Illegal data format", - "incorrect-time-format": "Incorrect time format", - "cannot-be-empty": "This item cannot be empty", - "cannot-be-empty1": "This item cannot be empty", - "same-edge-name-notice": "Same edge name exists, please enter another name", - "same-vertex-name-notice": "Same vertex name exists, please enter another name", - "same-property-name-notice": "Same property name exists, please enter another name", - "same-index-name-notice": "Same property index name exists, please enter another name", - "network-error": "Network anomaly, please try again later" - }, - "constant": { - "primary-key-id": "Primary Key ID", - "automatic-generation": "Automatic Generation", - "custom-string": "Custom String", - "custom-number": "Custom Number", - "custom-uuid": "Custom UUID", - "greater-than": "Greater Than", - "greater-than-or-equal": "Greater Than or Equal", - "less-than": "Less Than", - "less-than-or-equal": "Less Than or Equal", - "equal": "Equal" - }, - "menu": { - "chart": "Chart", - "table": "Table", - "task-id": "Task ID", - "list-mode": "List Mode", - "chart-mode": "Chart Mode", - "secondary-index": "Secondary Index", - "range-index": "Range Index", - "full-text-index": "Full Text Index", - "type-index": "Type Index", - "base-info": "Basic Information", - "select-reuse-item": "Select Reuse Item", - "confirm-reuse-item": "Confirm Reuse Item", - "complete-reuse": "Complete Reuse" - }, - "vertex": { - "type-detail": "Vertex Type Details", - "edit-type": "Edit Vertex Type", - "using-cannot-delete": "The current vertex type is in use and cannot be deleted.", - "using-cannot-delete-confirm": "The vertex type in use cannot be deleted. Are you sure you want to delete the following unused vertex types?", - "del-vertex-confirm": "Confirm deletion of this vertex type?", - "del-vertex-confirm-again": "Confirm deletion of this vertex type? Deletion is irreversible, please proceed with caution", - "vertex-type-name": "Vertex Type Name", - "vertex-style": "Vertex Style", - "vertex-display-content": "Vertex Display Content", - "select-vertex-display-content-placeholder": "Please select vertex display content", - "create-vertex-type": "Create Vertex Type", - "vertex-index": "Vertex Index", - "corresponding-vertex-type": "Corresponding Vertex Type", - "no-vertex-type-desc": "You currently do not have any vertex types, create one now" - }, - "edge": { - "display-content": "Edge Display Content", - "display-content-select-desc": "Please select edge display content", - "index-info": "Index Information", - "index-name": "Index Name", - "index-type": "Index Type", - "edge-index": "Edge Index", - "index-type-select-desc": "Please select index type", - "property-select-desc": "Please select property", - "add-group": "Add a group", - "confirm-del-edge-type": "Confirm deletion of this edge type?", - "confirm-del-edge-type-again": "Confirm deletion of edge type? Deletion is irreversible, please proceed with caution", - "confirm-del-edge-careful-notice": "Deletion is irreversible, please proceed with caution", - "no-edge-desc": "You currently do not have any edge types, create one now", - "create-edge": "Create Edge Type", - "multiplexing-existing-type": "Multiplex Existing Type", - "multiplexing-edge-type": "Multiplex Edge Type", - "multiplexing-edge-type-notice": "The attributes and attribute indexes, start and end types, and associated attributes and attribute indexes of the edge type will be reused together", - "verification-result": "Verification Result", - "be-verified": "To be verified", - "verified-again": "Re-verify" - }, - "message": { - "no-can-delete-vertex-type": "No deletable vertex types", - "no-index-notice": "You currently do not have any indexes", - "property-create-desc": "You currently do not have any properties, create one now", - "del-unused-property-notice": "In-use properties cannot be deleted. Confirm deletion of the following unused properties?", - "please-enter-keywords": "Please enter search keywords", - "no-property-can-delete": "No deletable properties", - "no-metadata-notice": "You currently do not have any metadata", - "no-vertex-or-edge-notice": "You have not set any vertex types or edge types", - "no-adjacency-points": "No adjacent points", - "no-more-points": "No more adjacent points", - "please-enter-number": "Please enter a number", - "please-enter-string": "Please enter a string", - "please-enter": "Please enter", - "no-chart-desc": "No graph results, please view the table or JSON data", - "no-data-desc": "No data results at the moment", - "data-loading": "Data loading", - "submit-async-task": "Submitting asynchronous task", - "submit-success": "Submission successful", - "submit-fail": "Submission failed", - "task-submit-fail": "Task submission failed", - "fail-reason": "Failure reason", - "fail-position": "Failure position", - "selected": "Selected", - "edge-del-confirm": "Confirm deletion of the following edges?", - "long-time-notice": "Deleting metadata may take a long time, details can be viewed in task management", - "index-long-time-notice": "Creating indexes may take a long time, details can be viewed in task management", - "property-del-confirm": "Confirm deletion of this property?", - "property-del-confirm-again": "Confirm deletion of this property? Deletion is irreversible, please proceed with caution", - "index-del-confirm": "After deleting the index, queries based on this property index will not be possible. Proceed with caution.", - "edge-name-rule": "Allowing Chinese, English, numbers, and underscores", - "source-type-select-placeholder": "Please select source type", - "target-type-select-placeholder": "Please select target type", - "select-distinguishing-key-property-placeholder": "Please select distinguishing key property", - "select-association-key-property-placeholder": "Please select associated property", - "index-open-notice": "Enabling indexes may affect performance, enable as needed", - "duplicate-name": "Duplicate name", - "dependency-conflict": "Dependency conflict", - "already-exist": "Already exists", - "pass": "Pass", - "select-reuse-graph-placeholder": "Please select the graph to reuse", - "reuse-complete": "Reuse complete", - "vertex-type-reuse-success": "Vertex type reuse successful", - "property-using-cannot-delete": "The current property data is in use and cannot be deleted.", - "reuse-property-success": "Property reuse successful", - "reuse-vertex-type-notice": "The attributes and attribute indexes associated with the vertex type will be reused together", - "illegal-vertex": "This vertex is an illegal vertex, possibly caused by a dangling edge" - }, - "operate": { - "reuse-vertex-type": "Reuse Vertex Type", - "reuse-existing-property": "Reuse Existing Property", - "reuse-property": "Reuse Property", - "create-property": "Create Property", - "continue-reuse": "Continue Reuse", - "back-to-view": "Back to View", - "complete": "Complete", - "next-step": "Next Step", - "previous-step": "Previous Step", - "rename": "Rename", - "del-ing": "Deleting", - "view-task-management": "View Task Management", - "batch-del": "Batch Delete", - "multiplexing": "Multiplex", - "de-multiplexing": "Cancel Multiplexing", - "open": "Open", - "close": "Close", - "look": "View", - "view-property": "View Property", - "filter": "Filter", - "add-filter-item": "Add Property Filter", - "enlarge": "Enlarge", - "narrow": "Shrink", - "center": "Center", - "download": "Download", - "exit-full-screen": "Exit Full Screen", - "full-screen": "Full Screen", - "load-background": "Load Background", - "load-spinner": "Load Spinner", - "rendering": "Rendering", - "detail": "Detail", - "favorite": "Favorite", - "favorite-success": "Favorite successful", - "load-statement": "Load Statement", - "time": "Time", - "name": "Name", - "favorite-statement": "Favorite Statement", - "favorite-desc": "Please enter favorite name", - "operate": "Operate", - "query": "Query", - "hidden": "Hide", - "modify-name": "Modify Name", - "execution-record": "Execution Record", - "favorite-queries": "Favorite Queries", - "favorite-search-desc": "Search favorite name or statement", - "expand-collapse": "Expand/Collapse", - "expand": "Expand", - "collapse": "Collapse", - "favorite-del-desc": "Are you sure you want to delete this favorite statement?", - "input-query-statement": "Please input query statement", - "query-statement-required": "Query statement cannot be empty", - "execute-query": "Execute Query", - "execute-task": "Execute Task", - "execute-ing": "Executing", - "clean": "Clear", - "modify-success": "Modification successful", - "query-result-desc": "Query mode is suitable for small-scale analysis with results returned within 30 seconds; task mode is suitable for large-scale analysis with longer result return times, task details can be viewed in task management" - }, - "common": { - "in-use": "In Use", - "not-used": "Not Used", - "status": "Status", - "no-result": "No Result", - "cardinal-number": "Cardinal Number", - "allow-null": "Allow Null", - "allow-multiple-connections": "Allow Multiple Connections", - "multiple-connections-notice": "Enabling this allows multiple edges of the same type between two vertices", - "term": "Items", - "in-edge": "In Edge", - "add-in-edge": "Add In Edge", - "out-edge": "Out Edge", - "add-out-edge": "Add Out Edge", - "add": "Add", - "value": "Value", - "null-value": "Null Value", - "id-strategy": "ID Strategy", - "id-value": "ID Value", - "id-input-desc": "Please enter ID value", - "please-input": "Please enter", - "add-success": "Add successful", - "add-fail": "Add failed", - "vertex-type": "Vertex Type", - "selected-vertex-type": "Selected Vertex Type", - "vertex-id": "Vertex ID", - "vertex-name": "Vertex Name", - "illegal-vertex-desc": "This vertex is an illegal vertex, possibly caused by a dangling edge", - "add-vertex": "Add Vertex", - "vertex-type-select-desc": "Please select vertex type", - "edge-type": "Edge Type", - "selected-edge-type": "Selected Edge Type", - "edge-style": "Edge Style", - "modify-edge-type": "Edit Edge Type", - "edge-type-detail": "Edge Type Details", - "edge-type-name": "Edge Type Name", - "edge-direction": "Edge Direction", - "edge-type-select-desc": "Please select edge type", - "edge-id": "Edge ID", - "edge-name": "Edge Name", - "source": "Source", - "source-type": "Source Type", - "target": "Target", - "target-type": "Target Type", - "rule": "Rule", - "property": "Property", - "selected-property": "Selected Property", - "property-name": "Property Name", - "add-property": "Add Property", - "association-property": "Association Property", - "association-property-and-type": "Association Property and Type", - "property-index": "Property Index", - "selected-property-index": "Selected Property Index", - "property-index-name": "Property Index Name", - "property-value": "Property Value", - "required-property": "Required Property", - "nullable-property": "Nullable Property", - "primary-key": "Primary Key", - "primary-key-property": "Primary Key Property", - "select-primary-key-property-placeholder": "Please select primary key property", - "distinguishing-key": "Distinguishing Key", - "distinguishing-key-property": "Distinguishing Key Property", - "property-input-desc": "Please enter property value", - "del-comfirm": "Confirm deletion", - "ask": "?", - "confirm": "Confirm", - "del-success": "Deletion successful", - "save-scuccess": "Save successful", - "save-fail": "Save failed", - "save": "Save", - "cancel": "Cancel", - "more": "More", - "edit": "Edit", - "del": "Delete", - "fold": "Fold", - "open": "Expand", - "close": "Close", - "required": "Required", - "format-error-desc": "Must start with a letter, allow English, numbers, underscore", - "no-matching-results": "No matching results", - "no-data": "No data", - "data-type": "Data Type", - "corresponding-type": "Corresponding Type" - }, - "appbar": { - "graph-manager": "Graph Manager" - }, - "graphManagementHeader": { - "graph-manager": "Graph Manager", - "community": "Community Edition", - "business": "Business Edition", - "limit-desc": "Graph Limit Support", - "limit-desc1": "Graph Disk Limit", - "individual": "Individual", - "input-placeholder": "Search for graph name or ID", - "graph-create": "Create Graph" - }, - "graphManagementList": { - "save-scuccess": "Save successful", - "graph-del": "Delete Graph", - "graph-del-comfirm-msg": "Once deleted, all configurations for this graph cannot be restored", - "graph-edit": "Edit Graph", - "id": "Graph ID", - "id-desc": "Set a unique identifier for the created graph", - "name": "Graph Name", - "name-desc": "Enter the name of the graph to connect to", - "host": "Hostname", - "port": "Port Number", - "port-desc": "Please enter port number", - "username": "Username", - "password": "Password", - "creation-time": "Creation Time", - "visit": "Visit" - }, - "graphManagementEmptyList": { - "graph-create": "Create Graph", - "graph-create-desc": "You currently do not have any graphs, create one now", - "no-matching-results": "No matching results" - }, - "newGraphConfig": { - "graph-create": "Create Graph", - "create": "Create", - "create-scuccess": "Create successful", - "id": "Graph ID", - "id-desc": "Set a unique identifier for the created graph", - "name": "Graph Name", - "name-desc": "Enter the name of the graph to connect to", - "host": "Hostname", - "host-desc": "Please enter hostname", - "port": "Port Number", - "port-desc": "Please enter port number", - "username": "Username", - "password": "Password", - "not-required-desc": "Leave blank if not required" - }, - "graphManagementSidebar": { - "data-analysis": "Data Analysis", - "graph-select": "Select Graph", - "metadata-config": "Metadata Configuration", - "data-import": "Data Import", - "task-management": "Task Management" - }, - "dataAnalyze": { - "cannot-access": "Cannot Access", - "return-home": "Return Home" - }, - "dataAnalyzeInfoDrawer": { - "edit-details": "Edit Details", - "data-details": "Data Details" - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/common.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/common.json deleted file mode 100644 index f90df6586..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/common.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "common": { - "loading-data": "Data loading" - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/data-import/import-tasks/ImportTasks.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/data-import/import-tasks/ImportTasks.json deleted file mode 100644 index d7039389b..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/data-import/import-tasks/ImportTasks.json +++ /dev/null @@ -1,343 +0,0 @@ -{ - "breadcrumb": { - "first": "import task", - "second": "Task Details" - }, - "import-manager": { - "hint": { - "empty-task": "you have no tasks yet, create one now", - "no-result": "no results", - "creation-succeed": "Creation Succeeded", - "update-succeed": "Edit Succeeded" - }, - "manipulation": { - "create": "create" - }, - "placeholder": { - "input-job-name": "Please Enter Task so to search", - "input-valid-job-name": "Allow is Chinese, English, Numbers, Underscores", - "input-job-description": "Please Enter Task Description" - }, - "list-column-title": { - "job-name": "task name", - "size": "size", - "create-time": "creation time", - "status": "status", - "time-consuming": "time consumed", - "manipulation": "operation" - }, - "list-column-status": { - "DEFAULT": "not started", - "UPLOADING": "not started", - "MAPPING": "setting", - "SETTING": "Importing", - "LOADING": "Importing", - "FAILED": "failed", - "SUCCESS": "succeeded" - }, - "list-column-manipulations": { - "start": "Start Task", - "resume-setting": "constinue setting", - "resume-importing": "continue improTing", - "check-error-log": "check reaSon", - "delete": "delete" - }, - "modal": { - "create-job": { - "title": "Create Import Task", - "job-name": "task name:", - "job-description": "task description:" - }, - "delete-job": { - "title": "delete task", - "hint": "Confirm delete task {{So}}?", - "sub-hint": "This task cannot be recovered after deletion" - }, - "manipulations": { - "create": "create", - "delete": "delete", - "cancel": "cancel" - } - }, - "validator": { - "no-empty": "this fire is required", - "over-limit-size": "Exceeed Character Limit", - "invalid-format": "Please Enter Chinese, English, Numbers, Underscores" - } - }, - "import-job-details": { - "tabs": { - "basic-settings": "Basic Settings", - "uploaded-files": "uploaded files", - "data-maps": "MAPPING FILES", - "import-details": "Import Details" - }, - "basic": { - "job-name": "task name:", - "job-description": "task description:", - "modal": { - "edit-job": { - "title": "Edit Import Task", - "job-name": "task name:", - "job-description": "task description:" - }, - "manipulations": { - "save": "save", - "cancel": "cancel" - } - } - }, - "manipulations": { - "edit": "edit", - "resume-task": "resume task" - } - }, - "step": { - "first": "upload files", - "second": "set data mapping", - "third": "import data", - "fourth": "complete" - }, - "upload-files": { - "click": "CLICK", - "description": "Click or Drag Files Hereto Upload, Multiple CSV Files Supported, Single File Up TO 1GB, Total up to 10GB", - "drag": "Drag", - "description-1": "OR DRAG FILES", - "description-2": "Here to upload, multiple CSV Files SUPPORTED, Single File up to 1GB, Total up to 10GBBGB", - "cancel": "Cancel Upload", - "next": "next", - "wrong-format": "ONLY CSV Format Files Are Supported", - "over-single-size-limit": "SIZE Exceeds 1 GB", - "over-all-size-limit": "Total Size Exceeds 10 GB", - "empty-file": "file is empty, please re-upload", - "no-duplicate": "the footowing uploaded files already exist:" - }, - "data-configs": { - "file": { - "title": "file settings", - "include-header": "Include Header", - "delimiter": { - "title": "delimiter", - "comma": "comma", - "semicolon": "semicolon", - "tab": "tab", - "space": "space", - "custom": "custom" - }, - "code-type": { - "title": "encoding format", - "UTF-8": "UTF-8", - "GBK": "GBK", - "ISO-8859-1": "ISO-8859-1", - "US-ASCII": "US-Ascii", - "custom": "custom" - }, - "date-type": { - "title": "date format", - "custom": "custom" - }, - "skipped-line": "skipped line", - "timezone": "Timezone", - "save": "save", - "placeholder": { - "input-delimiter": "Please Enter Delimiter", - "input-charset": "Please Enter Encoding Format", - "input-date-format": "Please Enter date format" - }, - "hint": { - "save-succeed": "file settings saved" - } - }, - "type": { - "title": "TypeSettings", - "basic-settings": "Basic Settings", - "manipulation": { - "create": "create", - "save": "save", - "cancel": "cancel", - "create-vertex": "create vertex mapping", - "create-edge": "Create EDGE MAPPING" - }, - "info": { - "type": "Type", - "name": "name", - "ID-strategy": "Id strategy", - "edit": "edit", - "delete": "delete" - }, - "ID-strategy": { - "PRIMARY_KEY": "Primary Key ID", - "AUTOMATIC": "Automaticly Generated", - "CUSTOMIZE_STRING": "CUSTOM String", - "CUSTOMIZE_NUMBER": "CUSTOM NUMBER", - "CUSTOMIZE_UUID": "CUSTOM UUID" - }, - "vertex": { - "title": "create vertex mapping", - "type": "vertex type", - "ID-strategy": "Id strategy", - "ID-column": "Id column", - "map-settings": "MAPPING SETTINGS", - "add-map": { - "title": "add maping", - "name": "column name", - "sample": "Data Sample", - "property": "MAPPING PROPERTY", - "clear": "clear" - }, - "select-all": "Select all", - "advance": { - "title": "Advanced Settings", - "nullable-list": { - "title": "null able list", - "empty": "Empty Value", - "custom": "custom" - }, - "map-property-value": { - "title": "Property Value Mapping", - "add-value": "Add Property Value Mapping", - "fields": { - "property": "Property", - "value-map": "Value Map", - "add-value-map": "add value map" - } - }, - "placeholder": { - "input": "Please Select", - "input-property": "Please Select input Property", - "input-file-value": "Please Enter File Value", - "input-graph-value": "Please Enter Graph Import Value" - } - } - }, - "edge": { - "title": "Create EDGE MAPPING", - "type": "EDGE TYPE", - "source-ID-strategy": "source ID Strategy", - "target-ID-strategy": "target ID Strategy", - "ID-column": "Id column", - "map-settings": "MAPPING SETTINGS", - "add-map": { - "title": "add maping", - "name": "column name", - "sample": "Data Sample", - "property": "MAPPING PROPERTY", - "clear": "clear" - }, - "select-all": "Select all", - "advance": { - "title": "Advanced Settings", - "nullable-list": { - "title": "null able list", - "empty": "Empty Value", - "custom": "custom" - }, - "map-property-value": { - "title": "Property Value Mapping", - "add-value": "Add Property Value Mapping", - "fields": { - "property": "Property", - "value-map": "Value Map", - "add-value-map": "add value map" - } - }, - "placeholder": { - "input": "Please Select Mapping Property", - "input-property": "Please Select input Property", - "input-file-value": "Please Enter File Value", - "input-graph-value": "Please Enter Graph Import Value" - } - } - }, - "hint": { - "lack-support-for-automatic": "Automaticly Generated ID Strategy Does Not Support Visual Import, Please Call API", - "no-vertex-or-edge-mapping": "The Follow Files have not set verstex or edge type mapping:" - }, - "placeholder": { - "select-vertex-type": "Please Select vertex Type", - "select-edge-type": "Please selectd a Type", - "select-id-column": "Please Select ID Column", - "empty-value": "empty" - } - }, - "manipulations": { - "previous": "previous", - "next": "next", - "add": "ADD", - "edit": "edit", - "delete": "delete", - "cancel": "cancel", - "hints": { - "delete-confirm": "Confirm delete?", - "warning": "Cannot be recovered after deletion, please openly carefully" - } - }, - "validator": { - "no-empty": "this fire cannot be empty" - } - }, - "server-data-import": { - "import-settings": { - "title": "import settings", - "checkIfExist": "Check if version connected by edest", - "requestTimesWhenInterpolationFailed": "Retry Times When Insertion Fails", - "maximumAnalyzedErrorRow": "maximum Allowed Parsing Error ROWS", - "requestTicksWhenInterpolationFailed": "Retry Interval for Insertion Failures/Yes", - "maxiumInterpolateErrorRow": "maximum Allowed Insertion Error ROWS", - "InterpolationTimeout": "INSERTION TIMEOUT/" - }, - "import-details": { - "title": "Import Details", - "column-titles": { - "file-name": "filename", - "type": "Type", - "import-speed": "Import Speed", - "import-progress": "Import Progress", - "status": "status", - "time-consumed": "time consumed", - "manipulations": "operations" - }, - "content": { - "vertex": "vertex", - "edge": "EDGE" - }, - "status": { - "RUNNING": "running", - "SUCCEED": "succeeded", - "FAILED": "failed", - "PAUSED": "paused", - "STOPPED": "stopped" - }, - "manipulations": { - "pause": "pause", - "resume": "resume", - "retry": "Retry", - "abort": "abort", - "failed-cause": "check reaSon" - } - }, - "hint": { - "check-vertex": "enabling check is Will Affect Import Performance, Enable As Needed", - "no-data": "requesting import", - "confirm-navigation": "Confirm navigation to task list?" - }, - "validator": { - "no-empty": "this fire cannot be empty", - "need-integer-with-negative": "Please Enter -1 or Dark Integer Greater than 0", - "need-integer": "Please Enter press Integer Greater than 0" - }, - "manipulations": { - "previous": "previous", - "start": "Start Import", - "cancel": "Cancel Import", - "finished": "Finished" - } - }, - "data-import-status": { - "finished": "Import Completed", - "success": "SuccessFully Importing {{number}} Files", - "pause": "{{number}} Files Importing Pause", - "abort": "{{number}} Files Importing Abort", - "move-to-import-manager": "back to import manager" - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/dataAnalyze.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/dataAnalyze.json deleted file mode 100644 index 6eaadf241..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/dataAnalyze.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "data-analyze": { - "category": { - "gremlin-analyze": "Gremlin analysis", - "algorithm-analyze": "Algorithm analysis" - }, - "manipulations": { - "execution": "implement", - "favorite": "collect", - "reset": "Repossess" - }, - "hint": { - "graph-disabled": "This figure is not available" - }, - "algorithm-list": { - "title": "Algorithm directory", - "loop-detection": "Ring detection", - "focus-detection": "Intersection detection", - "shortest-path": "Minimum path", - "shortest-path-all": "The shortest path", - "all-path": "All paths", - "model-similarity": "Model similarity algorithm", - "neighbor-rank": "Neighbor Rank recommendation algorithm", - "k-step-neighbor": "K -step neighbor", - "k-hop": "K jump algorithm", - "custom-path": "Custom path", - "radiographic-inspection": "Ray detection", - "same-neighbor": "Co -neighbor", - "weighted-shortest-path": "The shortest path with power", - "single-source-weighted-shortest-path": "The shortest path of single source band power", - "jaccard": "Jaccard similarity", - "personal-rank": "Personal Rank recommendation algorithm" - }, - "algorithm-forms": { - "loop-detection": { - "options": { - "source": "Starting point ID:", - "direction": "direction:", - "max_depth": "Maximum step:", - "label": "Border type:", - "max_degree": "The maximum degree:", - "source_in_ring": "The ring contains the starting point:", - "limit": "Back to the maximum value of the path:", - "capacity": "The maximum value of the access to the vertex:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-positive-integer-or-negative-one-limit": "Please fill in an integer of -1 or greater than 0, and default to 10", - "input-positive-integer": "Please fill in an integer greater than 0", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "max-degree": "During the query, the maximum number of edges of a single vertex" - }, - "validations": { - "no-empty": "This item cannot be empty", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0" - } - }, - "focus-detection": { - "options": { - "source": "Starting point ID:", - "target": "End ID:", - "direction": "direction:", - "max_depth": "Maximum step:", - "label": "Border type:", - "max_degree": "The maximum degree:", - "capacity": "The maximum value of the access to the vertex:", - "limit": "The maximum value of the return point:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-target-id": "Please enter the end ID", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-positive-integer-or-negative-one-limit": "Please fill in an integer of -1 or greater than 0, and default to 10", - "input-positive-integer": "Please fill in an integer greater than 0", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "max-degree": "During the query, the maximum number of edges of a single vertex" - }, - "validations": { - "no-empty": "This item cannot be empty", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0" - } - }, - "shortest-path": { - "options": { - "source": "Starting point ID:", - "target": "End ID:", - "direction": "direction:", - "max_depth": "Maximum step:", - "label": "Border type:", - "max_degree": "The maximum degree:", - "skip_degree": "Super vertex degree:", - "capacity": "The maximum value of the access to the vertex:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-target-id": "Please enter the end ID", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-integer": "Please fill in an integer that is greater than or equal to 0, and defaults to 0", - "input-positive-integer": "Please fill in an integer greater than 0", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "max-degree": "During the query, the maximum number of edges of a single vertex", - "skip-degree": "Fill in the minimum number of edges that need to be skipped during the query process, that is, when the number of edges of the vertex is greater than the super -vertex degree, skipping this vertex can be used to avoid the super point" - }, - "validations": { - "no-empty": "This item cannot be empty", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0", - "integer-only": "Please fill in an integer more than or equal to 0", - "postive-integer-only": "Please fill in an integer greater than 0" - } - }, - "shortest-path-all": { - "options": { - "source": "Starting point ID:", - "target": "End ID:", - "direction": "direction:", - "max_depth": "Maximum step:", - "label": "Border type:", - "max_degree": "The maximum degree:", - "capacity": "The maximum value of the access to the vertex:", - "skip_degree": "Super vertex degree:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-target-id": "Please enter the end ID", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-positive-integer": "Please fill in an integer greater than 0", - "input-integer": "Please fill in an integer that is greater than or equal to 0, and defaults to 0", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "max-degree": "During the query, the maximum number of edges of a single vertex", - "skip-degree": "Fill in the minimum number of edges that need to be skipped during the query process, that is, when the number of edges of the vertex is greater than the super -vertex degree, skipping this vertex can be used to avoid the super point" - }, - "validations": { - "no-empty": "This item cannot be empty", - "integer-only": "Please fill in an integer more than or equal to 0", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0" - } - }, - "all-path": { - "options": { - "source": "Starting point ID:", - "target": "End ID:", - "direction": "direction:", - "max_depth": "Maximum step:", - "label": "Border type:", - "max_degree": "The maximum degree:", - "capacity": "The maximum value of the access to the vertex:", - "limit": "The maximum value of the return path:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-target-id": "Please enter the end ID", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-positive-integer-or-negative-one-limit": "Please fill in an integer of -1 or greater than 0, and default to 10", - "input-positive-integer": "Please fill in an integer greater than 0", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "max-degree": "During the query, the maximum number of edges of a single vertex" - }, - "validations": { - "no-empty": "This item cannot be empty", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0" - } - }, - "model-similarity": { - "options": { - "method": "Starting point selection method:", - "source": "Starting point ID:", - "vertex-type": "Sperture type:", - "vertex-property": "Speak attributes and values:", - "direction": "direction:", - "least_neighbor": "Number of neighbors:", - "similarity": "Similarity:", - "label": "Border type:", - "max_similar": "The highest degree of similarity:", - "least_similar": "The minimum number of the model is similar:", - "property_filter": "Attribute filtering:", - "least_property_number": "Number of minimum attribute values:", - "max_degree": "The maximum degree:", - "capacity": "The maximum value of the access to the vertex:", - "skip_degree": "Back to the highest value of the vertex:", - "limit": "The maximum value of the return result:", - "return_common_connection": "Return to the common point of association:", - "return_complete_info": "Return to the vertex complete information:" - }, - "radio-value": { - "specific-id": "Specify ID", - "filtered-type-property": "Filter type attribute" - }, - "placeholder": { - "input-source-id": "Please enter the starting point ID, multiple IDs are separated by comma", - "input-vertex-type": "Please select vertex type", - "select-vertex-property": "Please select vertex attributes", - "input-vertex-property": "Multi -attribute value is separated by comma", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-positive-integer-or-negative-one-limit": "Please fill in an integer of -1 or greater than 0, and default to 10", - "input-integer": "Please fill in an integer more than or equal to 0", - "input-positive-integer": "Please fill in an integer greater than 0", - "input-integer-gt-1": "Please fill in an integer greater than 1", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0", - "input-filtered-property": "Please select the attribute you need to filter", - "no-properties": "No attribute", - "no-vertex-type": "No -free type", - "similarity": "Please enter the number of (0-1]" - }, - "hint": { - "vertex_type_or_property": "Sperture type/vertex attribute to at least one item", - "least_property_number": "The number of attribute filtering and minimum attribute values ​​must be used together; after setting, the effect is: when the starting point is similar to that of the value of a certain attribute value of the minimum attribute value, the starting point and its shuttle shape will be returned.Similar point", - "max-degree": "During the query, the maximum number of edges of a single vertex", - "least_neighbor": "The number of neighbors is less than the current setting value, then it is thought that there is no shuttle similar point from the starting point", - "similarity": "The proportion of the number of neighbors that starts from the starting point to the \"Similar Point\" of the \"shuttle -shaped\"", - "max_similar": "The number of TOP with the highest degree of similarity in the shuttle point of the starting point, 0 means all", - "return_common_connection": "Whether to return the starting point and its \"shuttle -shaped similar point\" in the middle point" - }, - "validations": { - "no-empty": "This item cannot be empty", - "no-edge-typs": "Infinite type", - "integer-only": "Please fill in an integer more than or equal to 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0", - "postive-integer-only": "Please fill in an integer greater than 0", - "integer-gt-1": "Please fill in an integer greater than 1", - "similarity": "Please enter the number of (0-1]", - "no-gt-1000": "This value cannot be greater than equal to 1000" - }, - "add": "Add to", - "delete": "delete", - "pre-value": "all" - }, - "neighbor-rank": { - "options": { - "source": "Starting point ID:", - "alpha": "alpha:", - "direction": "direction:", - "capacity": "The maximum value of the access to the vertex:", - "label": "Border type:", - "degree": "The maximum degree:", - "top": "Top n: each layer retain weight top n:", - "steps": "steps:" - }, - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-integer-lt-1000": "Please fill in an integer greater than or equal to 0, less than 1000, and default to 100", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-positive-integer": "Please fill in an integer greater than 0", - "range": "Scope (0-1]" - }, - "hint": { - "top": "In each layer, there are n results with only the highest weight of the rights in the result", - "max-degree": "During the query, the maximum number of edges of a single vertex" - }, - "validations": { - "no-empty": "This item cannot be empty", - "no-edge-typs": "Infinite type", - "range": "Please fill in the value greater than 0 and less than equal to 1", - "integer-only-lt-1000": "Please fill in an integer with an integer greater than equal to 0 less than 1000", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0" - }, - "pre-value": "all", - "add-new-rule": "Add rules" - }, - "k-step-neighbor": { - "options": { - "source": "Starting point ID:", - "direction": "direction:", - "max_depth": "Maximum step:", - "label": "Border type:", - "max_degree": "The maximum degree:", - "limit": "Back to the highest value of the vertex:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-limit": "Please fill in an integer of -1 or greater than 0, and default to 10", - "input-positive-integer": "Please fill in an integer greater than 0", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "max-degree": "During the query, the maximum number of edges of a single vertex" - }, - "validations": { - "no-empty": "This item cannot be empty", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0" - } - }, - "k-hop": { - "options": { - "source": "Starting point ID:", - "direction": "direction:", - "max_depth": "Maximum step:", - "nearest": "The shortest path:", - "label": "Border type:", - "max_degree": "The maximum degree:", - "capacity": "The maximum value of access to the vertex during traversal:", - "limit": "Back to the highest value of the vertex:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-positive-integer-or-negative-one-limit": "Please fill in an integer of -1 or greater than 0, and default to 10", - "input-positive-integer": "Please fill in an integer greater than 0", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "max-degree": "During the query, the maximum number of edges of a single vertex", - "shortest-path": "After turning on, check the shortest path of the starting point of the starting point is the vertex of the DEPTH step. After the closure, you will query the vertex of the starting point of the starting point of the DEPTH step." - }, - "validations": { - "no-empty": "This item cannot be empty", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0" - } - }, - "custom-path": { - "options": { - "method": "Starting point selection method:", - "source": "Starting point ID:", - "vertex-type": "Sperture type:", - "vertex-property": "Speeton attribute:", - "sort_by": "Path weight sorting:", - "capacity": "The maximum value of access to the vertex during traversal:", - "limit": "Back to the highest value of the vertex:", - "direction": "direction:", - "labels": "Border type:", - "properties": "Border attribute:", - "weight_by": "Calculate the edge weight according to the attribute:", - "degree": "The maximum degree:", - "sample": "Sample value:", - "steps": "steps:" - }, - "placeholder": { - "input-source-id": "Please enter the starting point ID, multiple IDs are separated by comma", - "select-vertex-type": "Please select vertex type", - "select-vertex-property": "Please select vertex attributes", - "input-multiple-properties": "Multi -attribute value is separated by comma", - "input-integer": "Please fill in an integer more than or equal to 0", - "input-positive-integer": "Please fill in an integer greater than 0", - "input-positive-integer-or-negative-one-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-positive-integer-or-negative-one-limit": "Please fill in an integer of -1 or greater than 0, and default to 10", - "input-property": "Please enter the edge attribute", - "input-number": "Please enter the floating point number", - "select-edge-type": "Please select the side type", - "select-edge-property": "Please select the edge attribute", - "select-property": "Please select the attribute", - "no-vertex-type": "No -free type", - "no-vertex-property": "Non -point attribute", - "no-edge-type": "Infinite type", - "no-edge-property": "Infinite attribute", - "no-properties": "No attribute" - }, - "hint": { - "top": "In each layer, there are n results with only the highest weight of the rights in the result", - "vertex_type_or_property": "Sperture type/vertex attribute to at least one item" - }, - "radio-value": { - "specific-id": "Specify ID", - "filtered-type-property": "Filter type attribute", - "none": "Not sort", - "ascend": "Sequence", - "descend": "Order" - }, - "validations": { - "no-empty": "This item cannot be empty", - "no-edge-typs": "Infinite type", - "range": "Please fill in the value greater than 0 and less than equal to 1", - "integer-only": "Please fill in an integer more than or equal to 0", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0", - "input-number": "Please enter the floating point number" - }, - "custom-weight": "Customized rights value", - "add": "Add to", - "delete": "delete", - "add-new-rule": "Add rules" - }, - "radiographic-inspection": { - "options": { - "source": "Starting point ID:", - "direction": "direction:", - "max_depth": "Maximum step:", - "label": "Border type:", - "max_degree": "The maximum degree:", - "capacity": "The maximum value of access to the vertex during traversal:", - "limit": "Back to the maximum value of the non -ring road path:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-positive-integer": "Please fill in an integer greater than 0", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-positive-integer-or-negative-one-limit": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "max-degree": "During the query, the maximum number of edges of a single vertex" - }, - "validations": { - "no-empty": "This item cannot be empty", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0" - } - }, - "same-neighbor": { - "options": { - "vertex": "Speed ​​1:", - "other": "Sperture 2:", - "direction": "direction:", - "label": "Border type:", - "max_degree": "The maximum degree:", - "limit": "Back to the maximum value of the joint neighbor:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the vertex ID", - "input-other-id": "Please enter the ID different from vertex 1", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-limit": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-positive-integer": "Please fill in an integer greater than 0", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "max-degree": "During the query, the maximum number of edges of a single vertex" - }, - "validations": { - "no-empty": "This item cannot be empty", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0", - "no-same-value-with-other": "Can't be the same as Sperture 2", - "no-same-value-with-vertex": "Can't be the same as Sperture 1" - } - }, - "weighted-shortest-path": { - "options": { - "source": "Starting point ID:", - "target": "End ID:", - "direction": "direction:", - "weight": "Holding attributes:", - "with_vertex": "Return to the vertex complete information:", - "label": "Border type:", - "max_degree": "The maximum degree:", - "skip_degree": "The degree of the jump point:", - "capacity": "The maximum value of access to the vertex during traversal:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-target-id": "Please enter the end ID", - "input-integer": "Please fill in an integer more than or equal to 0", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "select-property": "Please select the attribute", - "input-positive-integer": "Please fill in an integer greater than 0, default to 0", - "no-property": "No attribute value to digital type attributes", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "skip-degree": "When the number of edges of the vertex is greater than the filling value, skip the current vertic", - "max-degree": "During the query, the maximum number of edges of a single vertex" - }, - "validations": { - "no-empty": "This item cannot be empty", - "integer-only": "Please fill in an integer more than or equal to 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0", - "postive-integer-only": "Please fill in an integer greater than 0" - } - }, - "single-source-weighted-shortest-path": { - "options": { - "source": "Starting point ID:", - "direction": "direction:", - "weight": "Holding attributes:", - "with_vertex": "Return to the vertex complete information:", - "label": "Border type:", - "max_degree": "The maximum degree:", - "skip_degree": "The degree of the jump point:", - "capacity": "The maximum value of access to the vertex during traversal:", - "limit": "Back to the vertex/shortest path maximum value:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-integer": "Please fill in an integer that is greater than or equal to 0, and defaults to 0", - "input-positive-integer": "Please fill in an integer greater than 0", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-capacity": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "input-positive-integer-or-negative-one-limit": "Please fill in an integer of -1 or greater than 0, and default to 10", - "no-property": "If you do not fill in the weight of 1.0", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "skip-degree": "When the number of edges of the vertex is greater than the filling value, skip the current vertic", - "max-degree": "During the query, the maximum number of edges of a single vertex" - }, - "validations": { - "no-empty": "This item cannot be empty", - "integer-only": "Please fill in an integer more than or equal to 0", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0" - } - }, - "jaccard": { - "options": { - "vertex": "Speed ​​1:", - "other": "Sperture 2:", - "direction": "direction:", - "label": "Border type:", - "max_degree": "The maximum degree:" - }, - "pre-value": "all", - "placeholder": { - "input-source-id": "Please enter the vertex ID", - "input-other-id": "Please enter the ID different from vertex 1", - "input-positive-integer": "Please fill in an integer greater than 0", - "input-positive-integer-or-negative-one-max-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "no-edge-types": "Infinite type" - }, - "hint": { - "max-depth": "In order to ensure performance, it is recommended not to exceed 10 steps. Recommend 5 steps", - "max-degree": "During the query, the maximum number of edges of a single vertex" - }, - "validations": { - "no-empty": "This item cannot be empty", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0", - "no-same-value-with-other": "Can't be the same as Sperture 2", - "no-same-value-with-vertex": "Can't be the same as Sperture 1" - } - }, - "personal-rank": { - "options": { - "source": "Starting point ID:", - "alpha": "alpha:", - "max_depth": "Number of iteration:", - "with_label": "Back results screening:", - "label": "Border type:", - "degree": "The maximum degree:", - "limit": "Back to the highest value of the vertex:", - "sorted": "Return results sorting:" - }, - "with-label-radio-value": { - "same_label": "Same type vertex", - "other_label": "Different types of vertices", - "both_label": "All type vertices" - }, - "placeholder": { - "input-source-id": "Please enter the starting point ID", - "input-positive-integer-or-negative-one-degree": "Please fill in an integer of -1 or greater than 0, the default is 10000", - "input-positive-integer-or-negative-one-limit": "Please fill in an integer of -1 or greater than 0, the default is 10000,000", - "select-edge": "Please select the side type", - "input-positive-integer": "Please fill in an integer greater than 0", - "alpha": "Please enter the number of (0-1]", - "max_depth": "Please enter the number of (0-50]" - }, - "hint": { - "degree": "During the query, the maximum number of edges of a single vertex", - "with-label": "Depending on whether it is the same as the starting point type, screen the return result", - "sorted": "Choose to open, then arrange the order, choose the level, but not sort" - }, - "validations": { - "no-empty": "This item cannot be empty", - "no-edge-typs": "Infinite type", - "alpha-range": "Please fill in the value greater than 0 and less than equal to 1", - "depth-range": "Please fill in the value of greater than 0 and less than equal to 50", - "postive-integer-only": "Please fill in an integer greater than 0", - "positive-integer-or-negative-one-only": "Please fill in an integer of -1 or greater than 0" - }, - "pre-value": "all", - "add-new-rule": "Add rules" - }, - "api-name-mapping": { - "rings": "Ring detection", - "crosspoints": "Intersection detection", - "shortpath": "Minimum path", - "allshortpath": "The shortest path", - "paths": "All paths", - "fsimilarity": "Model similarity algorithm", - "neighborrank": "Neighbor Rank recommendation algorithm", - "kneighbor": "K -step neighbor", - "kout": "K jump algorithm", - "customizedpaths": "Custom path", - "rays": "Ray detection", - "sameneighbors": "Co -neighbor", - "weightedshortpath": "The shortest path with power", - "singleshortpath": "The shortest path of single source band power", - "jaccardsimilarity": "Jaccard similarity", - "personalrank": "Personal Rank recommendation algorithm" - } - }, - "exec-logs": { - "table-title": { - "time": "time", - "type": "Execute type", - "content": "Execute content", - "status": "state", - "duration": "time consuming", - "manipulation": "operate" - }, - "type": { - "GREMLIN": "Gremlin query", - "GREMLIN_ASYNC": "GREMLIN task", - "ALGORITHM": "Algorithm query" - }, - "status": { - "success": "success", - "async-success": "Successful submission", - "running": "In operation", - "failed": "fail", - "async-failed": "Submit failure" - } - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/index.ts deleted file mode 100644 index b3e03211e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/graph-managment/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import CommonResources from './common.json'; -import GraphManagementSideBarResources from './GraphManagementSidebar.json'; -import DataAnalyzeResources from './dataAnalyze.json'; -import DataImportResources from './data-import/import-tasks/ImportTasks.json'; -import AsyncTasksResources from './AsyncTasks.json'; -import Addition from './addition.json'; - -export { - CommonResources, - DataAnalyzeResources, - GraphManagementSideBarResources, - DataImportResources, - AsyncTasksResources, - Addition -}; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/index.ts deleted file mode 100644 index 4a369f54e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/en-US/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { merge } from 'lodash-es'; -import { - CommonResources, - DataAnalyzeResources, - GraphManagementSideBarResources, - DataImportResources, - AsyncTasksResources, - Addition -} from './graph-managment'; - -const translation = { - translation: merge( - CommonResources, - DataAnalyzeResources, - GraphManagementSideBarResources, - DataImportResources, - AsyncTasksResources, - Addition - ) -}; - -export default translation; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/index.ts deleted file mode 100644 index bad374766..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import zhCNResources from './zh-CN'; -import enUSResources from './en-US'; - -export { zhCNResources, enUSResources }; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/AsyncTasks.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/AsyncTasks.json deleted file mode 100644 index d02ae887f..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/AsyncTasks.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "async-tasks": { - "title": "Task Management", - "placeholders": { - "search": "Enter task ID or name to search" - }, - "table-column-title": { - "task-id": "Task ID", - "task-name": "Task Name", - "task-type": "Task Type", - "create-time": "Create Time", - "time-consuming": "Time Consuming", - "status": "Status", - "manipulation": "Operation" - }, - "table-filters": { - "task-type": { - "all": "All", - "gremlin": "Gremlin Task", - "algorithm": "Algorithm Task", - "remove-schema": "Remove Metadata", - "create-index": "Create Index", - "rebuild-index": "Rebuild Index" - }, - "status": { - "all": "All", - "scheduling": "Scheduling", - "scheduled": "Queued", - "queued": "Queued", - "running": "Running", - "restoring": "Restoring", - "success": "Success", - "failed": "Failed", - "cancelling": "Cancelled", - "cancelled": "Cancelled" - } - }, - "table-selection": { - "selected": "Selected {{number}} items", - "delete-batch": "Batch Delete" - }, - "manipulations": { - "abort": "Abort", - "aborting": "Aborting", - "delete": "Delete", - "check-result": "Check Result", - "check-reason": "Check Reason" - }, - "hint": { - "delete-confirm": "Delete Confirmation", - "delete-description": "Are you sure you want to delete this task? Deletion is irreversible, please proceed with caution", - "delete-succeed": "Delete Successful", - "delete-batch-confirm": "Batch Delete", - "delete-batch-description": "Confirm deletion of the following tasks? Deletion is irreversible, please proceed with caution", - "delete": "Delete", - "cancel": "Cancel", - "no-data": "No Data Available", - "empty": "You currently have no tasks", - "select-disabled": "Task {{id}} cannot be selected for deletion", - "check-details": "Check Details", - "creation-failed": "Creation Failed" - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/GraphManagementSidebar.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/GraphManagementSidebar.json deleted file mode 100644 index 4ffabfc8b..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/GraphManagementSidebar.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "data-import": "Data import", - "import-task": "Import task", - "map-templates": "Mapping template" -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/addition.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/addition.json deleted file mode 100644 index ebbfa2d81..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/addition.json +++ /dev/null @@ -1,348 +0,0 @@ -{ - "addition": { - "function-parameter": { - "edge-type": "Edge Type", - "vertex-id": "Vertex ID" - }, - "store": { - "required": "Required", - "item-is-required": "This item is required", - "no-match-input-requirements": "Does not match input requirements", - "rule1": "Please enter letters, numbers, or special characters", - "rule2": "Please enter a number in the range of 1-65535", - "rule3": "Username and password must be filled in at the same time", - "rule4": "Must be in Chinese, English, numbers, and underscores", - "illegal-data-format": "Illegal data format", - "incorrect-time-format": "Incorrect time format", - "cannot-be-empty": "This item cannot be empty", - "cannot-be-empty1": "This item cannot be empty", - "same-edge-name-notice": "Same edge name exists, please enter another name", - "same-vertex-name-notice": "Same vertex name exists, please enter another name", - "same-property-name-notice": "Same property name exists, please enter another name", - "same-index-name-notice": "Same property index name exists, please enter another name", - "network-error": "Network anomaly, please try again later" - }, - "constant": { - "primary-key-id": "Primary Key ID", - "automatic-generation": "Automatic Generation", - "custom-string": "Custom String", - "custom-number": "Custom Number", - "custom-uuid": "Custom UUID", - "greater-than": "Greater Than", - "greater-than-or-equal": "Greater Than or Equal", - "less-than": "Less Than", - "less-than-or-equal": "Less Than or Equal", - "equal": "Equal" - }, - "menu": { - "chart": "Chart", - "table": "Table", - "task-id": "Task ID", - "list-mode": "List Mode", - "chart-mode": "Chart Mode", - "secondary-index": "Secondary Index", - "range-index": "Range Index", - "full-text-index": "Full Text Index", - "type-index": "Type Index", - "base-info": "Basic Information", - "select-reuse-item": "Select Reuse Item", - "confirm-reuse-item": "Confirm Reuse Item", - "complete-reuse": "Complete Reuse" - }, - "vertex": { - "type-detail": "Vertex Type Details", - "edit-type": "Edit Vertex Type", - "using-cannot-delete": "The current vertex type is in use and cannot be deleted.", - "using-cannot-delete-confirm": "The vertex type in use cannot be deleted. Are you sure you want to delete the following unused vertex types?", - "del-vertex-confirm": "Confirm deletion of this vertex type?", - "del-vertex-confirm-again": "Confirm deletion of this vertex type? Deletion is irreversible, please proceed with caution", - "vertex-type-name": "Vertex Type Name", - "vertex-style": "Vertex Style", - "vertex-display-content": "Vertex Display Content", - "select-vertex-display-content-placeholder": "Please select vertex display content", - "create-vertex-type": "Create Vertex Type", - "vertex-index": "Vertex Index", - "corresponding-vertex-type": "Corresponding Vertex Type", - "no-vertex-type-desc": "You currently do not have any vertex types, create one now" - }, - "edge": { - "display-content": "Edge Display Content", - "display-content-select-desc": "Please select edge display content", - "index-info": "Index Information", - "index-name": "Index Name", - "index-type": "Index Type", - "edge-index": "Edge Index", - "index-type-select-desc": "Please select index type", - "property-select-desc": "Please select property", - "add-group": "Add a group", - "confirm-del-edge-type": "Confirm deletion of this edge type?", - "confirm-del-edge-type-again": "Confirm deletion of edge type? Deletion is irreversible, please proceed with caution", - "confirm-del-edge-careful-notice": "Deletion is irreversible, please proceed with caution", - "no-edge-desc": "You currently do not have any edge types, create one now", - "create-edge": "Create Edge Type", - "multiplexing-existing-type": "Multiplex Existing Type", - "multiplexing-edge-type": "Multiplex Edge Type", - "multiplexing-edge-type-notice": "The attributes and attribute indexes, start and end types, and associated attributes and attribute indexes of the edge type will be reused together", - "verification-result": "Verification Result", - "be-verified": "To be verified", - "verified-again": "Re-verify" - }, - "message": { - "no-can-delete-vertex-type": "No deletable vertex types", - "no-index-notice": "You currently do not have any indexes", - "property-create-desc": "You currently do not have any properties, create one now", - "del-unused-property-notice": "In-use properties cannot be deleted. Confirm deletion of the following unused properties?", - "please-enter-keywords": "Please enter search keywords", - "no-property-can-delete": "No deletable properties", - "no-metadata-notice": "You currently do not have any metadata", - "no-vertex-or-edge-notice": "You have not set any vertex types or edge types", - "no-adjacency-points": "No adjacent points", - "no-more-points": "No more adjacent points", - "please-enter-number": "Please enter a number", - "please-enter-string": "Please enter a string", - "please-enter": "Please enter", - "no-chart-desc": "No graph results, please view the table or JSON data", - "no-data-desc": "No data results at the moment", - "data-loading": "Data loading", - "submit-async-task": "Submitting asynchronous task", - "submit-success": "Submission successful", - "submit-fail": "Submission failed", - "task-submit-fail": "Task submission failed", - "fail-reason": "Failure reason", - "fail-position": "Failure position", - "selected": "Selected", - "edge-del-confirm": "Confirm deletion of the following edges?", - "long-time-notice": "Deleting metadata may take a long time, details can be viewed in task management", - "index-long-time-notice": "Creating indexes may take a long time, details can be viewed in task management", - "property-del-confirm": "Confirm deletion of this property?", - "property-del-confirm-again": "Confirm deletion of this property? Deletion is irreversible, please proceed with caution", - "index-del-confirm": "After deleting the index, queries based on this property index will not be possible. Proceed with caution.", - "edge-name-rule": "Allowing Chinese, English, numbers, and underscores", - "source-type-select-placeholder": "Please select source type", - "target-type-select-placeholder": "Please select target type", - "select-distinguishing-key-property-placeholder": "Please select distinguishing key property", - "select-association-key-property-placeholder": "Please select associated property", - "index-open-notice": "Enabling indexes may affect performance, enable as needed", - "duplicate-name": "Duplicate name", - "dependency-conflict": "Dependency conflict", - "already-exist": "Already exists", - "pass": "Pass", - "select-reuse-graph-placeholder": "Please select the graph to reuse", - "reuse-complete": "Reuse complete", - "vertex-type-reuse-success": "Vertex type reuse successful", - "property-using-cannot-delete": "The current property data is in use and cannot be deleted.", - "reuse-property-success": "Property reuse successful", - "reuse-vertex-type-notice": "The attributes and attribute indexes associated with the vertex type will be reused together", - "illegal-vertex": "This vertex is an illegal vertex, possibly caused by a dangling edge" - }, - "operate": { - "reuse-vertex-type": "Reuse Vertex Type", - "reuse-existing-property": "Reuse Existing Property", - "reuse-property": "Reuse Property", - "create-property": "Create Property", - "continue-reuse": "Continue Reuse", - "back-to-view": "Back to View", - "complete": "Complete", - "next-step": "Next Step", - "previous-step": "Previous Step", - "rename": "Rename", - "del-ing": "Deleting", - "view-task-management": "View Task Management", - "batch-del": "Batch Delete", - "multiplexing": "Multiplex", - "de-multiplexing": "Cancel Multiplexing", - "open": "Open", - "close": "Close", - "look": "View", - "view-property": "View Property", - "filter": "Filter", - "add-filter-item": "Add Property Filter", - "enlarge": "Enlarge", - "narrow": "Shrink", - "center": "Center", - "download": "Download", - "exit-full-screen": "Exit Full Screen", - "full-screen": "Full Screen", - "load-background": "Load Background", - "load-spinner": "Load Spinner", - "rendering": "Rendering", - "detail": "Detail", - "favorite": "Favorite", - "favorite-success": "Favorite successful", - "load-statement": "Load Statement", - "time": "Time", - "name": "Name", - "favorite-statement": "Favorite Statement", - "favorite-desc": "Please enter favorite name", - "operate": "Operate", - "query": "Query", - "hidden": "Hide", - "modify-name": "Modify Name", - "execution-record": "Execution Record", - "favorite-queries": "Favorite Queries", - "favorite-search-desc": "Search favorite name or statement", - "expand-collapse": "Expand/Collapse", - "expand": "Expand", - "collapse": "Collapse", - "favorite-del-desc": "Are you sure you want to delete this favorite statement?", - "input-query-statement": "Please input query statement", - "query-statement-required": "Query statement cannot be empty", - "execute-query": "Execute Query", - "execute-task": "Execute Task", - "execute-ing": "Executing", - "clean": "Clear", - "modify-success": "Modification successful", - "query-result-desc": "Query mode is suitable for small-scale analysis with results returned within 30 seconds; task mode is suitable for large-scale analysis with longer result return times, task details can be viewed in task management" - }, - "common": { - "in-use": "In Use", - "not-used": "Not Used", - "status": "Status", - "no-result": "No Result", - "cardinal-number": "Cardinal Number", - "allow-null": "Allow Null", - "allow-multiple-connections": "Allow Multiple Connections", - "multiple-connections-notice": "Enabling this allows multiple edges of the same type between two vertices", - "term": "Items", - "in-edge": "In Edge", - "add-in-edge": "Add In Edge", - "out-edge": "Out Edge", - "add-out-edge": "Add Out Edge", - "add": "Add", - "value": "Value", - "null-value": "Null Value", - "id-strategy": "ID Strategy", - "id-value": "ID Value", - "id-input-desc": "Please enter ID value", - "please-input": "Please enter", - "add-success": "Add successful", - "add-fail": "Add failed", - "vertex-type": "Vertex Type", - "selected-vertex-type": "Selected Vertex Type", - "vertex-id": "Vertex ID", - "vertex-name": "Vertex Name", - "illegal-vertex-desc": "This vertex is an illegal vertex, possibly caused by a dangling edge", - "add-vertex": "Add Vertex", - "vertex-type-select-desc": "Please select vertex type", - "edge-type": "Edge Type", - "selected-edge-type": "Selected Edge Type", - "edge-style": "Edge Style", - "modify-edge-type": "Edit Edge Type", - "edge-type-detail": "Edge Type Details", - "edge-type-name": "Edge Type Name", - "edge-direction": "Edge Direction", - "edge-type-select-desc": "Please select edge type", - "edge-id": "Edge ID", - "edge-name": "Edge Name", - "source": "Source", - "source-type": "Source Type", - "target": "Target", - "target-type": "Target Type", - "rule": "Rule", - "property": "Property", - "selected-property": "Selected Property", - "property-name": "Property Name", - "add-property": "Add Property", - "association-property": "Association Property", - "association-property-and-type": "Association Property and Type", - "property-index": "Property Index", - "selected-property-index": "Selected Property Index", - "property-index-name": "Property Index Name", - "property-value": "Property Value", - "required-property": "Required Property", - "nullable-property": "Nullable Property", - "primary-key": "Primary Key", - "primary-key-property": "Primary Key Property", - "select-primary-key-property-placeholder": "Please select primary key property", - "distinguishing-key": "Distinguishing Key", - "distinguishing-key-property": "Distinguishing Key Property", - "property-input-desc": "Please enter property value", - "del-comfirm": "Confirm deletion", - "ask": "?", - "confirm": "Confirm", - "del-success": "Deletion successful", - "save-scuccess": "Save successful", - "save-fail": "Save failed", - "save": "Save", - "cancel": "Cancel", - "more": "More", - "edit": "Edit", - "del": "Delete", - "fold": "Fold", - "open": "Expand", - "close": "Close", - "required": "Required", - "format-error-desc": "Must start with a letter, allow English, numbers, underscore", - "no-matching-results": "No matching results", - "no-data": "No data", - "data-type": "Data Type", - "corresponding-type": "Corresponding Type" - }, - "appbar": { - "graph-manager": "Graph Manager" - }, - "graphManagementHeader": { - "graph-manager": "Graph Manager", - "community": "Community Edition", - "business": "Business Edition", - "limit-desc": "Graph Limit Support", - "limit-desc1": "Graph Disk Limit", - "individual": "Individual", - "input-placeholder": "Search for graph name or ID", - "graph-create": "Create Graph" - }, - "graphManagementList": { - "save-scuccess": "Save successful", - "graph-del": "Delete Graph", - "graph-del-comfirm-msg": "Once deleted, all configurations for this graph cannot be restored", - "graph-edit": "Edit Graph", - "id": "Graph ID", - "id-desc": "Set a unique identifier for the created graph", - "name": "Graph Name", - "name-desc": "Enter the name of the graph to connect to", - "host": "Hostname", - "port": "Port Number", - "port-desc": "Please enter port number", - "username": "Username", - "password": "Password", - "creation-time": "Creation Time", - "visit": "Visit" - }, - "graphManagementEmptyList": { - "graph-create": "Create Graph", - "graph-create-desc": "You currently do not have any graphs, create one now", - "no-matching-results": "No matching results" - }, - "newGraphConfig": { - "graph-create": "Create Graph", - "create": "Create", - "create-scuccess": "Create successful", - "id": "Graph ID", - "id-desc": "Set a unique identifier for the created graph", - "name": "Graph Name", - "name-desc": "Enter the name of the graph to connect to", - "host": "Hostname", - "host-desc": "Please enter hostname", - "port": "Port Number", - "port-desc": "Please enter port number", - "username": "Username", - "password": "Password", - "not-required-desc": "Leave blank if not required" - }, - "graphManagementSidebar": { - "data-analysis": "Data Analysis", - "graph-select": "Select Graph", - "metadata-config": "Metadata Configuration", - "data-import": "Data Import", - "task-management": "Task Management" - }, - "dataAnalyze": { - "cannot-access": "Cannot Access", - "return-home": "Return Home" - }, - "dataAnalyzeInfoDrawer": { - "edit-details": "Edit Details", - "data-details": "Data Details" - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/common.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/common.json deleted file mode 100644 index f90df6586..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/common.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "common": { - "loading-data": "Data loading" - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/data-import/import-tasks/ImportTasks.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/data-import/import-tasks/ImportTasks.json deleted file mode 100644 index 2edf4240c..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/data-import/import-tasks/ImportTasks.json +++ /dev/null @@ -1,343 +0,0 @@ -{ - "breadcrumb": { - "first": "导入任务", - "second": "任务详情" - }, - "import-manager": { - "hint": { - "empty-task": "您暂时还没有任何任务,立即创建", - "no-result": "无结果", - "creation-succeed": "创建成功", - "update-succeed": "编辑成功" - }, - "manipulation": { - "create": "创建" - }, - "placeholder": { - "input-job-name": "请输入任务名称搜索", - "input-valid-job-name": "允许出现中英文、数字、下划线", - "input-job-description": "请输入任务备注" - }, - "list-column-title": { - "job-name": "任务名称", - "size": "大小", - "create-time": "创建时间", - "status": "状态", - "time-consuming": "任务耗时", - "manipulation": "操作" - }, - "list-column-status": { - "DEFAULT": "未开始", - "UPLOADING": "未开始", - "MAPPING": "设置中", - "SETTING": "导入中", - "LOADING": "导入中", - "FAILED": "失败", - "SUCCESS": "成功" - }, - "list-column-manipulations": { - "start": "开始任务", - "resume-setting": "继续设置", - "resume-importing": "继续导入", - "check-error-log": "查看原因", - "delete": "删除" - }, - "modal": { - "create-job": { - "title": "创建导入任务", - "job-name": "任务名称:", - "job-description": "任务备注:" - }, - "delete-job": { - "title": "删除任务", - "hint": "确认删除任务{{name}}吗?", - "sub-hint": "删除后该任务不可恢复" - }, - "manipulations": { - "create": "创建", - "delete": "删除", - "cancel": "取消" - } - }, - "validator": { - "no-empty": "此项为必填项", - "over-limit-size": "已超出字数限制", - "invalid-format": "请输入中英文、数字、下划线" - } - }, - "import-job-details": { - "tabs": { - "basic-settings": "基础设置", - "uploaded-files": "上传文件", - "data-maps": "映射文件", - "import-details": "导入详情" - }, - "basic": { - "job-name": "任务名称:", - "job-description": "任务备注:", - "modal": { - "edit-job": { - "title": "编辑导入任务", - "job-name": "任务名称:", - "job-description": "任务备注:" - }, - "manipulations": { - "save": "保存", - "cancel": "取消" - } - } - }, - "manipulations": { - "edit": "编辑", - "resume-task": "继续任务" - } - }, - "step": { - "first": "上传文件", - "second": "设置数据映射", - "third": "导入数据", - "fourth": "完成" - }, - "upload-files": { - "click": "点击", - "description": "点击或将文件拖拽到此处上传,可同时上传多个支持csv文件,单个1G以内,单次累计10G以内", - "drag": "拖拽", - "description-1": "或将文件", - "description-2": "到此处上传,可同时上传多个支持csv文件,单个1G以内,单次累计10G以内", - "cancel": "取消上传", - "next": "下一步", - "wrong-format": "仅支持 csv 格式文件", - "over-single-size-limit": "容量已超过 1 GB", - "over-all-size-limit": "总容量已超过 10 GB", - "empty-file": "文件为空,请重新上传", - "no-duplicate": "下列上传的文件已存在:" - }, - "data-configs": { - "file": { - "title": "文件设置", - "include-header": "包含表头", - "delimiter": { - "title": "分隔符", - "comma": "逗号", - "semicolon": "分号", - "tab": "制表符", - "space": "空格", - "custom": "自定义" - }, - "code-type": { - "title": "编码格式", - "UTF-8": "UTF-8", - "GBK": "GBK", - "ISO-8859-1": "ISO-8859-1", - "US-ASCII": "US-ASCII", - "custom": "自定义" - }, - "date-type": { - "title": "日期格式", - "custom": "自定义" - }, - "skipped-line": "跳过行", - "timezone": "时区", - "save": "保存", - "placeholder": { - "input-delimiter": "请输入分隔符", - "input-charset": "请输入编码格式", - "input-date-format": "请输入日期格式" - }, - "hint": { - "save-succeed": "已保存文件设置" - } - }, - "type": { - "title": "类型设置", - "basic-settings": "基础设置", - "manipulation": { - "create": "创建", - "save": "保存", - "cancel": "取消", - "create-vertex": "创建顶点映射", - "create-edge": "创建边映射" - }, - "info": { - "type": "类型", - "name": "名称", - "ID-strategy": "ID策略", - "edit": "编辑", - "delete": "删除" - }, - "ID-strategy": { - "PRIMARY_KEY": "主键ID", - "AUTOMATIC": "自动生成", - "CUSTOMIZE_STRING": "自定义字符串", - "CUSTOMIZE_NUMBER": "自定义数字", - "CUSTOMIZE_UUID": "自定义UUID" - }, - "vertex": { - "title": "创建顶点映射", - "type": "顶点类型", - "ID-strategy": "ID策略", - "ID-column": "ID列", - "map-settings": "映射设置", - "add-map": { - "title": "添加映射", - "name": "列名", - "sample": "数据样例", - "property": "映射属性", - "clear": "清空" - }, - "select-all": "全选", - "advance": { - "title": "高级设置", - "nullable-list": { - "title": "空值列表", - "empty": "空值", - "custom": "自定义" - }, - "map-property-value": { - "title": "属性值映射", - "add-value": "添加属性值映射", - "fields": { - "property": "属性", - "value-map": "值映射", - "add-value-map": "添加值映射" - } - }, - "placeholder": { - "input": "请选择", - "input-property": "请选择输入属性", - "input-file-value": "请输入文件值", - "input-graph-value": "请输入图导入值" - } - } - }, - "edge": { - "title": "创建边映射", - "type": "边类型", - "source-ID-strategy": "起点ID策略", - "target-ID-strategy": "终点ID策略", - "ID-column": "ID列", - "map-settings": "映射设置", - "add-map": { - "title": "添加映射", - "name": "列名", - "sample": "数据样例", - "property": "映射属性", - "clear": "清空" - }, - "select-all": "全选", - "advance": { - "title": "高级设置", - "nullable-list": { - "title": "空值列表", - "empty": "空值", - "custom": "自定义" - }, - "map-property-value": { - "title": "属性值映射", - "add-value": "添加 属性值映射", - "fields": { - "property": "属性", - "value-map": "值映射", - "add-value-map": "添加值映射" - } - }, - "placeholder": { - "input": "请选择映射属性", - "input-property": "请选择输入属性", - "input-file-value": "请输入文件值", - "input-graph-value": "请输入图导入值" - } - } - }, - "hint": { - "lack-support-for-automatic": "自动生成的ID策略不支持可视化导入,请调用API实现", - "no-vertex-or-edge-mapping": "如下文件未设置顶点类型或边类型映射:" - }, - "placeholder": { - "select-vertex-type": "请选择顶点类型", - "select-edge-type": "请选择边类型", - "select-id-column": "请选择 ID 列", - "empty-value": "空" - } - }, - "manipulations": { - "previous": "上一步", - "next": "下一步", - "add": "添加", - "edit": "编辑", - "delete": "删除", - "cancel": "取消", - "hints": { - "delete-confirm": "确认删除?", - "warning": "删除后无法恢复,请谨慎操作" - } - }, - "validator": { - "no-empty": "该项不能为空" - } - }, - "server-data-import": { - "import-settings": { - "title": "导入设置", - "checkIfExist": "检查边连接的顶点是否存在", - "requestTimesWhenInterpolationFailed": "插入失败重试次数", - "maximumAnalyzedErrorRow": "允许最大解析错误行数", - "requestTicksWhenInterpolationFailed": "插入失败重试间隔/s", - "maxiumInterpolateErrorRow": "允许最大插入错误行数", - "InterpolationTimeout": "插入超时时间/s" - }, - "import-details": { - "title": "导入详情", - "column-titles": { - "file-name": "文件名称", - "type": "类型", - "import-speed": "导入速度", - "import-progress": "导入进度", - "status": "状态", - "time-consumed": "耗时", - "manipulations": "操作" - }, - "content": { - "vertex": "顶点", - "edge": "边" - }, - "status": { - "RUNNING": "运行中", - "SUCCEED": "成功", - "FAILED": "失败", - "PAUSED": "已暂停", - "STOPPED": "已终止" - }, - "manipulations": { - "pause": "暂停", - "resume": "继续", - "retry": "重试", - "abort": "终止", - "failed-cause": "查看原因" - } - }, - "hint": { - "check-vertex": "开启检查会影响导入性能,请按需开启", - "no-data": "正在请求导入", - "confirm-navigation": "确认跳转到任务列表?正在上传的文件可能会丢失" - }, - "validator": { - "no-empty": "该项不能为空", - "need-integer-with-negative": "请输入-1或大于0的整数", - "need-integer": "请输入大于0的整数" - }, - "manipulations": { - "previous": "上一步", - "start": "开始导入", - "cancel": "取消导入", - "finished": "完成" - } - }, - "data-import-status": { - "finished": "导入完成", - "success": "已成功导入 {{number}} 个文件", - "pause": "{{number}} 个文件暂停", - "abort": "{{number}} 个文件终止", - "move-to-import-manager": "返回导入任务列表" - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/dataAnalyze.json b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/dataAnalyze.json deleted file mode 100644 index 8f01b76e3..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/dataAnalyze.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "data-analyze": { - "category": { - "gremlin-analyze": "Gremlin 分析", - "algorithm-analyze": "算法分析" - }, - "manipulations": { - "execution": "执行", - "favorite": "收藏", - "reset": "重置" - }, - "hint": { - "graph-disabled": "该图不可用" - }, - "algorithm-list": { - "title": "算法目录", - "loop-detection": "环路检测", - "focus-detection": "交点检测", - "shortest-path": "最短路径", - "shortest-path-all": "全最短路径", - "all-path": "所有路径", - "model-similarity": "模型相似度算法", - "neighbor-rank": "Neighbor Rank推荐算法", - "k-step-neighbor": "k步邻居", - "k-hop": "k跳算法", - "custom-path": "自定义路径", - "radiographic-inspection": "射线检测", - "same-neighbor": "共同邻居", - "weighted-shortest-path": "带权最短路径", - "single-source-weighted-shortest-path": "单源带权最短路径", - "jaccard": "Jaccard相似度", - "personal-rank": "Personal Rank推荐算法" - }, - "algorithm-forms": { - "loop-detection": { - "options": { - "source": "起点ID:", - "direction": "方向:", - "max_depth": "最大步数:", - "label": "边类型:", - "max_degree": "最大度数:", - "source_in_ring": "环路包含起点:", - "limit": "返回可达路径最大值:", - "capacity": "访问顶点最大值:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入起点ID", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "input-positive-integer-or-negative-one-limit": "请填写-1或大于0的整数,默认为10", - "input-positive-integer": "请填写大于0的整数", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "max-degree": "查询过程中,单个顶点的最大边数目" - }, - "validations": { - "no-empty": "该项不能为空", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数" - } - }, - "focus-detection": { - "options": { - "source": "起点ID:", - "target": "终点ID:", - "direction": "方向:", - "max_depth": "最大步数:", - "label": "边类型:", - "max_degree": "最大度数:", - "capacity": "访问顶点最大值:", - "limit": "返回交点最大值:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入起点ID", - "input-target-id": "请输入终点ID", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "input-positive-integer-or-negative-one-limit": "请填写-1或大于0的整数,默认为10", - "input-positive-integer": "请填写大于0的整数", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "max-degree": "查询过程中,单个顶点的最大边数目" - }, - "validations": { - "no-empty": "该项不能为空", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数" - } - }, - "shortest-path": { - "options": { - "source": "起点ID:", - "target": "终点ID:", - "direction": "方向:", - "max_depth": "最大步数:", - "label": "边类型:", - "max_degree": "最大度数:", - "skip_degree": "超级顶点度数:", - "capacity": "访问顶点最大值:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入起点ID", - "input-target-id": "请输入终点ID", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "input-integer": "请填写大于等于0的整数,默认为0", - "input-positive-integer": "请填写大于0的整数", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "max-degree": "查询过程中,单个顶点的最大边数目", - "skip-degree": "填写查询过程中需要跳过的顶点的最小的边数目,即当顶点的边数目大于超级顶点度数时,跳过该顶点,可用于规避超级点" - }, - "validations": { - "no-empty": "该项不能为空", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数", - "integer-only": "请填写大于等于0的整数", - "postive-integer-only": "请填写大于0的整数" - } - }, - "shortest-path-all": { - "options": { - "source": "起点ID:", - "target": "终点ID:", - "direction": "方向:", - "max_depth": "最大步数:", - "label": "边类型:", - "max_degree": "最大度数:", - "capacity": "访问顶点最大值:", - "skip_degree": "超级顶点度数:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入起点ID", - "input-target-id": "请输入终点ID", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "input-positive-integer": "请填写大于0的整数", - "input-integer": "请填写大于等于0的整数,默认为0", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "max-degree": "查询过程中,单个顶点的最大边数目", - "skip-degree": "填写查询过程中需要跳过的顶点的最小的边数目,即当顶点的边数目大于超级顶点度数时,跳过该顶点,可用于规避超级点" - }, - "validations": { - "no-empty": "该项不能为空", - "integer-only": "请填写大于等于0的整数", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数" - } - }, - "all-path": { - "options": { - "source": "起点ID:", - "target": "终点ID:", - "direction": "方向:", - "max_depth": "最大步数:", - "label": "边类型:", - "max_degree": "最大度数:", - "capacity": "访问顶点最大值:", - "limit": "返回路径最大值:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入起点ID", - "input-target-id": "请输入终点ID", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "input-positive-integer-or-negative-one-limit": "请填写-1或大于0的整数,默认为10", - "input-positive-integer": "请填写大于0的整数", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "max-degree": "查询过程中,单个顶点的最大边数目" - }, - "validations": { - "no-empty": "该项不能为空", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数" - } - }, - "model-similarity": { - "options": { - "method": "起点选择方式:", - "source": "起点ID:", - "vertex-type": "顶点类型:", - "vertex-property": "顶点属性及值:", - "direction": "方向:", - "least_neighbor": "最少邻居数:", - "similarity": "相似度:", - "label": "边类型:", - "max_similar": "相似度最高个数:", - "least_similar": "模形相似点最小个数:", - "property_filter": "属性过滤:", - "least_property_number": "最小属性值个数:", - "max_degree": "最大度数:", - "capacity": "访问顶点最大值:", - "skip_degree": "返回顶点最大值:", - "limit": "返回结果最大值:", - "return_common_connection": "返回共同关联点:", - "return_complete_info": "返回顶点完整信息:" - }, - "radio-value": { - "specific-id": "指定ID", - "filtered-type-property": "筛选类型属性" - }, - "placeholder": { - "input-source-id": "请输入起点ID,多个ID用逗号分隔", - "input-vertex-type": "请选择顶点类型", - "select-vertex-property": "请选择顶点属性", - "input-vertex-property": "多属性值以逗号分隔", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "input-positive-integer-or-negative-one-limit": "请填写-1或大于0的整数,默认为10", - "input-integer": "请填写大于等于0的整数", - "input-positive-integer": "请填写大于0的整数", - "input-integer-gt-1": "请填写大于1的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数", - "input-filtered-property": "请选择需要过滤的属性", - "no-properties": "无属性", - "no-vertex-type": "无顶点类型", - "similarity": "请输入(0-1]的数字" - }, - "hint": { - "vertex_type_or_property": "顶点类型/顶点属性至少填写一项", - "least_property_number": "属性过滤和最小属性值个数需一起使用;设置后效果为:当起点跟其所有的梭形相似点某个属性的值大于等于最小属性值个数时,才会返回该起点及其梭形相似点", - "max-degree": "查询过程中,单个顶点的最大边数目", - "least_neighbor": "邻居数少于当前设定值,则认为起点没有梭形相似点", - "similarity": "起点与\"梭形相似点\"的共同邻居数目占起点的全部邻居数目的比例", - "max_similar": "返回起点的梭形相似点中相似度最高的top个数,0表示全部", - "return_common_connection": "是否返回起点及其\"梭形相似点\"共同关联的中间点" - }, - "validations": { - "no-empty": "该项不能为空", - "no-edge-typs": "无边类型", - "integer-only": "请填写大于等于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数", - "postive-integer-only": "请填写大于0的整数", - "integer-gt-1": "请填写大于1的整数", - "similarity": "请输入(0-1]的数字", - "no-gt-1000": "该值不能大于等于1000" - }, - "add": "添加", - "delete": "删除", - "pre-value": "全部" - }, - "neighbor-rank": { - "options": { - "source": "起点ID:", - "alpha": "Alpha:", - "direction": "方向:", - "capacity": "访问顶点最大值:", - "label": "边类型:", - "degree": "最大度数:", - "top": "每层保留权重Top N:", - "steps": "steps:" - }, - "placeholder": { - "input-source-id": "请输入起点ID", - "input-integer-lt-1000": "请填写大于等于0小于1000的整数, 默认为100", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "input-positive-integer": "请填写大于0的整数", - "range": "范围(0-1]" - }, - "hint": { - "top": "在结果中每一层只保留权重最高的N个结果", - "max-degree": "查询过程中,单个顶点的最大边数目" - }, - "validations": { - "no-empty": "该项不能为空", - "no-edge-typs": "无边类型", - "range": "请填写大于0且小于等于1的数值", - "integer-only-lt-1000": "请填写大于等于0的整数小于1000的整数", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数" - }, - "pre-value": "全部", - "add-new-rule": "添加规则" - }, - "k-step-neighbor": { - "options": { - "source": "起点ID:", - "direction": "方向:", - "max_depth": "最大步数:", - "label": "边类型:", - "max_degree": "最大度数:", - "limit": "返回顶点最大值:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入起点ID", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-limit": "请填写-1或大于0的整数,默认为10", - "input-positive-integer": "请填写大于0的整数", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "max-degree": "查询过程中,单个顶点的最大边数目" - }, - "validations": { - "no-empty": "该项不能为空", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数" - } - }, - "k-hop": { - "options": { - "source": "起点ID:", - "direction": "方向:", - "max_depth": "最大步数:", - "nearest": "最短路径:", - "label": "边类型:", - "max_degree": "最大度数:", - "capacity": "遍历中访问顶点最大值:", - "limit": "返回顶点最大值:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入起点ID", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "input-positive-integer-or-negative-one-limit": "请填写-1或大于0的整数,默认为10", - "input-positive-integer": "请填写大于0的整数", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "max-degree": "查询过程中,单个顶点的最大边数目", - "shortest-path": "开启后,则查询出起始顶点最短路径为depth步的顶点,关闭后,则查询出起始顶点路径为depth步的顶点,可能有环,且不一定是最短路径" - }, - "validations": { - "no-empty": "该项不能为空", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数" - } - }, - "custom-path": { - "options": { - "method": "起点选择方式:", - "source": "起点ID:", - "vertex-type": "顶点类型:", - "vertex-property": "顶点属性:", - "sort_by": "路径权重排序:", - "capacity": "遍历中访问顶点最大值:", - "limit": "返回顶点最大值:", - "direction": "方向:", - "labels": "边类型:", - "properties": "边属性:", - "weight_by": "根据属性计算边权重:", - "degree": "最大度数:", - "sample": "采样值:", - "steps": "steps:" - }, - "placeholder": { - "input-source-id": "请输入起点ID,多个ID用逗号分隔", - "select-vertex-type": "请选择顶点类型", - "select-vertex-property": "请选择顶点属性", - "input-multiple-properties": "多属性值以逗号分隔", - "input-integer": "请填写大于等于0的整数", - "input-positive-integer": "请填写大于0的整数", - "input-positive-integer-or-negative-one-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "input-positive-integer-or-negative-one-limit": "请填写-1或大于0的整数,默认为10", - "input-property": "请输入边属性", - "input-number": "请输入浮点数字", - "select-edge-type": "请选择边类型", - "select-edge-property": "请选择边属性", - "select-property": "请选择属性", - "no-vertex-type": "无顶点类型", - "no-vertex-property": "无顶点属性", - "no-edge-type": "无边类型", - "no-edge-property": "无边属性", - "no-properties": "无属性" - }, - "hint": { - "top": "在结果中每一层只保留权重最高的N个结果", - "vertex_type_or_property": "顶点类型/顶点属性至少填写一项" - }, - "radio-value": { - "specific-id": "指定ID", - "filtered-type-property": "筛选类型属性", - "none": "不排序", - "ascend": "升序", - "descend": "降序" - }, - "validations": { - "no-empty": "该项不能为空", - "no-edge-typs": "无边类型", - "range": "请填写大于0且小于等于1的数值", - "integer-only": "请填写大于等于0的整数", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数", - "input-number": "请输入浮点数字" - }, - "custom-weight": "自定义权重值", - "add": "添加", - "delete": "删除", - "add-new-rule": "添加规则" - }, - "radiographic-inspection": { - "options": { - "source": "起点ID:", - "direction": "方向:", - "max_depth": "最大步数:", - "label": "边类型:", - "max_degree": "最大度数:", - "capacity": "遍历中访问顶点最大值:", - "limit": "返回非环路路径最大值:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入起点ID", - "input-positive-integer": "请填写大于0的整数", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "input-positive-integer-or-negative-one-limit": "请填写-1或大于0的整数,默认为10000000", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "max-degree": "查询过程中,单个顶点的最大边数目" - }, - "validations": { - "no-empty": "该项不能为空", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数" - } - }, - "same-neighbor": { - "options": { - "vertex": "顶点1:", - "other": "顶点2:", - "direction": "方向:", - "label": "边类型:", - "max_degree": "最大度数:", - "limit": "返回共同邻居最大值:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入顶点ID", - "input-other-id": "请输入不同于顶点1的ID", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-limit": "请填写-1或大于0的整数,默认为10000000", - "input-positive-integer": "请填写大于0的整数", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "max-degree": "查询过程中,单个顶点的最大边数目" - }, - "validations": { - "no-empty": "该项不能为空", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数", - "no-same-value-with-other": "不能与顶点2相同", - "no-same-value-with-vertex": "不能与顶点1相同" - } - }, - "weighted-shortest-path": { - "options": { - "source": "起点ID:", - "target": "终点ID:", - "direction": "方向:", - "weight": "权重属性:", - "with_vertex": "返回顶点完整信息:", - "label": "边类型:", - "max_degree": "最大度数:", - "skip_degree": "跳过点的度数:", - "capacity": "遍历中访问顶点最大值:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入起点ID", - "input-target-id": "请输入终点ID", - "input-integer": "请填写大于等于0的整数", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "select-property": "请选择属性", - "input-positive-integer": "请填写大于0的整数,默认为0", - "no-property": "无属性值为数字类型的属性", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "skip-degree": "当顶点的边数目大于填写值,则跳过当前顶点,用于规避超级点", - "max-degree": "查询过程中,单个顶点的最大边数目" - }, - "validations": { - "no-empty": "该项不能为空", - "integer-only": "请填写大于等于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数", - "postive-integer-only": "请填写大于0的整数" - } - }, - "single-source-weighted-shortest-path": { - "options": { - "source": "起点ID:", - "direction": "方向:", - "weight": "权重属性:", - "with_vertex": "返回顶点完整信息:", - "label": "边类型:", - "max_degree": "最大度数:", - "skip_degree": "跳过点的度数:", - "capacity": "遍历中访问顶点最大值:", - "limit": "返回顶点/最短路径最大值:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入起点ID", - "input-integer": "请填写大于等于0的整数,默认为0", - "input-positive-integer": "请填写大于0的整数", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-capacity": "请填写-1或大于0的整数,默认为10000000", - "input-positive-integer-or-negative-one-limit": "请填写-1或大于0的整数,默认为10", - "no-property": "若不填写权重为1.0", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "skip-degree": "当顶点的边数目大于填写值,则跳过当前顶点,用于规避超级点", - "max-degree": "查询过程中,单个顶点的最大边数目" - }, - "validations": { - "no-empty": "该项不能为空", - "integer-only": "请填写大于等于0的整数", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数" - } - }, - "jaccard": { - "options": { - "vertex": "顶点1:", - "other": "顶点2:", - "direction": "方向:", - "label": "边类型:", - "max_degree": "最大度数:" - }, - "pre-value": "全部", - "placeholder": { - "input-source-id": "请输入顶点ID", - "input-other-id": "请输入不同于顶点1的ID", - "input-positive-integer": "请填写大于0的整数", - "input-positive-integer-or-negative-one-max-degree": "请填写-1或大于0的整数,默认为10000", - "no-edge-types": "无边类型" - }, - "hint": { - "max-depth": "为保证性能,建议不超过10步,推荐5步", - "max-degree": "查询过程中,单个顶点的最大边数目" - }, - "validations": { - "no-empty": "该项不能为空", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数", - "no-same-value-with-other": "不能与顶点2相同", - "no-same-value-with-vertex": "不能与顶点1相同" - } - }, - "personal-rank": { - "options": { - "source": "起点ID:", - "alpha": "Alpha:", - "max_depth": "迭代次数:", - "with_label": "返回结果筛选:", - "label": "边类型:", - "degree": "最大度数:", - "limit": "返回顶点最大值:", - "sorted": "返回结果排序:" - }, - "with-label-radio-value": { - "same_label": "相同类型顶点", - "other_label": "不同类型顶点", - "both_label": "全部类型顶点" - }, - "placeholder": { - "input-source-id": "请输入起点ID", - "input-positive-integer-or-negative-one-degree": "请填写-1或大于0的整数,默认为10000", - "input-positive-integer-or-negative-one-limit": "请填写-1或大于0的整数,默认为10000000", - "select-edge": "请选择边类型", - "input-positive-integer": "请填写大于0的整数", - "alpha": "请输入(0-1]的数字", - "max_depth": "请输入(0-50]的数字" - }, - "hint": { - "degree": "查询过程中,单个顶点的最大边数目", - "with-label": "根据是否与起点类型相同,筛选返回结果", - "sorted": "选择开,则降序排列,选择关,则不排序" - }, - "validations": { - "no-empty": "该项不能为空", - "no-edge-typs": "无边类型", - "alpha-range": "请填写大于0且小于等于1的数值", - "depth-range": "请填写大于0且小于等于50的数值", - "postive-integer-only": "请填写大于0的整数", - "positive-integer-or-negative-one-only": "请填写-1或大于0的整数" - }, - "pre-value": "全部", - "add-new-rule": "添加规则" - }, - "api-name-mapping": { - "rings": "环路检测", - "crosspoints": "交点检测", - "shortpath": "最短路径", - "allshortpath": "全最短路径", - "paths": "所有路径", - "fsimilarity": "模型相似度算法", - "neighborrank": "Neighbor Rank推荐算法", - "kneighbor": "k步邻居", - "kout": "k跳算法", - "customizedpaths": "自定义路径", - "rays": "射线检测", - "sameneighbors": "共同邻居", - "weightedshortpath": "带权最短路径", - "singleshortpath": "单源带权最短路径", - "jaccardsimilarity": "Jaccard相似度", - "personalrank": "Personal Rank推荐算法" - } - }, - "exec-logs": { - "table-title": { - "time": "时间", - "type": "执行类型", - "content": "执行内容", - "status": "状态", - "duration": "耗时", - "manipulation": "操作" - }, - "type": { - "GREMLIN": "GREMLIN 查询", - "GREMLIN_ASYNC": "GREMLIN 任务", - "ALGORITHM": "算法查询" - }, - "status": { - "success": "成功", - "async-success": "提交成功", - "running": "运行中", - "failed": "失败", - "async-failed": "提交失败" - } - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/index.ts deleted file mode 100644 index b3e03211e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/graph-managment/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import CommonResources from './common.json'; -import GraphManagementSideBarResources from './GraphManagementSidebar.json'; -import DataAnalyzeResources from './dataAnalyze.json'; -import DataImportResources from './data-import/import-tasks/ImportTasks.json'; -import AsyncTasksResources from './AsyncTasks.json'; -import Addition from './addition.json'; - -export { - CommonResources, - DataAnalyzeResources, - GraphManagementSideBarResources, - DataImportResources, - AsyncTasksResources, - Addition -}; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/index.ts deleted file mode 100644 index 4a369f54e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/i18n/resources/zh-CN/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { merge } from 'lodash-es'; -import { - CommonResources, - DataAnalyzeResources, - GraphManagementSideBarResources, - DataImportResources, - AsyncTasksResources, - Addition -} from './graph-managment'; - -const translation = { - translation: merge( - CommonResources, - DataAnalyzeResources, - GraphManagementSideBarResources, - DataImportResources, - AsyncTasksResources, - Addition - ) -}; - -export default translation; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/index.less b/hugegraph-hubble/hubble-fe-old(legacy)/src/index.less deleted file mode 100644 index b0e16a767..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/index.less +++ /dev/null @@ -1,320 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -@import '~hubble-ui/src/index.less'; - -@primary-color: #2b65ff; -@primary-hover-color: #527dff; -@primary-active-color: #184bcc; - -* { - box-sizing: border-box; -} - -html, -body, -img, -ul, -ol, -li, -table, -tr, -th, -td, -p { - margin: 0; - padding: 0; - border: 0; -} - -body { - background: #f2f2f2; - // prettier-ignore - font-family: - -apple-system, - BlinkMacSystemFont, - 'Helvetica Neue', - Helvetica, - 'PingFang SC', - 'Hiragino Sans GB', - 'Microsoft YaHei', - '微软雅黑', - Arial, - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - &.dark { - background: #000; - } - - &::after { - position: absolute; - overflow: hidden; - left: -20000px; - // preload images which in hover state to solve blink issue - content: - url(./assets/imgs/ic_topback.svg) - url(./assets/imgs/ic_arrow_white.svg) - url(./assets/imgs/ic_shuju_normal.svg) - url(./assets/imgs/ic_shuju_pressed.svg) - url(./assets/imgs/ic_yuanshuju_normal.svg) - url(./assets/imgs/ic_yuanshuju_pressed.svg) - url(./assets/imgs/ic_cebianzhankai.svg) - url(./assets/imgs/ic_cebianshouqi.svg) - url(./assets/imgs/ic_daorushuju_normal.svg) - url(./assets/imgs/ic_daorushuju_pressed.svg) - url(./assets/imgs/ic_renwuguanli_normal.svg) - url(./assets/imgs/ic_renwuguanli_pressed.svg) - url(./assets/imgs/ic_tuzhanshi_normal.svg) - url(./assets/imgs/ic_tuzhanshi_hover.svg) - url(./assets/imgs/ic_tuzhanshi_pressed.svg) - url(./assets/imgs/ic_biaoge_normal.svg) - url(./assets/imgs/ic_biaoge_hover.svg) - url(./assets/imgs/ic_biaoge_pressed.svg) - url(./assets/imgs/ic_json_normal.svg) url(./assets/imgs/ic_json_hover.svg) - url(./assets/imgs/ic_json_pressed.svg) url(./assets/imgs/ic_close_16.svg) - url(./assets/imgs/ic_refresh.svg) url(./assets/imgs/ic_loading_back.svg) - url(./assets/imgs/ic_loading_front.svg) - url(./assets/imgs/ic_question_mark.svg); - } -} - -code { - // prettier-ignore - font-family: - source-code-pro, - Menlo, - Monaco, - Consolas, - 'Courier New', - monospace; -} - -.tooltips { - background: #fff; - box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.2); - border-radius: 4px; - padding: 28px 24px 24px; -} - -.tooltips-dark { - border-radius: 3px; - background-color: rgba(0, 0, 0, 0.8); - border-color: transparent; - padding: 4px 8px; - color: #fff; - line-height: 18px; - font-size: 12px; - max-width: 240px; - word-wrap: break-word; - - // override tooltip-arrow - .tooltip-arrow[data-placement*='bottom'] { - margin-top: -0.25rem; - } - - .tooltip-arrow[data-placement*='bottom']::before { - border-color: transparent transparent rgba(0, 0, 0, 0.8) transparent; - border-width: 0 0.3rem 0.3rem 0.3rem; - position: absolute; - top: 0; - } - - .tooltip-arrow[data-placement*='bottom']::after { - border-color: transparent transparent rgba(0, 0, 0, 0.8) transparent; - // border-color: rgba(0, 0, 0, 0.8); - border-width: 0 0.3rem 0.3rem 0.3rem; - } -} - -.no-line-break { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.message-wrapper { - font-size: 14px; - line-height: 22px; - - &-title { - font-weight: 900; - margin: 3.6px 0 4px; - } - - &-manipulation { - cursor: pointer; - color: #2b65ff; - } -} - -/* overrides (global) */ - -//primary button background colors -.new-fc-one-btn-primary { - background: @primary-color; - - &:hover { - background: @primary-hover-color; - } - - &:active { - background: @primary-active-color; - } - - &-disabled { - background: #d9e6ff; - - &:hover, - &:active { - background: #d9e6ff; - } - } -} - -// Modal titles -.new-fc-one-modal-title { - // prettier-ignore - font-family: - 'PingFangSC-Medium', - 'Microsoft YaHei', - '微软雅黑', - Arial, - sans-serif; - font-weight: bold; - font-size: 16px; -} - -// drawers, e.g. metadata-configs vertex/edge types -.new-fc-one-drawer-wrapper-body-small .new-fc-one-drawer-title { - font-size: 16px; -} - -.new-fc-one-drawer-close { - top: 28px; -} - -// z-index input errorlayer in Drawer should be higher -// prettier-ignore -.new-fc-one-drawer-content-wrapper .new-fc-one-input-error.new-fc-one-input-error-layer { - z-index: 1041; -} - -// also z-index is invalid if parent node has position: relative -.new-fc-one-drawer-content-wrapper .new-fc-one-input-all-container { - position: absolute; -} - -// Steps process style -.new-fc-one-steps-item-process .new-fc-one-steps-item-icon { - background: @primary-color; -} - -// checked-color -.new-fc-one-switch-checked { - background: @primary-color; - - &:hover { - background: @primary-hover-color; - } -} - -// text in -.new-fc-one-switch-inner { - margin-right: 0; -} - -.new-fc-one-switch-checked .new-fc-one-switch-inner { - margin-left: 0; -} - -// override radio button primary color -.new-fc-one-radio-button-wrapper-checked { - border: 1px solid @primary-color; - background-color: @primary-color; - color: #fff; - - &:hover { - border: 1px solid @primary-hover-color; - background-color: @primary-hover-color; - color: #fff; - } -} - -// hovered color -.new-fc-one-menu-horizontal-box .new-fc-one-menu-item-selected:hover { - color: @primary-hover-color; - border-color: @primary-hover-color; -} - -//
th checkbox color -.new-fc-one-checkbox-wrapper .new-fc-one-checkbox-indeterminate .new-fc-one-checkbox-inner { - background-color: #2b65ff; -} - -.new-fc-one-table-thead > tr > th:first-of-type { - padding: 12px 16px 12px 20px; -} - -// could be a bug where container style is display: none -.new-fc-one-message { - display: block !important; -} - -// proper line break -.new-fc-one-message-container-content { - word-break: break-word; -} - -// -.new-fc-one-breadcrumb-link { - color: #2b65ff; -} - -// -.new-fc-one-modal-body { - overflow-y: auto !important; -} - -// menu center -.data-analyze-sidebar .ant-menu.ant-menu-inline-collapsed > .ant-menu-item { - padding: 0 12px; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/index.tsx b/hugegraph-hubble/hubble-fe-old(legacy)/src/index.tsx deleted file mode 100644 index 2c6b3b7c8..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -import ReactDOM from 'react-dom'; -import './index.less'; -import App from './components/App'; -import './i18n'; -import { ConfigProvider } from 'antd'; -import zhCN from 'antd/lib/locale/zh_CN'; -import enUS from 'antd/lib/locale/en_US'; - -// UI component has built-in text internationalization, -// such as confirmation, cancellation, etc -const languageType = - localStorage.getItem('languageType') === 'en-US' ? enUS : zhCN; -ReactDOM.render( - - - , - document.getElementById('root') -); diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/react-app-env.d.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/react-app-env.d.ts deleted file mode 100644 index 4724ca7e0..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/react-app-env.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -/// diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/asyncTasksStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/asyncTasksStore.ts deleted file mode 100644 index 4e0675c19..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/asyncTasksStore.ts +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { createContext } from 'react'; -import { observable, action, flow } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; - -import { initErrorInfo, initRequestStatus } from '../factory/asyncTasksStore'; -import { checkIfLocalNetworkOffline } from '../utils'; - -import { baseUrl, responseData } from '../types/common'; -import type { - AsyncTask, - AsyncTaskListResponse -} from '../types/GraphManagementStore/asyncTasksStore'; - -export class AsyncTasksStore { - @observable requestStatus = initRequestStatus(); - @observable errorInfo = initErrorInfo(); - - @observable currentId: number | null = null; - @observable searchWords = ''; - @observable abortingId = NaN; - - @observable.shallow asyncTasksPageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - - // searched results rather than initial fetched result - @observable.shallow isSearched = { - status: false, - value: '' - }; - - @observable.shallow filterOptions = { - type: '', - status: '' - }; - - @observable.ref asyncTaskList: AsyncTask[] = []; - @observable.ref singleAsyncTask: AsyncTask | null = null; - - @action - setCurrentId(id: number) { - this.currentId = id; - } - - @action - setAbortingId(id: number) { - this.abortingId = id; - } - - @action - mutateSearchWords(word: string) { - this.searchWords = word; - } - - @action - mutateFilterOptions(category: 'type' | 'status', value: string) { - this.filterOptions[category] = value; - } - - @action - mutateAsyncTasksPageNumber(pageNumber: number) { - this.asyncTasksPageConfig.pageNumber = pageNumber; - } - - @action - switchSearchedStatus(isSearched: boolean) { - this.isSearched.status = isSearched; - - isSearched - ? (this.isSearched.value = this.searchWords) - : (this.isSearched.value = ''); - } - - @action - dispose() { - this.requestStatus = initRequestStatus(); - this.errorInfo = initErrorInfo(); - this.currentId = null; - this.searchWords = ''; - this.abortingId = NaN; - this.asyncTasksPageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - this.isSearched = { - status: false, - value: '' - }; - this.filterOptions = { - type: '', - status: '' - }; - this.asyncTaskList = []; - this.singleAsyncTask = null; - } - - fetchAsyncTaskList = flow(function* fetchAsyncTaskList( - this: AsyncTasksStore - ) { - this.requestStatus.fetchAsyncTaskList = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .get>( - `${baseUrl}/${this.currentId}/async-tasks?page_no=${ - this.asyncTasksPageConfig.pageNumber - }&page_size=10&type=${ - this.filterOptions.type - }&status=${this.filterOptions.status.toUpperCase()}` + - (this.isSearched.status && this.searchWords !== '' - ? `&content=${this.searchWords}` - : '') - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchAsyncTaskList.code = result.data.status; - throw new Error(result.data.message); - } - - this.asyncTaskList = result.data.data.records; - this.asyncTasksPageConfig.pageTotal = result.data.data.total; - this.requestStatus.fetchAsyncTaskList = 'success'; - } catch (error) { - this.requestStatus.fetchAsyncTaskList = 'failed'; - this.errorInfo.fetchAsyncTaskList.message = error.message; - } - }); - - fetchAsyncTask = flow(function* fetchAsyncTask( - this: AsyncTasksStore, - id: number - ) { - this.requestStatus.fetchAsyncTask = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .get>( - `${baseUrl}/${this.currentId}/async-tasks/${id}` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchAsyncTask.code = result.data.status; - throw new Error(result.data.message); - } - - this.singleAsyncTask = result.data.data; - this.requestStatus.fetchAsyncTask = 'success'; - } catch (error) { - this.requestStatus.fetchAsyncTask = 'failed'; - this.errorInfo.fetchAsyncTask.message = error.message; - } - }); - - deleteAsyncTask = flow(function* deleteAsyncTask( - this: AsyncTasksStore, - selectedTaskIds: number[] - ) { - this.requestStatus.deleteAsyncTask = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .delete>( - `${baseUrl}/${this.currentId}/async-tasks?` + - selectedTaskIds.map((id) => 'ids=' + id).join('&') - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.deleteAsyncTask.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.deleteAsyncTask = 'success'; - } catch (error) { - this.requestStatus.deleteAsyncTask = 'failed'; - this.errorInfo.deleteAsyncTask.message = error.message; - } - }); - - abortAsyncTask = flow(function* abortAsyncTask( - this: AsyncTasksStore, - id: number - ) { - this.requestStatus.abortAsyncTask = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post>( - `${baseUrl}/${this.currentId}/async-tasks/cancel/${id}` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.abortAsyncTask.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.abortAsyncTask = 'success'; - } catch (error) { - this.requestStatus.abortAsyncTask = 'failed'; - this.errorInfo.abortAsyncTask.message = error.message; - } - }); -} - -export default createContext(new AsyncTasksStore()); diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataAnalyzeStore/algorithmAnalyzerStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataAnalyzeStore/algorithmAnalyzerStore.ts deleted file mode 100644 index 2325c11f0..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataAnalyzeStore/algorithmAnalyzerStore.ts +++ /dev/null @@ -1,1901 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { DataAnalyzeStore } from './dataAnalyzeStore'; -import { observable, action, computed } from 'mobx'; -import { isEmpty, remove, isEqual, isUndefined, flatten } from 'lodash-es'; -import { v4 } from 'uuid'; -import isInt from 'validator/lib/isInt'; - -import { - initializeRequestStatus, - initializeErrorInfo, - createLoopDetectionDefaultParams, - createValidateLoopDetectionParamsErrorMessage, - createFocusDetectionDefaultParams, - createValidateFocusDetectionParamsErrorMessage, - createShortestPathDefaultParams, - createValidateShortestPathParamsErrorMessage, - createShortestPathAllDefaultParams, - createValidateShortestPathAllParamsErrorMessage, - createAllPathDefaultParams, - createValidateAllPathParamsErrorMessage, - createModelSimilarityDefaultParams, - createValidateModelSimilarParamsErrorMessage, - createNeighborRankDefaultParams, - createValidateNeighborRankErrorMessage, - createKStepNeighborDefaultParams, - createValidateKStepNeighborParamsErrorMessage, - createKHopDefaultParams, - createValidateKHopParamsErrorMessage, - createRadiographicInspectionDefaultParams, - createValidateRadiographicInspectionParamsErrorMessage, - createSameNeighborDefaultParams, - createValidateSameNeighborParamsErrorMessage, - createWeightedShortestPathDefaultParams, - createValidateWeightedShortestPathParamsErrorMessage, - createSingleSourceWeightedShortestPathDefaultParams, - createValidateSingleSourceWeightedShortestPathParamsErrorMessage, - createJaccardDefaultParams, - createValidateJaccardParamsErrorMessage, - createPersonalRankDefaultParams, - createValidatePersonalRankParamsErrorMessage, - createCustomPathDefaultParams, - createValidateCustomPathParamsErrorMessage -} from '../../factory/dataAnalyzeStore/algorithmStore'; -import i18next from '../../../i18n'; -import { isGtNegativeOneButZero } from '../../utils'; - -import type { dict } from '../../types/common'; -import type { - ShortestPathAlgorithmParams, - LoopDetectionParams, - FocusDetectionParams, - ShortestPathAllAlgorithmParams, - AllPathAlgorithmParams, - ModelSimilarityParams, - NeighborRankParams, - NeighborRankRule, - KStepNeighbor, - KHop, - RadiographicInspection, - SameNeighbor, - WeightedShortestPath, - SingleSourceWeightedShortestPath, - Jaccard, - PersonalRank, - CustomPathParams, - CustomPathRule -} from '../../types/GraphManagementStore/dataAnalyzeStore'; -import isFloat from 'validator/lib/isFloat'; - -export class AlgorithmAnalyzerStore { - dataAnalyzeStore: DataAnalyzeStore; - - constructor(dataAnalyzeStore: DataAnalyzeStore) { - this.dataAnalyzeStore = dataAnalyzeStore; - } - - @observable requestStatus = initializeRequestStatus(); - @observable errorInfo = initializeErrorInfo(); - - @observable isCollapse = false; - @observable currentAlgorithm = ''; - - @observable - loopDetectionParams: LoopDetectionParams = createLoopDetectionDefaultParams(); - - @observable - validateLoopDetectionParamsErrorMessage: any = createValidateLoopDetectionParamsErrorMessage(); - - @observable - focusDetectionParams: FocusDetectionParams = createFocusDetectionDefaultParams(); - - @observable - validateFocusDetectionParamsErrorMessage: any = createValidateFocusDetectionParamsErrorMessage(); - - @observable - shortestPathAlgorithmParams: ShortestPathAlgorithmParams = createShortestPathDefaultParams(); - - @observable - validateShortestPathParamsErrorMessage: ShortestPathAlgorithmParams = createValidateShortestPathParamsErrorMessage(); - - @observable - shortestPathAllParams: ShortestPathAllAlgorithmParams = createShortestPathAllDefaultParams(); - - @observable - validateShortestPathAllParamsErrorMessage: ShortestPathAllAlgorithmParams = createValidateShortestPathAllParamsErrorMessage(); - - @observable - allPathParams: AllPathAlgorithmParams = createAllPathDefaultParams(); - - @observable - validateAllPathParamsErrorMessage: AllPathAlgorithmParams = createValidateAllPathParamsErrorMessage(); - - @observable - modelSimilarityParams: ModelSimilarityParams = createModelSimilarityDefaultParams(); - - @observable - validateModelSimilartiyParamsErrorMessage: dict< - string - > = createValidateModelSimilarParamsErrorMessage(); - - @observable - neighborRankParams: NeighborRankParams = createNeighborRankDefaultParams(); - - @observable - validateNeighborRankParamsParamsErrorMessage = createValidateNeighborRankErrorMessage(); - - @observable - kStepNeighborParams: KStepNeighbor = createKStepNeighborDefaultParams(); - - @observable - validateKStepNeighborParamsErrorMessage = createValidateKStepNeighborParamsErrorMessage(); - - @observable - kHopParams: KHop = createKHopDefaultParams(); - - @observable - validateKHopParamsErrorMessage = createValidateKHopParamsErrorMessage(); - - @observable - customPathParams: CustomPathParams = createCustomPathDefaultParams(); - - @observable - validateCustomPathParmasErrorMessage = createValidateCustomPathParamsErrorMessage(); - - @observable - radiographicInspectionParams: RadiographicInspection = createRadiographicInspectionDefaultParams(); - - @observable - validateRadiographicInspectionParamsErrorMessage = createValidateRadiographicInspectionParamsErrorMessage(); - - @observable - sameNeighborParams: SameNeighbor = createSameNeighborDefaultParams(); - - @observable - validateSameNeighborParamsErrorMessage: SameNeighbor = createValidateSameNeighborParamsErrorMessage(); - - @observable - weightedShortestPathParams: WeightedShortestPath = createWeightedShortestPathDefaultParams(); - - @observable - validateWeightedShortestPathParamsErrorMessage = createValidateWeightedShortestPathParamsErrorMessage(); - - @observable - singleSourceWeightedShortestPathParams: SingleSourceWeightedShortestPath = createSingleSourceWeightedShortestPathDefaultParams(); - - @observable - validateSingleSourceWeightedShortestPathParamsErrorMessage = createValidateSingleSourceWeightedShortestPathParamsErrorMessage(); - - @observable - jaccardParams: Jaccard = createJaccardDefaultParams(); - - @observable - validateJaccardParamsErrorMessage = createValidateJaccardParamsErrorMessage(); - - @observable - personalRankParams: PersonalRank = createPersonalRankDefaultParams(); - - @observable - validatePersonalRankErrorMessage = createValidatePersonalRankParamsErrorMessage(); - - @computed get allPropertyIndexProperty() { - return flatten( - this.dataAnalyzeStore.propertyIndexes.map(({ fields }) => fields) - ); - } - - @computed get currentAlgorithmParams() { - switch (this.currentAlgorithm) { - case 'loop-detection': - return this.loopDetectionParams; - case 'focus-detection': - return this.focusDetectionParams; - case 'shortest-path': - return this.shortestPathAlgorithmParams; - case 'shortest-path-all': - return this.shortestPathAllParams; - case 'all-path': - return this.allPathParams; - case 'model-similarity': - return this.modelSimilarityParams; - case 'neighbor-rank': - return this.neighborRankParams; - case 'k-step-neighbor': - return this.kStepNeighborParams; - case 'k-hop': - return this.kHopParams; - case 'custom-path': - return this.customPathParams; - case 'radiographic-inspection': - return this.loopDetectionParams; - case 'same-neighbor': - return this.sameNeighborParams; - case 'weighted-shortest-path': - return this.weightedShortestPathParams; - case 'single-source-weighted-shortest-path': - return this.singleSourceWeightedShortestPathParams; - case 'jaccard': - return this.jaccardParams; - case 'personal-rank': - return this.personalRankParams; - } - } - - @action - switchCollapse(flag: boolean) { - this.isCollapse = flag; - } - - @action - changeCurrentAlgorithm(algorithm: string) { - this.currentAlgorithm = algorithm; - } - - @action - mutateLoopDetectionParams( - key: T, - value: LoopDetectionParams[T] - ) { - this.loopDetectionParams[key] = value; - } - - @action - validateLoopDetectionParams(key: T) { - const value = this.loopDetectionParams[key]; - - switch (key) { - case 'source': - if (isEmpty(value)) { - this.validateLoopDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.loop-detection.validations.no-empty' - ); - - return; - } - break; - case 'max_depth': - if (isEmpty(value)) { - this.validateLoopDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.loop-detection.validations.no-empty' - ); - - return; - } - - if (!isInt(value as string, { min: 1 })) { - this.validateLoopDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.loop-detection.validations.postive-integer-only' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value as string)) { - this.validateLoopDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.loop-detection.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'limit': - if (!isGtNegativeOneButZero(value as string)) { - this.validateLoopDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.loop-detection.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'capacity': - if (!isGtNegativeOneButZero(value as string)) { - this.validateLoopDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.loop-detection.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateLoopDetectionParamsErrorMessage[key] = ''; - } - - @action - resetLoopDetectionParams() { - this.loopDetectionParams = createLoopDetectionDefaultParams(); - this.validateLoopDetectionParamsErrorMessage = createValidateLoopDetectionParamsErrorMessage(); - } - - @action - mutateFocusDetectionParams( - key: T, - value: FocusDetectionParams[T] - ) { - this.focusDetectionParams[key] = value; - } - - @action - validateFocusDetectionParams(key: T) { - const value = this.focusDetectionParams[key]; - - switch (key) { - case 'source': - case 'target': - if (isEmpty(value)) { - this.validateFocusDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.focus-detection.validations.no-empty' - ); - - return; - } - break; - case 'max_depth': - if (isEmpty(value)) { - this.validateFocusDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.focus-detection.validations.no-empty' - ); - - return; - } - - if (!isInt(value, { min: 1 })) { - this.validateFocusDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.focus-detection.validations.postive-integer-only' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value as string)) { - this.validateFocusDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.focus-detection.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'limit': - if (!isGtNegativeOneButZero(value as string)) { - this.validateFocusDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.focus-detection.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'capacity': - if (!isGtNegativeOneButZero(value as string)) { - this.validateFocusDetectionParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.focus-detection.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateFocusDetectionParamsErrorMessage[key] = ''; - } - - @action - resetFocusDetectionParams() { - this.focusDetectionParams = createFocusDetectionDefaultParams(); - this.validateFocusDetectionParamsErrorMessage = createValidateFocusDetectionParamsErrorMessage(); - } - - @action - mutateShortestPathParams( - key: T, - value: ShortestPathAlgorithmParams[T] - ) { - this.shortestPathAlgorithmParams[key] = value; - } - - @action - validateShortestPathParams( - key: T - ) { - const value = this.shortestPathAlgorithmParams[key]; - - switch (key) { - case 'source': - case 'target': - if (isEmpty(value)) { - this.validateShortestPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path.validations.no-empty' - ); - - return; - } - break; - case 'max_depth': - if (isEmpty(value)) { - this.validateShortestPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path.validations.no-empty' - ); - - return; - } - - if (!isInt(value, { min: 1 })) { - this.validateShortestPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path.validations.postive-integer-only' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value as string)) { - this.validateShortestPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'skip_degree': - if (value !== '' && !isInt(value, { min: 0 })) { - this.validateShortestPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path.validations.integer-only' - ); - - return; - } - - break; - case 'capacity': - if (!isGtNegativeOneButZero(value as string)) { - this.validateShortestPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateShortestPathParamsErrorMessage[key] = ''; - } - - @action - resetShortestPathParams() { - this.shortestPathAlgorithmParams = createShortestPathDefaultParams(); - this.validateShortestPathParamsErrorMessage = createValidateShortestPathParamsErrorMessage(); - } - - @action - mutateShortestPathAllParams( - key: T, - value: ShortestPathAlgorithmParams[T] - ) { - this.shortestPathAllParams[key] = value; - } - - @action - validateShortestPathAllParams( - key: T - ) { - const value = this.shortestPathAllParams[key]; - - switch (key) { - case 'source': - if (isEmpty(value)) { - this.validateShortestPathAllParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path-all.validations.no-empty' - ); - - return; - } - break; - case 'target': - if (isEmpty(value)) { - this.validateShortestPathAllParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path-all.validations.no-empty' - ); - - return; - } - break; - case 'max_depth': - if (isEmpty(value)) { - this.validateShortestPathAllParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path-all.validations.no-empty' - ); - - return; - } - - if (!isInt(value, { min: 1 })) { - this.validateShortestPathAllParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path-all.validations.postive-integer-only' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value)) { - this.validateShortestPathAllParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path-all.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'capacity': - if (!isGtNegativeOneButZero(value)) { - this.validateShortestPathAllParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path-all.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'skip_degree': - if (value !== '' && !isInt(value, { min: 0 })) { - this.validateShortestPathAllParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path-all.validations.integer-only' - ); - - return; - } - } - - this.validateShortestPathAllParamsErrorMessage[key] = ''; - } - - @action - resetShortestPathAllParams() { - this.shortestPathAllParams = createShortestPathAllDefaultParams(); - this.validateShortestPathAllParamsErrorMessage = createValidateShortestPathAllParamsErrorMessage(); - } - - @action - mutateAllPathParams( - key: T, - value: AllPathAlgorithmParams[T] - ) { - this.allPathParams[key] = value; - } - - @action - validateAllPathParams(key: T) { - const value = this.allPathParams[key]; - - switch (key) { - case 'source': - if (isEmpty(value)) { - this.validateAllPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.all-path.validations.no-empty' - ); - - return; - } - break; - case 'target': - if (isEmpty(value)) { - this.validateAllPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.all-path.validations.no-empty' - ); - - return; - } - break; - case 'max_depth': - if (isEmpty(value)) { - this.validateAllPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.all-path.validations.no-empty' - ); - - return; - } - - if (!isInt(value, { min: 1 })) { - this.validateAllPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.all-path.validations.postive-integer-only' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value)) { - this.validateAllPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.all-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'capacity': - if (!isGtNegativeOneButZero(value)) { - this.validateAllPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'limit': - if (!isGtNegativeOneButZero(value)) { - this.validateAllPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.shortest-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateAllPathParamsErrorMessage[key] = ''; - } - - @action - resetAllPathParams() { - this.allPathParams = createAllPathDefaultParams(); - this.validateAllPathParamsErrorMessage = createValidateAllPathParamsErrorMessage(); - } - - @action - addModelSimilarityVertexProperty() { - this.modelSimilarityParams.vertexProperty.push(['', '']); - } - - @action - editModelSimilarityVertexProperty( - index: number, - type: 'key' | 'value', - value: string - ) { - if (type === 'key') { - this.modelSimilarityParams.vertexProperty[index][0] = value; - } else { - this.modelSimilarityParams.vertexProperty[index][1] = value; - } - } - - @action - removeModelSimilarityVertexProperty(propertyIndex: number) { - remove( - this.modelSimilarityParams.vertexProperty, - (_, index) => index === propertyIndex - ); - } - - @action - mutateModelSimilarityParams( - key: T, - value: ModelSimilarityParams[T] - ) { - this.modelSimilarityParams[key] = value; - } - - @action - validateModelSimilarityParams(key: T) { - const value = this.modelSimilarityParams[key]; - - switch (key) { - case 'source': - if (isEmpty(value)) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.no-empty' - ); - - return; - } - - break; - case 'least_neighbor': - if (isEmpty(value)) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.no-empty' - ); - - return; - } - - if (!isInt(value as string, { min: 1 })) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.postive-integer-only' - ); - - return; - } - - break; - case 'similarity': - if (isEmpty(value)) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.no-empty' - ); - - return; - } - - if ( - Object.is(Number(value), NaN) || - Number(value) > 1 || - Number(value) <= 0 - ) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.similarity' - ); - - return; - } - - break; - case 'max_similar': - if (value !== '' && !isInt(value as string, { min: 0 })) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.integer-only' - ); - - return; - } - - break; - case 'least_similar': - if (value !== '' && !isInt(value as string, { min: 1 })) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.postive-integer-only' - ); - - return; - } - - break; - case 'least_property_number': - if ( - !isEmpty(this.modelSimilarityParams.property_filter) && - isEmpty(value) - ) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.no-empty' - ); - - return; - } - - if (value !== '' && !isInt(value as string, { min: 2 })) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.integer-gt-1' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value as string)) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'capacity': - if (!isGtNegativeOneButZero(value as string)) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'limit': - if (!isGtNegativeOneButZero(value as string)) { - this.validateModelSimilartiyParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.model-similarity.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateModelSimilartiyParamsErrorMessage[key] = ''; - } - - @action - resetModelSimilarityParams() { - this.modelSimilarityParams = createModelSimilarityDefaultParams(); - this.validateModelSimilartiyParamsErrorMessage = createValidateModelSimilarParamsErrorMessage(); - } - - @action - switchModelSimilarityMethod(method: string) { - this.modelSimilarityParams.method = method; - - if (method === 'id') { - this.modelSimilarityParams.vertexType = ''; - this.modelSimilarityParams.vertexProperty = [['', '']]; - this.validateModelSimilartiyParamsErrorMessage.vertexType = ''; - this.validateModelSimilartiyParamsErrorMessage.vertexProperty = ''; - } else { - this.modelSimilarityParams.source = ''; - this.validateModelSimilartiyParamsErrorMessage.source = ''; - } - } - - @action - addNeighborRankRule() { - this.neighborRankParams.steps.push({ - uuid: v4(), - direction: 'BOTH', - labels: ['__all__'], - degree: '10000', - top: '100' - }); - - // add error message together - this.addValidateNeighborRankRule(); - } - - @action - addValidateNeighborRankRule() { - this.validateNeighborRankParamsParamsErrorMessage.steps.push({ - uuid: '', - direction: '', - labels: '', - degree: '', - top: '' - }); - } - - @action - removeNeighborRankRule(ruleIndex: number) { - remove(this.neighborRankParams.steps, (_, index) => index === ruleIndex); - // remove error message together - this.removeValidateNeighborRankRule(ruleIndex); - } - - @action - removeValidateNeighborRankRule(ruleIndex: number) { - remove( - this.validateNeighborRankParamsParamsErrorMessage.steps, - (_, index) => index === ruleIndex - ); - } - - @action - mutateNeighborRankParams( - key: T, - value: NeighborRankParams[T] - ) { - this.neighborRankParams[key] = value; - } - - @action - mutateNeighborRankRuleParams( - key: T, - value: NeighborRankRule[T], - index: number - ) { - this.neighborRankParams.steps[index][key] = value; - } - - @action - validateNeighborRankParams(key: T) { - const value = this.neighborRankParams[key]; - - switch (key) { - case 'source': - if (isEmpty(value)) { - this.validateNeighborRankParamsParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.neighbor-rank.validations.no-empty' - ); - - return; - } - - this.validateNeighborRankParamsParamsErrorMessage.source = ''; - break; - case 'alpha': - if (isEmpty(value)) { - this.validateNeighborRankParamsParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.neighbor-rank.validations.no-empty' - ); - - return; - } - - if ( - Object.is(Number(value), NaN) || - Number(value) > 1 || - Number(value) <= 0 - ) { - this.validateNeighborRankParamsParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.neighbor-rank.validations.range' - ); - - return; - } - - this.validateNeighborRankParamsParamsErrorMessage.alpha = ''; - break; - case 'capacity': - if (!isGtNegativeOneButZero(value as string)) { - this.validateNeighborRankParamsParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.neighbor-rank.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - this.validateNeighborRankParamsParamsErrorMessage.capacity = ''; - break; - } - } - - @action - validateNeighborRankRules( - key: T, - ruleIndex: number - ) { - const value = this.neighborRankParams.steps[ruleIndex][key]; - - switch (key) { - case 'degree': - if (!isGtNegativeOneButZero(value as string)) { - this.validateNeighborRankParamsParamsErrorMessage.steps[ruleIndex][ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.neighbor-rank.validations.positive-integer-or-negative-one-only' - ); - - return; - } - break; - case 'top': - if (!isEmpty(value) && !isInt(value as string, { min: 0, max: 999 })) { - this.validateNeighborRankParamsParamsErrorMessage.steps[ruleIndex][ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.neighbor-rank.validations.integer-only-lt-1000' - ); - - return; - } - break; - default: - return; - } - - this.validateNeighborRankParamsParamsErrorMessage.steps[ruleIndex][key] = - ''; - } - - @action - resetNeighborRankParams() { - this.neighborRankParams = createNeighborRankDefaultParams(); - this.validateNeighborRankParamsParamsErrorMessage = createValidateNeighborRankErrorMessage(); - } - - @action - mutateKStepNeighborParams( - key: T, - value: KStepNeighbor[T] - ) { - this.kStepNeighborParams[key] = value; - } - - @action - validateKStepNeighborParams(key: T) { - const value = this.kStepNeighborParams[key]; - - switch (key) { - case 'source': - if (isEmpty(value)) { - this.validateKStepNeighborParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.k-step-neighbor.validations.no-empty' - ); - - return; - } - - break; - case 'max_depth': - if (isEmpty(value)) { - this.validateKStepNeighborParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.k-step-neighbor.validations.no-empty' - ); - - return; - } - - if (!isInt(value, { min: 1 })) { - this.validateKStepNeighborParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.k-step-neighbor.validations.postive-integer-only' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value)) { - this.validateKStepNeighborParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.k-step-neighbor.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'limit': - if (!isGtNegativeOneButZero(value)) { - this.validateKStepNeighborParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.k-step-neighbor.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateKStepNeighborParamsErrorMessage[key] = ''; - } - - @action - resetKStepNeighborParams() { - this.kStepNeighborParams = createKStepNeighborDefaultParams(); - this.validateKStepNeighborParamsErrorMessage = createValidateKStepNeighborParamsErrorMessage(); - } - - @action - mutateKHopParams(key: T, value: KHop[T]) { - this.kHopParams[key] = value; - } - - @action - validateKHopParams(key: T) { - const value = this.kHopParams[key]; - - switch (key) { - case 'source': - if (isEmpty(value)) { - this.validateKHopParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.k-hop.validations.no-empty' - ); - - return; - } - - break; - case 'max_depth': - if (isEmpty(value)) { - this.validateKHopParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.k-hop.validations.no-empty' - ); - - return; - } - - if (!isInt(value as string, { min: 1 })) { - this.validateKHopParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.k-hop.validations.postive-integer-only' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value as string)) { - this.validateKHopParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.k-hop.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'limit': - if (!isGtNegativeOneButZero(value as string)) { - this.validateKHopParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.k-hop.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'capacity': - if (!isGtNegativeOneButZero(value as string)) { - this.validateKHopParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.k-hop.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateKHopParamsErrorMessage[key] = ''; - } - - @action - resetKHopParams() { - this.kHopParams = createKHopDefaultParams(); - this.validateKHopParamsErrorMessage = createValidateKHopParamsErrorMessage(); - } - - @action - addCustomPathRule() { - this.customPathParams.steps.push({ - uuid: v4(), - direction: 'BOTH', - labels: this.dataAnalyzeStore.edgeTypes.map(({ name }) => name), - weight_by: '', - default_weight: '', - properties: [['', '']], - degree: '10000', - sample: '100' - }); - - // add error message together - this.validateCustomPathParmasErrorMessage.steps.push({ - uuid: '', - direction: '', - labels: '', - weight_by: '', - default_weight: '', - properties: '', - degree: '', - sample: '' - }); - } - - @action - removeCustomPathRule(ruleIndex: number) { - remove(this.customPathParams.steps, (_, index) => index === ruleIndex); - // remove error message together - remove( - this.validateCustomPathParmasErrorMessage.steps, - (_, index) => index === ruleIndex - ); - } - - @action - addCustomPathVertexProperty() { - this.customPathParams.vertexProperty.push(['', '']); - } - - @action - removeCustomPathVertexProperty(propertyIndex: number) { - remove( - this.customPathParams.vertexProperty, - (_, index) => index === propertyIndex - ); - } - - @action - addCustomPathRuleProperty(ruleIndex: number) { - this.customPathParams.steps[ruleIndex].properties.push(['', '']); - } - - @action - removeCustomPathRuleProperty(ruleIndex: number, propertyIndex: number) { - remove( - this.customPathParams.steps[ruleIndex].properties, - (_, index) => index === propertyIndex - ); - } - - @action - mutateCustomPathParams( - key: T, - value: CustomPathParams[T] - ) { - this.customPathParams[key] = value; - } - - @action - mutateCustomPathRuleParams( - key: T, - value: CustomPathRule[T], - index: number - ) { - this.customPathParams.steps[index][key] = value; - } - - @action - validateCustomPathParams(key: T) { - const value = this.customPathParams[key]; - - switch (key) { - case 'source': - if (isEmpty(value)) { - this.validateCustomPathParmasErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.custom-path.validations.no-empty' - ); - - return; - } - - this.validateCustomPathParmasErrorMessage.source = ''; - break; - case 'capacity': - if (!isGtNegativeOneButZero(value as string)) { - this.validateCustomPathParmasErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.custom-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - this.validateCustomPathParmasErrorMessage.capacity = ''; - break; - case 'limit': - if (!isGtNegativeOneButZero(value as string)) { - this.validateCustomPathParmasErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.custom-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - this.validateCustomPathParmasErrorMessage.capacity = ''; - break; - } - } - - @action - validateCustomPathRules( - key: T, - ruleIndex: number - ) { - const value = this.customPathParams.steps[ruleIndex][key]; - - switch (key) { - case 'properties': - if (isEmpty(value)) { - this.validateCustomPathParmasErrorMessage.steps[ruleIndex][ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.custom-path.validations.no-empty' - ); - - return; - } - - break; - case 'degree': - if (!isGtNegativeOneButZero(value as string)) { - this.validateCustomPathParmasErrorMessage.steps[ruleIndex][ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.neighbor-rank.validations.positive-integer-or-negative-one-only' - ); - - return; - } - break; - case 'sample': - if (!isGtNegativeOneButZero(value as string)) { - this.validateCustomPathParmasErrorMessage.steps[ruleIndex][ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.neighbor-rank.validations.positive-integer-or-negative-one-only' - ); - - return; - } - break; - case 'default_weight': - if (isEmpty(value)) { - this.validateCustomPathParmasErrorMessage.steps[ruleIndex][ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.custom-path.validations.no-empty' - ); - - return; - } - - if (!isFloat(value as string)) { - this.validateCustomPathParmasErrorMessage.steps[ruleIndex][ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.custom-path.validations.input-number' - ); - - return; - } - - break; - default: - return; - } - - this.validateCustomPathParmasErrorMessage.steps[ruleIndex][key] = ''; - } - - @action - switchCustomPathMethod(method: string) { - this.customPathParams.method = method; - - if (method === 'id') { - this.customPathParams.vertexType = ''; - this.customPathParams.vertexProperty = [['', '']]; - this.validateCustomPathParmasErrorMessage.vertexType = ''; - this.validateCustomPathParmasErrorMessage.vertexProperty = ''; - } else { - this.customPathParams.source = ''; - this.validateCustomPathParmasErrorMessage.source = ''; - } - } - - @action - resetCustomPathParams() { - this.customPathParams = createCustomPathDefaultParams(); - - // manually assign step edge values - this.customPathParams.steps[0].labels = this.dataAnalyzeStore.edgeTypes.map( - ({ name }) => name - ); - this.validateCustomPathParmasErrorMessage = createValidateCustomPathParamsErrorMessage(); - } - - @action - mutateRadiographicInspectionParams( - key: T, - value: RadiographicInspection[T] - ) { - this.radiographicInspectionParams[key] = value; - } - - @action - validateRadiographicInspectionParams( - key: T - ) { - const value = this.radiographicInspectionParams[key]; - - switch (key) { - case 'source': - if (isEmpty(value)) { - this.validateRadiographicInspectionParamsErrorMessage[ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.radiographic-inspection.validations.no-empty' - ); - - return; - } - - break; - case 'max_depth': - if (isEmpty(value)) { - this.validateRadiographicInspectionParamsErrorMessage[ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.radiographic-inspection.validations.no-empty' - ); - - return; - } - - if (!isInt(value, { min: 1 })) { - this.validateRadiographicInspectionParamsErrorMessage[ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.radiographic-inspection.validations.postive-integer-only' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value)) { - this.validateRadiographicInspectionParamsErrorMessage[ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.radiographic-inspection.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'capacity': - if (!isGtNegativeOneButZero(value)) { - this.validateRadiographicInspectionParamsErrorMessage[ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.radiographic-inspection.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'limit': - if (!isGtNegativeOneButZero(value)) { - this.validateRadiographicInspectionParamsErrorMessage[ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.radiographic-inspection.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateRadiographicInspectionParamsErrorMessage[key] = ''; - } - - @action - resetRadiographicInspectionParams() { - this.radiographicInspectionParams = createRadiographicInspectionDefaultParams(); - this.validateRadiographicInspectionParamsErrorMessage = createValidateRadiographicInspectionParamsErrorMessage(); - } - - @action - mutateSameNeighborParams( - key: T, - value: SameNeighbor[T] - ) { - this.sameNeighborParams[key] = value; - } - - @action - validateSameNeighborParams(key: T) { - const value = this.sameNeighborParams[key]; - - switch (key) { - case 'vertex': - if (isEmpty(value)) { - this.validateSameNeighborParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.same-neighbor.validations.no-empty' - ); - - return; - } - - if (value === this.sameNeighborParams.other) { - this.validateSameNeighborParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.same-neighbor.validations.no-same-value-with-other' - ); - - return; - } - - break; - case 'other': - if (isEmpty(value)) { - this.validateSameNeighborParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.same-neighbor.validations.no-empty' - ); - - return; - } - - if (value === this.sameNeighborParams.vertex) { - this.validateSameNeighborParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.same-neighbor.validations.no-same-value-with-vertex' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value)) { - this.validateSameNeighborParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.same-neighbor.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'limit': - if (!isGtNegativeOneButZero(value)) { - this.validateSameNeighborParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.same-neighbor.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateSameNeighborParamsErrorMessage[key] = ''; - } - - @action - resetSameNeighborParams() { - this.sameNeighborParams = createSameNeighborDefaultParams(); - this.validateSameNeighborParamsErrorMessage = createValidateSameNeighborParamsErrorMessage(); - } - - @action - mutateWeightedShortestPathParams( - key: T, - value: WeightedShortestPath[T] - ) { - this.weightedShortestPathParams[key] = value; - } - - @action - validateWeightedShortestPathParams( - key: T - ) { - const value = this.weightedShortestPathParams[key]; - - switch (key) { - case 'source': - case 'target': - if (isEmpty(value)) { - this.validateWeightedShortestPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.weighted-shortest-path.validations.no-empty' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value as string)) { - this.validateWeightedShortestPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.weighted-shortest-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'skip_degree': - if (value !== '' && !isInt(value as string, { min: 0 })) { - this.validateWeightedShortestPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.weighted-shortest-path.validations.integer-only' - ); - - return; - } - - break; - case 'capacity': - if (!isGtNegativeOneButZero(value as string)) { - this.validateWeightedShortestPathParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.weighted-shortest-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateWeightedShortestPathParamsErrorMessage[key] = ''; - } - - @action - resetWeightedShortestPathParams() { - this.weightedShortestPathParams = createWeightedShortestPathDefaultParams(); - this.validateWeightedShortestPathParamsErrorMessage = createValidateWeightedShortestPathParamsErrorMessage(); - } - - @action - mutateSingleSourceWeightedShortestPathParams< - T extends keyof SingleSourceWeightedShortestPath - >(key: T, value: SingleSourceWeightedShortestPath[T]) { - this.singleSourceWeightedShortestPathParams[key] = value; - } - - @action - validateSingleSourceWeightedShortestPathParams< - T extends keyof SingleSourceWeightedShortestPath - >(key: T) { - const value = this.singleSourceWeightedShortestPathParams[key]; - - switch (key) { - case 'source': - if (isEmpty(value)) { - this.validateSingleSourceWeightedShortestPathParamsErrorMessage[ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.validations.no-empty' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value as string)) { - this.validateSingleSourceWeightedShortestPathParamsErrorMessage[ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'skip_degree': - if (value !== '' && !isInt(value as string, { min: 0 })) { - this.validateSingleSourceWeightedShortestPathParamsErrorMessage[ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.validations.integer-only' - ); - - return; - } - - break; - case 'capacity': - if (!isGtNegativeOneButZero(value as string)) { - this.validateSingleSourceWeightedShortestPathParamsErrorMessage[ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'limit': - if (!isGtNegativeOneButZero(value as string)) { - this.validateSingleSourceWeightedShortestPathParamsErrorMessage[ - key - ] = i18next.t( - 'data-analyze.algorithm-forms.single-source-weighted-shortest-path.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateSingleSourceWeightedShortestPathParamsErrorMessage[key] = ''; - } - - @action - resetSingleSourceWeightedShortestPathParams() { - this.singleSourceWeightedShortestPathParams = createSingleSourceWeightedShortestPathDefaultParams(); - this.validateSingleSourceWeightedShortestPathParamsErrorMessage = createValidateSingleSourceWeightedShortestPathParamsErrorMessage(); - } - - @action - mutateJaccardParams(key: T, value: Jaccard[T]) { - this.jaccardParams[key] = value; - } - - @action - validateJaccardParams(key: T) { - const value = this.jaccardParams[key]; - - switch (key) { - case 'vertex': - if (isEmpty(value)) { - this.validateJaccardParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.jaccard.validations.no-empty' - ); - - return; - } - - if (value === this.jaccardParams.other) { - this.validateJaccardParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.jaccard.validations.no-same-value-with-other' - ); - - return; - } - - break; - case 'other': - if (isEmpty(value)) { - this.validateJaccardParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.jaccard.validations.no-empty' - ); - - return; - } - - if (value === this.jaccardParams.vertex) { - this.validateJaccardParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.jaccard.validations.no-same-value-with-vertex' - ); - - return; - } - - break; - case 'max_degree': - if (!isGtNegativeOneButZero(value)) { - this.validateJaccardParamsErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.jaccard.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validateJaccardParamsErrorMessage[key] = ''; - } - - @action - resetJaccardParams() { - this.jaccardParams = createJaccardDefaultParams(); - this.validateJaccardParamsErrorMessage = createValidateJaccardParamsErrorMessage(); - } - - @action - mutatePersonalRankParams( - key: T, - value: PersonalRank[T] - ) { - this.personalRankParams[key] = value; - } - - @action - validatePersonalRankParams(key: T) { - const value = this.personalRankParams[key]; - - switch (key) { - case 'source': - if (isEmpty(value)) { - this.validatePersonalRankErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.personal-rank.validations.no-empty' - ); - - return; - } - - break; - case 'alpha': - if (isEmpty(value)) { - this.validatePersonalRankErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.personal-rank.validations.no-empty' - ); - - return; - } - - if ( - Object.is(Number(value), NaN) || - Number(value) > 1 || - Number(value) <= 0 - ) { - this.validatePersonalRankErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.personal-rank.validations.alpha-range' - ); - - return; - } - - break; - case 'max_depth': - if (isEmpty(value)) { - this.validatePersonalRankErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.personal-rank.validations.no-empty' - ); - - return; - } - - if ( - Object.is(Number(value), NaN) || - Number(value) > 50 || - Number(value) <= 0 - ) { - this.validatePersonalRankErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.personal-rank.validations.depth-range' - ); - - return; - } - - break; - case 'degree': - if (!isGtNegativeOneButZero(value as string)) { - this.validatePersonalRankErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.personal-rank.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - case 'limit': - if (!isGtNegativeOneButZero(value as string)) { - this.validatePersonalRankErrorMessage[key] = i18next.t( - 'data-analyze.algorithm-forms.personal-rank.validations.positive-integer-or-negative-one-only' - ); - - return; - } - - break; - } - - this.validatePersonalRankErrorMessage[key] = ''; - } - - @action - resetPersonalRankParams() { - this.personalRankParams = createPersonalRankDefaultParams(); - this.validatePersonalRankErrorMessage = createValidatePersonalRankParamsErrorMessage(); - } - - @action - dispose() { - this.requestStatus = initializeRequestStatus(); - this.errorInfo = initializeErrorInfo(); - this.currentAlgorithm = ''; - - this.resetLoopDetectionParams(); - this.resetFocusDetectionParams(); - this.resetShortestPathParams(); - this.resetShortestPathAllParams(); - this.resetAllPathParams(); - this.resetModelSimilarityParams(); - this.resetNeighborRankParams(); - this.resetKStepNeighborParams(); - this.resetKHopParams(); - this.resetCustomPathParams(); - this.resetRadiographicInspectionParams(); - this.resetSameNeighborParams(); - this.resetWeightedShortestPathParams(); - this.resetSingleSourceWeightedShortestPathParams(); - this.resetJaccardParams(); - this.resetPersonalRankParams(); - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore.ts deleted file mode 100644 index 763723830..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore.ts +++ /dev/null @@ -1,2538 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { createContext } from 'react'; -import { observable, action, flow, computed, runInAction } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; -import { - isUndefined, - cloneDeep, - isEmpty, - remove, - size, - fromPairs, - invert, - flatten, - uniq -} from 'lodash-es'; -import vis from 'vis-network'; -import isInt from 'validator/lib/isInt'; -import isUUID from 'validator/lib/isUUID'; -import i18next from '../../../i18n'; - -import { AlgorithmAnalyzerStore } from './algorithmAnalyzerStore'; -import { - initalizeErrorInfo, - initalizeRequestStatus, - createGraphNode, - createGraphEdge, - createGraphEditableProperties, - createNewGraphDataConfig -} from '../../factory/dataAnalyzeStore/dataAnalyzeStore'; -import { Algorithm } from '../../factory/dataAnalyzeStore/algorithmStore'; -import { - checkIfLocalNetworkOffline, - convertArrayToString, - validateGraphProperty, - vertexRadiusMapping, - edgeWidthMapping -} from '../../utils'; - -import { baseUrl, responseData, dict } from '../../types/common'; -import type { - GraphData, - GraphDataResponse -} from '../../types/GraphManagementStore/graphManagementStore'; -import type { - ColorSchemas, - RuleMap, - FetchColorSchemas, - FetchFilteredPropertyOptions, - NewGraphData, - GraphNode, - GraphEdge, - GraphView, - FetchGraphResponse, - ValueTypes, - AddQueryCollectionParams, - ExecutionLogs, - ExecutionLogsResponse, - FavoriteQuery, - FavoriteQueryResponse, - EditableProperties, - ShortestPathAlgorithmParams, - LoopDetectionParams, - FocusDetectionParams, - ShortestPathAllAlgorithmParams, - AllPathAlgorithmParams, - ModelSimilarityParams, - NeighborRankParams, - NeighborRankRule, - KHop, - RadiographicInspection, - SameNeighbor, - WeightedShortestPath, - SingleSourceWeightedShortestPath, - Jaccard, - PersonalRank, - CustomPathRule, - KStepNeighbor -} from '../../types/GraphManagementStore/dataAnalyzeStore'; -import type { - VertexTypeListResponse, - VertexType, - EdgeType, - MetadataPropertyIndex -} from '../../types/GraphManagementStore/metadataConfigsStore'; -import type { EdgeTypeListResponse } from '../../types/GraphManagementStore/metadataConfigsStore'; -import { - AlgorithmInternalNameMapping, - removeLabelKey, - filterEmptyAlgorightmParams -} from '../../../utils'; - -const ruleMap: RuleMap = { - 大于: 'gt', - 大于等于: 'gte', - 等于: 'eq', - 小于: 'lt', - 小于等于: 'lte', - True: 'eq', - False: 'eq' -}; - -const monthMaps: Record = { - Jan: '01', - Feb: '02', - Mar: '03', - Apr: '04', - May: '05', - Jun: '06', - Jul: '07', - Aug: '08', - Sep: '09', - Oct: '10', - Nov: '11', - Dec: '12' -}; - -export class DataAnalyzeStore { - [key: string]: any; - algorithmAnalyzerStore: AlgorithmAnalyzerStore; - - constructor() { - this.algorithmAnalyzerStore = new AlgorithmAnalyzerStore(this); - } - - @observable currentId: number | null = null; - @observable currentTab = 'gremlin-analyze'; - @observable searchText = ''; - @observable isSidebarExpanded = false; - @observable isLoadingGraph = false; - @observable isGraphLoaded = false; - @observable isFullScreenReuslt = false; - @observable isShowFilterBoard = false; - // right-side drawer - @observable isShowGraphInfo = false; - @observable isClickOnNodeOrEdge = false; - // v1.5.0: gremlin query mode - @observable queryMode: 'query' | 'task' = 'query'; - @observable favoritePopUp = ''; - // whether user selects vertex or edge - @observable graphInfoDataSet = ''; - @observable codeEditorInstance: CodeMirror.Editor | null = null; - @observable codeEditorText = ''; - @observable dynamicAddGraphDataStatus = ''; - @observable favoriteQueriesSortOrder: Record< - 'time' | 'name', - 'desc' | 'asc' | '' - > = { - time: '', - name: '' - }; - - // vis instance - @observable.ref visNetwork: vis.Network | null = null; - @observable.ref visDataSet: Record<'nodes' | 'edges', any> | null = null; - @observable.ref visCurrentCoordinates = { - domX: '', - domY: '', - canvasX: '', - canvasY: '' - }; - - // Mutate this variable to let mobx#reaction fires it's callback and set value for CodeEditor - @observable pulse = false; - - // datas - @observable.ref idList: { id: number; name: string }[] = []; - @observable.ref properties: ValueTypes[] = []; - @observable.ref valueTypes: Record = {}; - @observable.ref vertexTypes: VertexType[] = []; - @observable.ref edgeTypes: EdgeType[] = []; - @observable.ref propertyIndexes: MetadataPropertyIndex[] = []; - @observable.ref colorSchemas: ColorSchemas = {}; - @observable.ref colorList: string[] = []; - @observable.ref colorMappings: Record = {}; - @observable.ref vertexSizeMappings: Record = {}; - @observable.ref vertexWritingMappings: Record = {}; - @observable.ref edgeColorMappings: Record = {}; - @observable.ref edgeWithArrowMappings: Record = {}; - @observable.ref edgeThicknessMappings: Record = {}; - @observable.ref edgeWritingMappings: Record = {}; - @observable.ref - originalGraphData: FetchGraphResponse = {} as FetchGraphResponse; - @observable.ref - graphData: FetchGraphResponse = {} as FetchGraphResponse; - @observable.ref - expandedGraphData: FetchGraphResponse = {} as FetchGraphResponse; - @observable.ref - relatedGraphEdges: string[] = []; - @observable vertexCollection = new Set(); - @observable edgeCollection = new Set(); - @observable.ref executionLogData: ExecutionLogs[] = []; - @observable.ref favoriteQueryData: FavoriteQuery[] = []; - @observable.ref graphDataEdgeTypes: string[] = []; - @observable.ref filteredPropertyOptions: string[] = []; - - // data struct sync to GraphManagementStore - @observable.shallow isSearched = { - status: false, - value: '' - }; - - @observable filteredGraphQueryOptions = { - line: { - type: '', - direction: 'BOTH' - } as Record<'type' | 'direction', string>, - properties: [] as dict[] - }; - - @observable - newGraphNodeConfigs: NewGraphData = createNewGraphDataConfig(); - @observable - newGraphEdgeConfigs: NewGraphData = createNewGraphDataConfig(); - @observable selectedGraphData: GraphNode = createGraphNode(); - @observable - editedSelectedGraphDataProperties = createGraphEditableProperties(); - @observable selectedGraphLinkData: GraphEdge = createGraphEdge(); - // @observable - // editedSelectedGraphEdgeProperties = createGraphEditableProperties(); - @observable.ref rightClickedGraphData: GraphNode = createGraphNode(); - - @observable pageConfigs: { - [key: string]: { - pageNumber: number; - pageTotal: number; - pageSize?: number; - }; - } = { - tableResult: { - pageNumber: 1, - pageTotal: 0 - }, - executionLog: { - pageNumber: 1, - pageSize: 10, - pageTotal: 0 - }, - favoriteQueries: { - pageNumber: 1, - pageSize: 10, - pageTotal: 0 - } - }; - - @observable.shallow requestStatus = initalizeRequestStatus(); - @observable errorInfo = initalizeErrorInfo(); - - @computed get allPropertiesFromEdge() { - return uniq( - flatten( - this.edgeTypes.map(({ properties }) => - properties.map(({ name }) => name) - ) - ) - ); - } - - @computed get graphNodes(): GraphNode[] { - return this.originalGraphData.data.graph_view.vertices.map( - ({ id, label, properties }) => { - // if user create new node or edge in query statement - // rather in schema manager, there's no style in default - const joinedLabel = !isUndefined(this.vertexWritingMappings[label]) - ? this.vertexWritingMappings[label] - .map((field) => (field === '~id' ? id : properties[field])) - .filter((label) => label !== undefined && label !== null) - .join('-') - : id; - - return { - id, - label: - size(joinedLabel) <= 15 - ? joinedLabel - : joinedLabel.slice(0, 15) + '...', - vLabel: label, - value: vertexRadiusMapping[this.vertexSizeMappings[label]], - font: { size: 16 }, - properties, - title: ` -
-
${i18next.t('addition.common.vertex-type')}:
-
${label}
-
-
-
${i18next.t('addition.common.vertex-id')}:
-
${id}
-
- ${Object.entries(properties) - .map(([key, value]) => { - return `
-
${key}:
-
${convertArrayToString(value)}
-
`; - }) - .join('')} - `, - color: { - background: this.colorMappings[label] || '#5c73e6', - border: this.colorMappings[label] || '#5c73e6', - highlight: { background: '#fb6a02', border: '#fb6a02' }, - hover: { background: '#ec3112', border: '#ec3112' } - }, - // reveal label when zoom to max - scaling: { - label: { - max: Infinity, - maxVisible: Infinity - } - }, - chosen: { - node( - values: any, - id: string, - selected: boolean, - hovering: boolean - ) { - if (hovering || selected) { - values.shadow = true; - values.shadowColor = 'rgba(0, 0, 0, 0.6)'; - values.shadowX = 0; - values.shadowY = 0; - values.shadowSize = 25; - } - - if (selected) { - values.size += 5; - } - } - } - }; - } - ); - } - - @computed get graphEdges(): GraphEdge[] { - return this.originalGraphData.data.graph_view.edges.map( - ({ id, label, source, target, properties }) => { - // if user create new node or edge in query statement - // rather in schema manager, there's no style in default - const joinedLabel = !isUndefined(this.edgeWritingMappings[label]) - ? this.edgeWritingMappings[label] - .map((field) => (field === '~id' ? label : properties[field])) - .join('-') - : label; - - return { - id, - label: - joinedLabel.length <= 15 - ? joinedLabel - : joinedLabel.slice(0, 15) + '...', - properties, - source, - target, - from: source, - to: target, - font: { - size: 16, - strokeWidth: 0, - color: '#666' - }, - arrows: this.edgeWithArrowMappings[label] ? 'to' : '', - color: this.edgeColorMappings[label], - value: edgeWidthMapping[this.edgeThicknessMappings[label]], - title: ` -
-
${i18next.t('addition.common.edge-type')}:
-
${label}
-
-
-
${i18next.t('addition.common.edge-id')}:
-
${id}
-
- ${Object.entries(properties) - .map(([key, value]) => { - return `
-
${key}:
-
${convertArrayToString(value)}
-
`; - }) - .join('')} - ` - }; - } - ); - } - - @action - setCurrentId(id: number) { - this.currentId = id; - } - - @action - setCurrentTab(tab: string) { - this.currentTab = tab; - } - - @action - switchGraphLoaded(flag: boolean) { - this.isGraphLoaded = flag; - } - - @action - setFullScreenReuslt(flag: boolean) { - this.isFullScreenReuslt = flag; - } - - @action - setQueryMode(mode: 'query' | 'task') { - this.queryMode = mode; - } - - @action - setDynamicAddGraphDataStatus(status: string) { - this.dynamicAddGraphDataStatus = status; - } - - @action - setNewGraphDataConfig( - type: 'vertex' | 'edge', - key: T, - value: NewGraphData[T] - ) { - if (type === 'vertex') { - this.newGraphNodeConfigs[key] = value; - } else { - this.newGraphEdgeConfigs[key] = value; - } - } - - @action - setNewGraphDataConfigProperties( - type: 'vertex' | 'edge', - nullable: 'nullable' | 'nonNullable', - key: string, - value: string - ) { - if (type === 'vertex') { - if (nullable === 'nullable') { - this.newGraphNodeConfigs.properties.nullable.set(key, value); - } else { - this.newGraphNodeConfigs.properties.nonNullable.set(key, value); - } - } else { - if (nullable === 'nullable') { - this.newGraphEdgeConfigs.properties.nullable.set(key, value); - } else { - this.newGraphEdgeConfigs.properties.nonNullable.set(key, value); - } - } - } - - @action - syncNewGraphDataProperties(type: 'vertex' | 'edge') { - const config = - type === 'vertex' ? this.newGraphNodeConfigs : this.newGraphEdgeConfigs; - config.properties.nonNullable.clear(); - config.properties.nullable.clear(); - - const selectedLabel = - type === 'vertex' - ? this.vertexTypes.find(({ name }) => name === config.label) - : this.edgeTypes.find(({ name }) => name === config.label); - - if (!isUndefined(selectedLabel)) { - const nonNullableProperties = selectedLabel.properties.filter( - ({ nullable }) => !nullable - ); - - nonNullableProperties.forEach(({ name }) => { - config.properties.nonNullable.set(name, ''); - }); - - const nullableProperties = selectedLabel.properties.filter( - ({ nullable }) => nullable - ); - - nullableProperties.forEach(({ name }) => { - config.properties.nullable.set(name, ''); - }); - } - } - - @action - syncGraphEditableProperties(type: 'vertex' | 'edge') { - Object.values(this.editedSelectedGraphDataProperties).forEach( - (property) => { - property.clear(); - } - ); - - const selectedLabel = - type === 'vertex' - ? this.vertexTypes.find( - ({ name }) => name === this.selectedGraphData.label - ) - : this.edgeTypes.find( - ({ name }) => name === this.selectedGraphLinkData.label - ); - - if (!isUndefined(selectedLabel)) { - const selectedGraphData = - type === 'vertex' ? this.selectedGraphData : this.selectedGraphLinkData; - const selectedGraphDataPropertKeys = Object.keys( - type === 'vertex' - ? this.selectedGraphData.properties - : this.selectedGraphLinkData.properties - ); - - // to keep sort of primary keys, need to iter it first - if (type === 'vertex') { - (selectedLabel as VertexType).primary_keys.forEach((name) => { - if (selectedGraphDataPropertKeys.includes(name)) { - this.editedSelectedGraphDataProperties.primary.set( - name, - convertArrayToString(selectedGraphData.properties[name]) - ); - - remove(selectedGraphDataPropertKeys, (key) => key === name); - } - }); - } else { - (selectedLabel as EdgeType).sort_keys.forEach((name) => { - if (selectedGraphDataPropertKeys.includes(name)) { - this.editedSelectedGraphDataProperties.primary.set( - name, - convertArrayToString(selectedGraphData.properties[name]) - ); - - remove(selectedGraphDataPropertKeys, (key) => key === name); - } - }); - } - - selectedLabel.properties - .filter(({ nullable }) => !nullable) - .forEach(({ name }) => { - if (selectedGraphDataPropertKeys.includes(name)) { - this.editedSelectedGraphDataProperties.nonNullable.set( - name, - convertArrayToString(selectedGraphData.properties[name]) - ); - } - - remove(selectedGraphDataPropertKeys, (key) => key === name); - }); - - selectedLabel.properties - .filter(({ nullable }) => nullable) - .forEach(({ name }) => { - if (selectedGraphDataPropertKeys.includes(name)) { - this.editedSelectedGraphDataProperties.nullable.set( - name, - convertArrayToString(selectedGraphData.properties[name]) - ); - } - }); - } - } - - @action - resetNewGraphData(type: 'vertex' | 'edge') { - if (type === 'vertex') { - this.newGraphNodeConfigs = createNewGraphDataConfig(); - } else { - this.newGraphEdgeConfigs = createNewGraphDataConfig(); - } - } - - @action - setVisNetwork(visNetwork: vis.Network) { - this.visNetwork = visNetwork; - } - - @action - setVisDataSet(visDataSet: Record<'nodes' | 'edges', any>) { - this.visDataSet = visDataSet; - } - - @action - setVisCurrentCoordinates(coordinates: { - domX: string; - domY: string; - canvasX: string; - canvasY: string; - }) { - this.visCurrentCoordinates = coordinates; - } - - @action - mutateSearchText(text: string) { - this.searchText = text; - } - - @action - switchShowScreenInfo(flag: boolean) { - this.isShowGraphInfo = flag; - } - - @action - switchClickOnNodeOrEdge(flag: boolean) { - this.isClickOnNodeOrEdge = flag; - } - - @action - switchShowFilterBoard(flag: boolean) { - this.isShowFilterBoard = flag; - } - - @action - switchShowScreeDataSet(dataSet: string) { - this.graphInfoDataSet = dataSet; - } - - @action - setFavoritePopUp(popupCategory: string) { - this.favoritePopUp = popupCategory; - } - - @action - triggerLoadingStatementsIntoEditor() { - this.pulse = !this.pulse; - } - - @action - assignCodeEditorInstance(instance: CodeMirror.Editor) { - this.codeEditorInstance = instance; - } - - @action - mutateCodeEditorText(text: string) { - this.codeEditorText = text; - } - - // change selected graph node - @action - changeSelectedGraphData(selectedData: GraphNode) { - this.selectedGraphData = selectedData; - } - - // change selected graph edge - @action - changeSelectedGraphLinkData(selectedLinkData: GraphEdge) { - this.selectedGraphLinkData = selectedLinkData; - } - - @action - changeRightClickedGraphData(rightClickedData: GraphNode) { - this.rightClickedGraphData = rightClickedData; - } - - @action - mutatePageNumber(category: string, pageNumber: number) { - this.pageConfigs[category].pageNumber = pageNumber; - } - - @action - mutatePageSize(category: string, pageSize: number) { - this.pageConfigs[category].pageSize = pageSize; - } - - @action - editEdgeFilterOption(key: 'type' | 'direction', value: string) { - this.filteredGraphQueryOptions.line[key] = value; - } - - @action - addPropertyFilterOption() { - this.filteredGraphQueryOptions.properties.push({ - property: '', - rule: '', - value: '' - }); - } - - @action - editPropertyFilterOption( - key: 'property' | 'rule' | 'value', - value: string | number, - index: number - ) { - this.filteredGraphQueryOptions.properties[index][key] = value; - } - - @action - deletePropertyFilterOption(index: number) { - this.filteredGraphQueryOptions.properties.splice(index, 1); - } - - @action - addTempExecLog() { - const date = new Date(); - const [week, month, day, year, time] = date.toString().split(' '); - const timeString = `${year}-${monthMaps[month]}-${day} ${time}`; - - const tempData: ExecutionLogs = { - id: NaN, - async_id: NaN, - algorithm_name: - this.currentTab === 'algorithm-analyze' - ? invert(AlgorithmInternalNameMapping)[ - this.algorithmAnalyzerStore.currentAlgorithm - ] - : '', - async_status: 'UNKNOWN', - type: - this.currentTab === 'algorithm-analyze' - ? 'ALGORITHM' - : this.queryMode === 'query' - ? 'GREMLIN' - : 'GREMLIN_ASYNC', - content: - this.currentTab === 'algorithm-analyze' - ? JSON.stringify(this.algorithmAnalyzerStore.currentAlgorithmParams) - : this.codeEditorText, - status: 'RUNNING', - duration: '0ms', - create_time: timeString - }; - - this.executionLogData = [tempData].concat( - this.executionLogData.slice(0, 9) - ); - - return window.setInterval(() => { - this.executionLogData[0].duration = - String(Number(this.executionLogData[0].duration.split('ms')[0]) + 10) + - 'ms'; - - runInAction(() => { - this.executionLogData = this.executionLogData.slice(); - }); - }, 10); - } - - @action - swtichIsSearchedStatus(isSearched: boolean) { - this.isSearched.status = isSearched; - - isSearched - ? (this.isSearched.value = this.searchText) - : (this.isSearched.value = ''); - } - - @action - changeFavoriteQueriesSortOrder( - key: 'time' | 'name', - order: 'desc' | 'asc' | '' - ) { - this.favoriteQueriesSortOrder[key] = order; - } - - @action - clearFilteredGraphQueryOptions() { - this.filteredGraphQueryOptions = { - line: { - type: '', - direction: 'BOTH' - } as Record<'type' | 'direction', string>, - properties: [] as dict[] - }; - } - - @observable - validateAddGraphNodeErrorMessage: NewGraphData | null = null; - @observable - validateAddGraphEdgeErrorMessage: NewGraphData | null = null; - @observable - validateEditableGraphDataPropertyErrorMessage: EditableProperties | null = null; - - @action - initValidateAddGraphDataErrorMessage(type: 'vertex' | 'edge') { - const config = - type === 'vertex' ? this.newGraphNodeConfigs : this.newGraphEdgeConfigs; - const nonNullable = new Map([...config.properties.nonNullable]); - const nullable = new Map([...config.properties.nullable]); - - if (type === 'vertex') { - this.validateAddGraphNodeErrorMessage = { - id: '', - label: '', - properties: { - nonNullable, - nullable - } - }; - } else { - this.validateAddGraphEdgeErrorMessage = { - id: '', - label: '', - properties: { - nonNullable, - nullable - } - }; - } - } - - @action - editGraphDataProperties( - nullable: 'nonNullable' | 'nullable', - key: string, - value: string - ) { - this.editedSelectedGraphDataProperties[nullable].set(key, value); - } - - @action - initValidateEditGraphDataPropertiesErrorMessage() { - this.validateEditableGraphDataPropertyErrorMessage = { - nonNullable: new Map(), - nullable: new Map() - }; - - this.editedSelectedGraphDataProperties.nonNullable.forEach((value, key) => { - this.validateEditableGraphDataPropertyErrorMessage!.nonNullable.set( - key, - '' - ); - }); - - this.editedSelectedGraphDataProperties.nullable.forEach((value, key) => { - this.validateEditableGraphDataPropertyErrorMessage!.nullable.set(key, ''); - }); - } - - @action - validateAddGraphNode( - idStrategy: string, - initial = false, - category?: 'id' | 'nonNullable' | 'nullable', - key?: string - ) { - if (category === 'id') { - if (idStrategy === 'CUSTOMIZE_STRING') { - this.validateAddGraphNodeErrorMessage!.id = - initial || !isEmpty(this.newGraphNodeConfigs.id) - ? '' - : i18next.t('addition.store.illegal-data-format'); - } - - if (idStrategy === 'CUSTOMIZE_NUMBER') { - this.validateAddGraphNodeErrorMessage!.id = - initial || isInt(this.newGraphNodeConfigs.id!) - ? '' - : i18next.t('addition.store.illegal-data-format'); - } - - if (idStrategy === 'CUSTOMIZE_UUID') { - this.validateAddGraphNodeErrorMessage!.id = - initial || isUUID(String(this.newGraphNodeConfigs.id), 4) - ? '' - : i18next.t('addition.store.illegal-data-format'); - } - } - - if (category === 'nonNullable') { - if ( - initial || - isEmpty(this.newGraphNodeConfigs.properties.nonNullable.get(key!)) - ) { - this.validateAddGraphNodeErrorMessage?.properties.nonNullable.set( - key!, - i18next.t('addition.store.cannot-be-empty') - ); - - return; - } - - if ( - initial || - !validateGraphProperty( - this.valueTypes[key!], - this.newGraphNodeConfigs.properties.nonNullable.get(key!)! - ) - ) { - this.validateAddGraphNodeErrorMessage?.properties.nonNullable.set( - key!, - i18next.t('addition.store.illegal-data-format') - ); - - return; - } - - this.validateAddGraphNodeErrorMessage?.properties.nonNullable.set( - key!, - '' - ); - } - - if (category === 'nullable') { - if ( - initial || - !validateGraphProperty( - this.valueTypes[key!], - this.newGraphNodeConfigs.properties.nullable.get(key!)!, - true - ) - ) { - this.validateAddGraphNodeErrorMessage?.properties.nullable.set( - key!, - i18next.t('addition.store.illegal-data-format') - ); - - return; - } - - this.validateAddGraphNodeErrorMessage?.properties.nullable.set(key!, ''); - } - } - - @action - validateAddGraphEdge( - category: 'id' | 'nonNullable' | 'nullable', - initial = false, - key?: string - ) { - if (category === 'id') { - this.validateAddGraphEdgeErrorMessage!.id = - initial || !isEmpty(this.newGraphEdgeConfigs.id) - ? '' - : i18next.t('addition.store.illegal-data-format'); - } - - if (category === 'nonNullable') { - if ( - initial || - isEmpty(this.newGraphEdgeConfigs.properties.nonNullable.get(key!)) - ) { - this.validateAddGraphEdgeErrorMessage?.properties.nonNullable.set( - key!, - i18next.t('addition.store.cannot-be-empty') - ); - - return; - } - - if ( - initial || - !validateGraphProperty( - this.valueTypes[key!], - this.newGraphEdgeConfigs.properties.nonNullable.get(key!)! - ) - ) { - this.validateAddGraphEdgeErrorMessage?.properties.nonNullable.set( - key!, - i18next.t('addition.store.illegal-data-format') - ); - - return; - } - - this.validateAddGraphEdgeErrorMessage?.properties.nonNullable.set( - key!, - '' - ); - } - - if (category === 'nullable') { - if ( - initial || - !validateGraphProperty( - this.valueTypes[key!], - this.newGraphEdgeConfigs.properties.nullable.get(key!)!, - true - ) - ) { - this.validateAddGraphEdgeErrorMessage?.properties.nullable.set( - key!, - i18next.t('addition.store.illegal-data-format') - ); - - return; - } - - this.validateAddGraphEdgeErrorMessage?.properties.nullable.set(key!, ''); - } - } - - @action - validateGraphDataEditableProperties( - type: 'nonNullable' | 'nullable', - key: string - ) { - if (type === 'nonNullable') { - if ( - isEmpty(this.editedSelectedGraphDataProperties?.nonNullable.get(key)) - ) { - this.validateEditableGraphDataPropertyErrorMessage?.nonNullable.set( - key, - i18next.t('addition.store.cannot-be-empty') - ); - - return; - } - - if ( - !validateGraphProperty( - this.valueTypes[key!], - this.editedSelectedGraphDataProperties?.nonNullable.get(key) - ) - ) { - this.validateEditableGraphDataPropertyErrorMessage?.nonNullable.set( - key, - i18next.t('addition.store.illegal-data-format') - ); - - return; - } - - this.validateEditableGraphDataPropertyErrorMessage?.nonNullable.set( - key, - '' - ); - } - - if (type === 'nullable') { - if ( - !validateGraphProperty( - this.valueTypes[key!], - this.editedSelectedGraphDataProperties?.nullable.get(key), - true - ) - ) { - this.validateEditableGraphDataPropertyErrorMessage?.nullable.set( - key, - i18next.t('addition.store.illegal-data-format') - ); - - return; - } - - this.validateEditableGraphDataPropertyErrorMessage?.nullable.set(key, ''); - } - } - - @action - resetRightClickedGraphData() { - this.rightClickedGraphData = { - id: '', - label: '', - properties: {} - }; - } - - @action - resetFavoriteRequestStatus(type: 'add' | 'edit') { - if (type === 'add') { - this.requestStatus.addQueryCollection = 'standby'; - this.errorInfo.addQueryCollection.code = NaN; - this.errorInfo.addQueryCollection.message = ''; - } - - if (type === 'edit') { - this.requestStatus.editQueryCollection = 'standby'; - this.errorInfo.editQueryCollection.code = NaN; - this.errorInfo.editQueryCollection.message = ''; - } - } - - @action - resetSwitchTabState() { - this.isLoadingGraph = false; - this.isGraphLoaded = false; - this.isShowGraphInfo = false; - this.isClickOnNodeOrEdge = false; - this.queryMode = 'query'; - this.dynamicAddGraphDataStatus = ''; - this.graphData = {} as FetchGraphResponse; - - this.visNetwork = null; - this.visDataSet = null; - this.visCurrentCoordinates = { - domX: '', - domY: '', - canvasX: '', - canvasY: '' - }; - - this.selectedGraphData = createGraphNode(); - this.selectedGraphLinkData = createGraphEdge(); - - this.pageConfigs.tableResult = { - pageNumber: 1, - pageTotal: 0 - }; - - this.requestStatus.fetchGraphs = 'standby'; - this.requestStatus.createAsyncTask = 'standby'; - this.errorInfo.fetchGraphs = { - code: NaN, - message: '' - }; - this.errorInfo.createAsyncTask = { - code: NaN, - message: '' - }; - - this.clearFilteredGraphQueryOptions(); - } - - @action - resetIdState() { - this.currentId = null; - this.currentTab = 'gremlin-analyze'; - this.searchText = ''; - this.isSidebarExpanded = false; - this.isLoadingGraph = false; - this.isGraphLoaded = false; - this.isShowGraphInfo = false; - this.isFullScreenReuslt = false; - this.isClickOnNodeOrEdge = false; - this.queryMode = 'query'; - this.codeEditorInstance = null; - this.codeEditorText = ''; - this.dynamicAddGraphDataStatus = ''; - this.graphData = {} as FetchGraphResponse; - - this.visNetwork = null; - this.visDataSet = null; - this.visCurrentCoordinates = { - domX: '', - domY: '', - canvasX: '', - canvasY: '' - }; - - this.properties = []; - - this.isSearched = { - status: false, - value: '' - }; - - this.selectedGraphData = createGraphNode(); - this.selectedGraphLinkData = createGraphEdge(); - - this.pageConfigs = { - tableResult: { - pageNumber: 1, - pageTotal: 0 - }, - executionLog: { - pageNumber: 1, - pageSize: 10, - pageTotal: 0 - }, - favoriteQueries: { - pageNumber: 1, - pageSize: 10, - pageTotal: 0 - } - }; - - this.requestStatus = initalizeRequestStatus(); - this.errorInfo = initalizeErrorInfo(); - this.clearFilteredGraphQueryOptions(); - } - - @action - dispose() { - this.resetIdState(); - this.vertexTypes = []; - this.edgeTypes = []; - this.idList = []; - } - - fetchIdList = flow(function* fetchIdList(this: DataAnalyzeStore) { - this.requestStatus.fetchIdList = 'pending'; - - try { - const result: AxiosResponse = yield axios.get< - GraphData - >(baseUrl, { - params: { - page_size: -1 - } - }); - - if (result.data.status !== 200) { - this.errorInfo.fetchIdList.code = result.data.status; - throw new Error(result.data.message); - } - - this.idList = result.data.data.records.map(({ id, name }) => ({ - id, - name - })); - this.requestStatus.fetchIdList = 'success'; - } catch (error) { - this.requestStatus.fetchIdList = 'failed'; - this.errorInfo.fetchIdList.message = error.message; - console.error(error.message); - } - }); - - // to know the type of properties - fetchValueTypes = flow(function* fetchValueTypes(this: DataAnalyzeStore) { - this.requestStatus.fetchValueTypes = 'pending'; - - try { - const result = yield axios.get( - `${baseUrl}/${this.currentId}/schema/propertykeys`, - { - params: { - page_size: -1 - } - } - ); - - if (result.data.status !== 200) { - this.errorInfo.fetchValueTypes.code = result.data.status; - throw new Error(result.data.message); - } - - this.properties = result.data.data.records; - - result.data.data.records.forEach( - ({ name, data_type }: Record) => { - this.valueTypes[name] = data_type; - } - ); - - this.requestStatus.fetchValueTypes = 'success'; - } catch (error) { - this.requestStatus.fetchValueTypes = 'failed'; - this.errorInfo.fetchValueTypes.message = error.message; - console.error(error.message); - } - }); - - fetchVertexTypes = flow(function* fetchVertexTypeList( - this: DataAnalyzeStore - ) { - this.requestStatus.fetchVertexTypeList = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .get>( - `${baseUrl}/${this.currentId}/schema/vertexlabels`, - { - params: { - page_size: -1 - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchVertexTypeList.code = result.data.status; - throw new Error(result.data.message); - } - - this.vertexTypes = result.data.data.records; - this.requestStatus.fetchVertexTypeList = 'success'; - } catch (error) { - this.requestStatus.fetchVertexTypeList = 'failed'; - this.errorInfo.fetchVertexTypeList.message = error.message; - } - }); - - fetchColorSchemas = flow(function* fetchColorSchemas(this: DataAnalyzeStore) { - this.requestStatus.fetchColorSchemas = 'pending'; - - try { - const result: AxiosResponse = yield axios.get< - FetchGraphResponse - >(`${baseUrl}/${this.currentId}/schema/vertexlabels/style`); - - if (result.data.status !== 200) { - this.errorInfo.fetchColorSchemas.code = result.data.status; - throw new Error(result.data.message); - } - - this.colorSchemas = result.data.data; - this.requestStatus.fetchColorSchemas = 'success'; - } catch (error) { - this.requestStatus.fetchColorSchemas = 'failed'; - this.errorInfo.fetchColorSchemas.message = error.message; - console.error(error.message); - } - }); - - fetchColorList = flow(function* fetchColorList(this: DataAnalyzeStore) { - this.requestStatus.fetchColorList = 'pending'; - - try { - const result: AxiosResponse> = yield axios.get( - `${baseUrl}/${this.currentId}/schema/vertexlabels/optional-colors` - ); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.colorList = result.data.data; - this.requestStatus.fetchColorList = 'success'; - } catch (error) { - this.requestStatus.fetchColorList = 'failed'; - this.errorMessage = error.message; - console.error(error.message); - } - }); - - fetchAllNodeStyle = flow(function* fetchAllNodeStyle(this: DataAnalyzeStore) { - this.requestStatus.fetchAllNodeStyle = 'pending'; - try { - const result: AxiosResponse> = yield axios.get(`${baseUrl}/${this.currentId}/schema/vertexlabels`, { - params: { - page_no: 1, - page_size: -1 - } - }); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - result.data.data.records.forEach(({ name, style }) => { - if (style.color !== null) { - this.colorMappings[name] = style.color; - } - if (style.size !== null) { - this.vertexSizeMappings[name] = style.size; - } - if (style.display_fields.length !== 0) { - this.vertexWritingMappings[name] = style.display_fields; - } - }); - - this.requestStatus.fetchAllNodeStyle = 'success'; - } catch (error) { - this.requestStatus.fetchAllNodeStyle = 'failed'; - this.errorInfo.fetchAllNodeStyle.message = error.message; - console.error(error.message); - } - }); - - fetchEdgeTypes = flow(function* fetchEdgeTypes(this: DataAnalyzeStore) { - this.requestStatus.fetchEdgeTypes = 'pending'; - - try { - const result: AxiosResponse> = yield axios.get(`${baseUrl}/${this.currentId}/schema/edgelabels`, { - params: { - page_no: 1, - page_size: -1 - } - }); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.edgeTypes = result.data.data.records; - this.requestStatus.fetchEdgeTypes = 'success'; - } catch (error) { - this.requestStatus.fetchEdgeTypes = 'failed'; - this.errorInfo.fetchEdgeTypes.message = error.message; - console.error(error.message); - } - }); - - fetchAllEdgeStyle = flow(function* fetchAllEdgeStyle(this: DataAnalyzeStore) { - this.requestStatus.fetchAllEdgeStyle = 'pending'; - - try { - const result: AxiosResponse> = yield axios.get(`${baseUrl}/${this.currentId}/schema/edgelabels`, { - params: { - page_no: 1, - page_size: -1 - } - }); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - result.data.data.records.forEach(({ name, style }) => { - if (style.color !== null) { - this.edgeColorMappings[name] = style.color; - } - if (style.with_arrow !== null) { - this.edgeWithArrowMappings[name] = style.with_arrow; - } - if (style.thickness !== null) { - this.edgeThicknessMappings[name] = style.thickness; - } - if (style.display_fields.length !== 0) { - this.edgeWritingMappings[name] = style.display_fields; - } - }); - - this.requestStatus.fetchAllEdgeStyle = 'success'; - } catch (error) { - this.requestStatus.fetchAllEdgeStyle = 'failed'; - this.errorInfo.fetchAllEdgeStyle.message = error.message; - console.error(error.message); - } - }); - - fetchAllPropertyIndexes = flow(function* fetchAllPropertyIndexes( - this: DataAnalyzeStore, - indexType: 'vertex' | 'edge' - ) { - this.requestStatus.fetchAllPropertyIndexes = 'pending'; - - try { - const result = yield axios - .get(`${baseUrl}/${this.currentId}/schema/propertyindexes`, { - params: { - page_size: -1, - is_vertex_label: indexType === 'vertex' - } - }) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.propertyIndexes = result.data.data.records; - this.requestStatus.fetchAllPropertyIndexes = 'success'; - } catch (error) { - this.requestStatus.fetchAllPropertyIndexes = 'failed'; - this.errorMessage = error.message; - } - }); - - fetchGraphs = flow(function* fetchGraphs( - this: DataAnalyzeStore, - algorithmConfigs?: { url: string; type: string } - ) { - // reset request status of create async task - this.requestStatus.createAsyncTask = 'standby'; - this.requestStatus.fetchGraphs = 'pending'; - this.isLoadingGraph = true; - - let params: object | null = null; - - if (!isUndefined(algorithmConfigs)) { - switch (algorithmConfigs.type) { - case Algorithm.loopDetection: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.loopDetectionParams, - ['max_degree', 'capacity', 'limit'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - case Algorithm.focusDetection: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.focusDetectionParams, - ['max_degree', 'capacity', 'limit'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - case Algorithm.shortestPath: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.shortestPathAlgorithmParams, - ['max_degree', 'capacity', 'skip_degree'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - - case Algorithm.shortestPathAll: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.shortestPathAllParams, - ['max_degree', 'capacity', 'skip_degree'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - - case Algorithm.allPath: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.allPathParams, - ['max_degree', 'capacity', 'limit'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - - case Algorithm.modelSimilarity: { - const { - source, - vertexType, - vertexProperty, - direction, - least_neighbor, - similarity, - label, - max_similar, - least_similar, - property_filter, - least_property_number, - max_degree, - capacity, - limit, - return_common_connection, - return_complete_info - } = this.algorithmAnalyzerStore.modelSimilarityParams; - - const sources: Record = {}; - - if (source !== '') { - sources.ids = source.split(','); - } else { - if (vertexType !== '') { - sources.label = vertexType; - } - - if (vertexProperty[0][0] !== '') { - const convertedVertexProperty = vertexProperty.map( - ([key, value]) => [key, value.split(',')] - ); - - sources.properties = fromPairs(convertedVertexProperty); - } - } - - const convertedParams = { - sources, - label, - direction, - min_neighbors: least_neighbor, - alpha: similarity, - min_similars: least_similar, - top: max_similar, - group_property: property_filter, - min_groups: least_property_number, - max_degree, - capacity, - limit, - with_intermediary: return_common_connection, - with_vertex: return_complete_info - }; - - if (label === '__all__') { - delete convertedParams.label; - } - - if (max_degree === '') { - delete convertedParams.max_degree; - } - - if (capacity === '') { - delete convertedParams.capacity; - } - - if (limit === '') { - delete convertedParams.limit; - } - - if (max_similar === '') { - delete convertedParams.top; - } - - if (least_similar === '') { - delete convertedParams.min_similars; - } - - if (convertedParams.group_property === '') { - delete convertedParams.group_property; - delete convertedParams.min_groups; - } - - // @ts-ignore - params = convertedParams; - break; - } - - case Algorithm.neighborRank: { - const clonedNeighborRankParams = cloneDeep( - this.algorithmAnalyzerStore.neighborRankParams - ); - - if (clonedNeighborRankParams.capacity === '') { - clonedNeighborRankParams.capacity = '10000000'; - } - - clonedNeighborRankParams.steps.forEach((step, index) => { - delete step.uuid; - const clonedStep = cloneDeep(step); - - if (step.labels[0] === '__all__') { - delete clonedStep.labels; - clonedNeighborRankParams.steps[index] = clonedStep; - } - - if (step.degree === '') { - clonedStep.degree = '10000'; - clonedNeighborRankParams.steps[index] = clonedStep; - } - - if (step.top === '') { - clonedStep.top = '100'; - clonedNeighborRankParams.steps[index] = clonedStep; - } - }); - - params = clonedNeighborRankParams; - break; - } - - case Algorithm.kStepNeighbor: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.kStepNeighborParams, - ['max_degree', 'limit'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - - case Algorithm.kHop: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.kHopParams, - ['max_degree', 'capacity', 'limit'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - - case Algorithm.customPath: { - const { - source, - vertexType, - vertexProperty, - sort_by, - capacity, - limit, - steps - } = this.algorithmAnalyzerStore.customPathParams; - - const sources: Record = {}; - - if (source !== '') { - sources.ids = source.split(','); - } else { - if (vertexType !== '') { - sources.label = vertexType; - } - - if (vertexProperty[0][0] !== '') { - const convertedVertexProperty = vertexProperty.map( - ([key, value]) => [key, value.split(',')] - ); - - sources.properties = fromPairs(convertedVertexProperty); - } - } - - const clonedCustomPathRules = cloneDeep(steps); - - clonedCustomPathRules.forEach((step, index) => { - delete step.uuid; - - if (isEmpty(step.labels)) { - delete step.labels; - } - - if (step.properties[0][0] !== '') { - // omit property types here - // @ts-ignore - step.properties = fromPairs( - step.properties.map(([key, value]) => [key, value.split(',')]) - ); - } else { - delete step.properties; - } - - if (isEmpty(step.degree)) { - delete step.degree; - } - - if (isEmpty(step.sample)) { - delete step.sample; - } - - if (step.weight_by === '__CUSTOM_WEIGHT__') { - delete step.weight_by; - } else { - delete step.default_weight; - } - - if (step.weight_by === '') { - delete step.weight_by; - } - }); - - const convertedParams: Record = { - sources, - sort_by, - steps: clonedCustomPathRules - }; - - if (!isEmpty(capacity)) { - convertedParams.capactiy = capacity; - } - - if (!isEmpty(limit)) { - convertedParams.limit = limit; - } - - // @ts-ignore - params = convertedParams; - break; - } - - case Algorithm.radiographicInspection: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.radiographicInspectionParams, - ['max_degree', 'capacity', 'limit'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - - case Algorithm.sameNeighbor: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.sameNeighborParams, - ['max_degree', 'limit'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - - case Algorithm.weightedShortestPath: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.weightedShortestPathParams, - ['max_degree', 'capacity', 'skip_degree'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - - case Algorithm.singleSourceWeightedShortestPath: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.singleSourceWeightedShortestPathParams, - ['max_degree', 'capacity', 'skip_degree', 'limit'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - - case Algorithm.jaccard: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.jaccardParams, - ['max_degree'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - - case Algorithm.personalRankRecommendation: { - const filterdObject = filterEmptyAlgorightmParams( - this.algorithmAnalyzerStore.personalRankParams, - ['degree', 'limit'] - ); - removeLabelKey(filterdObject); - params = filterdObject; - break; - } - } - } - - try { - let result: AxiosResponse; - - if (!isUndefined(algorithmConfigs)) { - result = yield axios - .post( - `${baseUrl}/${this.currentId}/algorithms/${algorithmConfigs.url}`, - { - ...params - } - ) - .catch(checkIfLocalNetworkOffline); - } else { - result = yield axios - .post( - `${baseUrl}/${this.currentId}/gremlin-query`, - { - content: this.codeEditorText - } - ) - .catch(checkIfLocalNetworkOffline); - } - - if (result.data.status !== 200) { - this.errorInfo.fetchGraphs.code = result.data.status; - throw new Error(result.data.message); - } - - // replace null with empty array when query result type is EMPTY - if (result.data.data.type === 'EMPTY') { - result.data.data.json_view.data = []; - result.data.data.table_view = { - header: ['result'], - rows: [] - }; - } - - this.originalGraphData = result.data; - - if ( - result.data.data.graph_view.vertices !== null && - result.data.data.graph_view.edges !== null - ) { - this.vertexCollection = new Set( - result.data.data.graph_view.vertices.map(({ id }) => id) - ); - this.edgeCollection = new Set( - result.data.data.graph_view.edges.map(({ id }) => id) - ); - } - - this.graphData = result.data; - this.pageConfigs.tableResult.pageTotal = this.originalGraphData.data.table_view.rows.length; - this.requestStatus.fetchGraphs = 'success'; - this.isLoadingGraph = false; - } catch (error) { - this.isLoadingGraph = false; - this.requestStatus.fetchGraphs = 'failed'; - this.errorInfo.fetchGraphs.message = error.message; - console.error(error.message); - } - }); - - createAsyncTask = flow(function* createAsyncTask(this: DataAnalyzeStore) { - // reset request status of fetch graphs - this.requestStatus.fetchGraphs = 'stanby'; - this.requestStatus.createAsyncTask = 'pending'; - - try { - const result: AxiosResponse = yield axios - .post( - `${baseUrl}/${this.currentId}/gremlin-query/async-task`, - { - content: this.codeEditorText - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.createAsyncTask.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.createAsyncTask = 'success'; - } catch (error) { - this.requestStatus.createAsyncTask = 'failed'; - this.errorInfo.createAsyncTask.message = error.message; - console.error(error.message); - } - }); - - addGraphNode = flow(function* addGraphNode(this: DataAnalyzeStore) { - this.requestStatus.addGraphNode = 'pending'; - - try { - const properties: Record = {}; - this.newGraphNodeConfigs.properties.nonNullable.forEach((value, key) => { - properties[key] = value; - }); - this.newGraphNodeConfigs.properties.nullable.forEach((value, key) => { - properties[key] = value; - }); - - const result: AxiosResponse> = yield axios.post( - `${baseUrl}/${this.currentId}/graph/vertex`, - { - id: this.newGraphNodeConfigs.id, - label: this.newGraphNodeConfigs.label, - properties - } - ); - - if (result.data.status !== 200) { - this.errorInfo.addGraphNode.code = result.data.status; - throw new Error(result.data.message); - } - - const mergedGraphData = cloneDeep(this.graphData); - mergedGraphData.data.graph_view.vertices.push( - ...result.data.data.vertices - ); - - this.graphData = mergedGraphData; - this.requestStatus.addGraphNode = 'success'; - - return result.data.data.vertices; - } catch (error) { - this.requestStatus.addGraphNode = 'failed'; - this.errorInfo.addGraphNode.message = error.message; - console.error(error.message); - } - }); - - fetchRelatedEdges = flow(function* fetchRelatedEdges(this: DataAnalyzeStore) { - this.requestStatus.fetchRelatedEdges = 'pending'; - try { - const result: AxiosResponse> = yield axios.get< - responseData - >( - `${baseUrl}/${this.currentId}/schema/vertexlabels/${this.rightClickedGraphData.label}/link` - ); - - if (result.data.status !== 200) { - this.errorInfo.fetchRelatedEdges.code = result.data.status; - throw new Error(result.data.message); - } - - this.relatedGraphEdges = result.data.data; - this.requestStatus.fetchRelatedEdges = 'success'; - } catch (error) { - this.requestStatus.fetchRelatedEdges = 'failed'; - this.errorInfo.fetchRelatedEdges.message = error.message; - console.error(error.message); - } - }); - - addGraphEdge = flow(function* addGraphEdge(this: DataAnalyzeStore) { - this.requestStatus.addGraphEdge = 'pending'; - - try { - const vertices = [ - this.rightClickedGraphData.id, - this.newGraphEdgeConfigs.id - ]; - - if (this.dynamicAddGraphDataStatus === 'inEdge') { - vertices.reverse(); - } - - const properties: Record = {}; - this.newGraphEdgeConfigs.properties.nonNullable.forEach((value, key) => { - properties[key] = value; - }); - this.newGraphEdgeConfigs.properties.nullable.forEach((value, key) => { - properties[key] = value; - }); - - const result: AxiosResponse> = yield axios.post( - `${baseUrl}/${this.currentId}/graph/edge`, - { - label: this.newGraphEdgeConfigs.label, - source: vertices[0], - target: vertices[1], - properties - } - ); - - if (result.data.status !== 200) { - this.errorInfo.addGraphEdge.code = result.data.status; - throw new Error(result.data.message); - } - - const mergedGraphData = cloneDeep(this.graphData); - const filteredVertices: GraphNode[] = []; - - result.data.data.vertices.forEach((vertex) => { - if (this.visDataSet!.nodes.get(vertex.id) === null) { - filteredVertices.push(vertex); - } - }); - - mergedGraphData.data.graph_view.vertices.push(...filteredVertices); - mergedGraphData.data.graph_view.edges.push(...result.data.data.edges); - - this.graphData = mergedGraphData; - this.requestStatus.addGraphEdge = 'success'; - - return { - originalVertices: result.data.data.vertices, - vertices: filteredVertices, - edges: result.data.data.edges - }; - } catch (error) { - this.requestStatus.addGraphEdge = 'failed'; - this.errorInfo.addGraphEdge.message = error.message; - console.error(error.message); - } - }); - - expandGraphNode = flow(function* expandGraphNode( - this: DataAnalyzeStore, - // double click on a node, or right click a node - nodeId?: string, - label?: string - ) { - this.requestStatus.expandGraphNode = 'pending'; - - try { - const result: AxiosResponse = yield axios.put( - `${baseUrl}/${this.currentId}/gremlin-query`, - { - vertex_id: nodeId || this.rightClickedGraphData.id, - vertex_label: label || this.rightClickedGraphData.label - } - ); - - if (result.data.status !== 200) { - this.errorInfo.expandGraphNode.code = result.data.status; - throw new Error(result.data.message); - } - - const newGraphData = result.data; - - const filteredVertices = newGraphData.data.graph_view.vertices.filter( - ({ id }) => { - if (this.vertexCollection.has(id)) { - return false; - } - - this.vertexCollection.add(id); - return true; - } - ); - - const filteredEdges = newGraphData.data.graph_view.edges.filter( - ({ id }) => { - if (this.edgeCollection.has(id)) { - return false; - } - - this.edgeCollection.add(id); - return true; - } - ); - - this.expandedGraphData = { - ...newGraphData, - data: { - ...newGraphData.data, - graph_view: { - vertices: filteredVertices, - edges: filteredEdges - } - } - }; - - const vertexCollection = new Set(); - const edgeCollection = new Set(); - - const mergeData: FetchGraphResponse = { - ...newGraphData, - data: { - ...newGraphData.data, - graph_view: { - vertices: this.graphData.data.graph_view.vertices - .concat(newGraphData.data.graph_view.vertices) - .filter((item) => { - const isDuplicate = vertexCollection.has(item.id); - vertexCollection.add(item.id); - return !isDuplicate; - }), - edges: this.graphData.data.graph_view.edges - .concat(newGraphData.data.graph_view.edges) - .filter((item) => { - const isDuplicate = edgeCollection.has(item.id); - edgeCollection.add(item.id); - return !isDuplicate; - }) - } - } - }; - - this.graphData = mergeData; - this.requestStatus.expandGraphNode = 'success'; - } catch (error) { - this.requestStatus.expandGraphNode = 'failed'; - this.errorInfo.expandGraphNode.message = error.message; - console.error(error.message); - } - }); - - @action - hideGraphNode(nodeId: any) { - this.graphData.data.graph_view.vertices = this.graphData.data.graph_view.vertices.filter( - (data) => data.id !== this.rightClickedGraphData.id - ); - - // only delete node in vertexCollection, not edges in EdgeCollection - this.vertexCollection.delete(nodeId); - - // assign new object to observable - this.graphData = { ...this.graphData }; - } - - updateGraphProperties = flow(function* updateGraphProperties( - this: DataAnalyzeStore - ) { - this.requestStatus.updateGraphProperties = 'pending'; - - const { id, label, properties } = - this.graphInfoDataSet === 'node' - ? this.selectedGraphData - : this.selectedGraphLinkData; - - const editedProperties: Record> = { - ...Object.fromEntries([ - ...this.editedSelectedGraphDataProperties.primary - ]), - ...Object.fromEntries([ - ...this.editedSelectedGraphDataProperties.nonNullable - ]), - ...Object.fromEntries([ - ...this.editedSelectedGraphDataProperties.nullable - ]) - }; - - // check if originial type is Array - Object.entries(editedProperties).forEach(([key, value]) => { - if (Array.isArray(properties[key])) { - if ((value as string).includes(',')) { - editedProperties[key] = (value as string).split(','); - } - - if ((value as string).includes(',')) { - editedProperties[key] = (value as string).split(','); - } - } - }); - - try { - const result: AxiosResponse> = yield axios.put>( - `${baseUrl}/${this.currentId}/graph/${ - this.graphInfoDataSet === 'node' ? 'vertex' : 'edge' - }/${encodeURIComponent(id)}`, - this.graphInfoDataSet === 'node' - ? { - id, - label, - properties: editedProperties - } - : { - id, - label, - properties: editedProperties, - source: this.selectedGraphLinkData.source, - target: this.selectedGraphLinkData.target - } - ); - - if (result.data.status !== 200) { - this.errorInfo.updateGraphProperties.code = result.data.status; - throw new Error(result.data.message); - } - - const graphData = cloneDeep(this.graphData); - if (this.graphInfoDataSet === 'node') { - const vertex = graphData.data.graph_view.vertices.find( - ({ id }) => id === result.data.data.id - ); - - if (!isUndefined(vertex)) { - vertex.id = result.data.data.id; - vertex.label = result.data.data.label; - vertex.properties = result.data.data.properties; - } - } else { - const edge = graphData.data.graph_view.edges.find( - ({ id }) => id === result.data.data.id - ); - - if (!isUndefined(edge)) { - edge.id = result.data.data.id; - edge.label = result.data.data.label; - edge.properties = result.data.data.properties; - } - } - - this.graphData = graphData; - this.requestStatus.updateGraphProperties = 'success'; - return result.data.data; - } catch (error) { - this.requestStatus.updateGraphProperties = 'failed'; - this.errorInfo.updateGraphProperties.message = error.message; - console.error(error.message); - } - }); - - // require list of edge type options in QueryFilteredOptions - fetchRelatedVertex = flow(function* fetchRelatedVertex( - this: DataAnalyzeStore - ) { - this.requestStatus.fetchRelatedVertex = 'pending'; - - try { - const result = yield axios.get( - `${baseUrl}/${this.currentId}/schema/vertexlabels/${this.rightClickedGraphData.label}/link` - ); - - if (result.data.status !== 200) { - this.errorInfo.fetchRelatedVertex = result.data.status; - throw new Error(result.data.message); - } - - this.graphDataEdgeTypes = result.data.data; - - this.editEdgeFilterOption( - 'type', - !isUndefined(result.data.data[0]) ? result.data.data[0] : '' - ); - } catch (error) { - this.requestStatus.fetchRelatedVertex = 'failed'; - this.errorInfo.fetchRelatedVertex.message = error.message; - console.error(error.message); - } - }); - - // require list of property options in QueryFilteredOptions - fetchFilteredPropertyOptions = flow(function* fetchFilteredPropertyOptions( - this: DataAnalyzeStore, - edgeName: string - ) { - this.requestStatus.fetchFilteredPropertyOptions = 'pending'; - - try { - const result: AxiosResponse = yield axios.get( - `${baseUrl}/${this.currentId}/schema/edgelabels/${edgeName}` - ); - - if (result.data.status !== 200) { - this.errorInfo.filteredPropertyOptions.code = result.data.status; - throw new Error(result.data.message); - } - - this.filteredPropertyOptions = result.data.data.properties.map( - ({ name }) => name - ); - } catch (error) { - this.requestStatus.fetchFilteredPropertyOptions = 'failed'; - this.errorInfo.filteredPropertyOptions = error.message; - console.error(error.message); - } - }); - - filterGraphData = flow(function* filteredGraphData(this: DataAnalyzeStore) { - this.requestStatus.filteredGraphData = 'pending'; - - try { - const result: AxiosResponse = yield axios.put( - `${baseUrl}/${this.currentId}/gremlin-query`, - { - vertex_id: this.rightClickedGraphData.id, - vertex_label: this.rightClickedGraphData.label, - edge_label: this.filteredGraphQueryOptions.line.type, - direction: this.filteredGraphQueryOptions.line.direction, - conditions: this.filteredGraphQueryOptions.properties.map( - ({ property, rule, value }) => ({ - key: property, - operator: ruleMap[rule], - value: rule === 'True' || rule === 'False' ? Boolean(rule) : value - }) - ) - } - ); - - if (result.data.status !== 200) { - this.errorInfo.filteredGraphData.code = result.data.status; - throw new Error(result.data.message); - } - - const newGraphData = result.data; - - const filteredVertices = newGraphData.data.graph_view.vertices.filter( - ({ id }) => { - if (this.vertexCollection.has(id)) { - return false; - } - - this.vertexCollection.add(id); - return true; - } - ); - - const filteredEdges = newGraphData.data.graph_view.edges.filter( - ({ id }) => { - if (this.edgeCollection.has(id)) { - return false; - } - - this.edgeCollection.add(id); - return true; - } - ); - - this.expandedGraphData = { - ...newGraphData, - data: { - ...newGraphData.data, - graph_view: { - vertices: filteredVertices, - edges: filteredEdges - } - } - }; - - const vertexCollection = new Set(); - const edgeCollection = new Set(); - - const mergeData: FetchGraphResponse = { - ...newGraphData, - data: { - ...newGraphData.data, - graph_view: { - vertices: this.graphData.data.graph_view.vertices - .concat(newGraphData.data.graph_view.vertices) - .filter((item) => { - const isDuplicate = vertexCollection.has(item.id); - vertexCollection.add(item.id); - return !isDuplicate; - }), - edges: this.graphData.data.graph_view.edges - .concat(newGraphData.data.graph_view.edges) - .filter((item) => { - const isDuplicate = edgeCollection.has(item.id); - edgeCollection.add(item.id); - return !isDuplicate; - }) - } - } - }; - - this.graphData = mergeData; - this.requestStatus.filteredGraphData = 'success'; - } catch (error) { - this.errorInfo.filteredGraphData.message = error.message; - console.error(error.message); - } - }); - - addQueryCollection = flow(function* addQueryCollection( - this: DataAnalyzeStore, - name: string, - // if content is not the value in codeEditor (e.g. in table) - content?: string - ) { - this.requestStatus.addQueryCollection = 'pending'; - - try { - const result = yield axios.post( - `${baseUrl}/${this.currentId}/gremlin-collections`, - { - name, - content: content || this.codeEditorText - } - ); - - if (result.data.status !== 200) { - this.errorInfo.addQueryCollection.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.addQueryCollection = 'success'; - } catch (error) { - this.requestStatus.addQueryCollection = 'failed'; - this.errorInfo.addQueryCollection.message = error.message; - console.error(error.message); - } - }); - - editQueryCollection = flow(function* editQueryCollection( - this: DataAnalyzeStore, - id: number, - name: string, - content: string - ) { - this.requestStatus.editQueryCollection = 'pending'; - - try { - const result = yield axios.put( - `${baseUrl}/${this.currentId}/gremlin-collections/${id}`, - { - name, - content - } - ); - - if (result.data.status !== 200) { - this.errorInfo.editQueryCollection.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.editQueryCollection = 'success'; - } catch (error) { - this.requestStatus.editQueryCollection = 'failed'; - this.errorInfo.editQueryCollection.message = error.message; - console.error(error.message); - } - }); - - deleteQueryCollection = flow(function* deleteQueryCollection( - this: DataAnalyzeStore, - id: number - ) { - this.requestStatus.deleteQueryCollection = 'pending'; - - try { - const result = yield axios.delete( - `${baseUrl}/${this.currentId}/gremlin-collections/${id}` - ); - - if (result.data.status !== 200) { - this.errorInfo.deleteQueryCollection = result.data.status; - throw new Error(result.data.message); - } - - // if current pageNumber has no data after delete, set the pageNumber to the previous - if ( - this.favoriteQueryData.length === 1 && - this.pageConfigs.favoriteQueries.pageNumber > 1 - ) { - this.pageConfigs.favoriteQueries.pageNumber = - this.pageConfigs.favoriteQueries.pageNumber - 1; - } - - this.requestStatus.deleteQueryCollection = 'success'; - } catch (error) { - this.requestStatus.deleteQueryCollection = 'failed'; - this.errorInfo.deleteQueryCollection.message = error.message; - console.error(error.message); - } - }); - - fetchExecutionLogs = flow(function* fetchExecutionLogs( - this: DataAnalyzeStore - ) { - this.requestStatus.fetchExecutionLogs = 'pending'; - - try { - const result: AxiosResponse = yield axios.get< - ExecutionLogsResponse - >(`${baseUrl}/${this.currentId}/execute-histories`, { - params: { - page_size: this.pageConfigs.executionLog.pageSize, - page_no: this.pageConfigs.executionLog.pageNumber - } - }); - - if (result.data.status !== 200) { - this.errorInfo.fetchExecutionLogs.code = result.data.status; - throw new Error(result.data.message); - } - - this.executionLogData = result.data.data.records; - this.pageConfigs.executionLog.pageTotal = result.data.data.total; - this.requestStatus.fetchExecutionLogs = 'success'; - } catch (error) { - this.requestStatus.fetchExecutionLogs = 'failed'; - this.errorInfo.fetchExecutionLogs.message = error.message; - console.error(error.message); - } - }); - - fetchFavoriteQueries = flow(function* fetchFavoriteQueries( - this: DataAnalyzeStore - ) { - const url = - `${baseUrl}/${this.currentId}/gremlin-collections?` + - `&page_no=${this.pageConfigs.favoriteQueries.pageNumber}` + - `&page_size=${this.pageConfigs.favoriteQueries.pageSize}` + - (this.favoriteQueriesSortOrder.time !== '' - ? `&time_order=${this.favoriteQueriesSortOrder.time}` - : '') + - (this.favoriteQueriesSortOrder.name !== '' - ? `&name_order=${this.favoriteQueriesSortOrder.name}` - : '') + - (this.isSearched.status && this.searchText !== '' - ? `&content=${this.searchText}` - : ''); - - this.requestStatus.fetchFavoriteQueries = 'pending'; - - try { - const result: AxiosResponse = yield axios.get< - FavoriteQueryResponse - >(url); - - if (result.data.status !== 200) { - this.errorInfo.fetchFavoriteQueries.code = result.data.status; - throw new Error(result.data.message); - } - - this.favoriteQueryData = result.data.data.records; - this.pageConfigs.favoriteQueries.pageTotal = result.data.data.total; - this.requestStatus.fetchFavoriteQueries = 'success'; - } catch (error) { - this.requestStatus.fetchFavoriteQueries = 'failed'; - this.errorInfo.fetchFavoriteQueries.message = error.message; - console.error(error.message); - } - }); -} - -export default createContext(new DataAnalyzeStore()); diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/ImportManagerStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/ImportManagerStore.ts deleted file mode 100644 index c9b513531..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/ImportManagerStore.ts +++ /dev/null @@ -1,383 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { createContext } from 'react'; -import { observable, action, flow, computed } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; -import { isEmpty, size } from 'lodash-es'; - -import i18next from '../../../i18n'; -import { - Job, - JobResponse -} from '../../types/GraphManagementStore/dataImportStore'; -import { - initRequestStatus, - initErrorInfo -} from '../../factory/dataImportStore/importManagmentStore'; -import { checkIfLocalNetworkOffline } from '../../utils'; - -import { baseUrl, responseData } from '../../types/common'; -import type { - JobGlance, - JobFailedReason -} from '../../types/GraphManagementStore/dataImportStore'; - -export class ImportManagerStore { - @observable requestStatus = initRequestStatus(); - @observable errorInfo = initErrorInfo(); - - @observable currentId: number | null = null; - @observable jobDetailsStep = 'basic'; - @observable selectedJobIndex = NaN; - @observable selectedJob: Job | null = null; - @observable searchWords = ''; - @observable isCreateNewProperty = false; - - @observable.shallow importJobListPageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - - @observable.shallow isSearched = { - status: false, - value: '' - }; - - @observable.shallow newJob = { - name: '', - description: '' - }; - - // @observable editJob: JobGlance | null = null; - @observable editJob: JobGlance | null = { - name: '', - description: '' - }; - - @observable.ref importJobList: Job[] = []; - @observable.ref failedReason: JobFailedReason[] = []; - - @observable validateNewJobErrorMessage = { - name: '', - description: '' - }; - - @observable validateEditJobErrorMessage = { - name: '', - description: '' - }; - - @computed get currentJobDetails() { - return this.importJobList[this.selectedJobIndex]; - } - - @action - setCurrentId(id: number) { - this.currentId = id; - } - - @action - switchCreateNewProperty(flag: boolean) { - this.isCreateNewProperty = flag; - } - - @action - switchSearchedStatus(isSearched: boolean) { - this.isSearched.status = isSearched; - - isSearched - ? (this.isSearched.value = this.searchWords) - : (this.isSearched.value = ''); - } - - @action - setCurrentJobDetailStep(step: string) { - this.jobDetailsStep = step; - } - - @action - setSelectedJobIndex(index: number) { - this.selectedJobIndex = index; - } - - @action - setSelectedJob(jobId: number | null) { - if (jobId === null) { - this.selectedJob = null; - } else { - this.selectedJob = this.importJobList.find( - ({ id }) => jobId === id - ) as Job; - } - } - - @action - mutateSearchWords(word: string) { - this.searchWords = word; - } - - @action - mutateNewJob(key: T, value: JobGlance[T]) { - this.newJob[key] = value; - } - - @action - mutateEditJob(key: T, value: JobGlance[T]) { - if (this.editJob !== null) { - this.editJob[key] = value; - } - } - - @action - mutateImportJobListPageNumber(pageNumber: number) { - this.importJobListPageConfig.pageNumber = pageNumber; - } - - @action - validateJob(type: 'new' | 'edit', category: keyof JobGlance) { - const job = type === 'new' ? this.newJob : this.editJob!; - const errorMessage = - type === 'new' - ? this.validateNewJobErrorMessage - : this.validateEditJobErrorMessage; - - if (category === 'name') { - const name = job.name; - - if (isEmpty(name)) { - errorMessage.name = i18next.t('import-manager.validator.no-empty'); - } else if (size(name) > 48) { - errorMessage.name = i18next.t( - 'import-manager.validator.over-limit-size' - ); - } else if (!/^[\w\d\u4e00-\u9fa5]{1,48}$/.test(name)) { - errorMessage.name = i18next.t( - 'import-manager.validator.invalid-format' - ); - } else { - errorMessage.name = ''; - } - } - - if (category === 'description') { - const description = job.description; - - if (size(description) > 200) { - errorMessage.description = i18next.t( - 'import-manager.validator.over-limit-size' - ); - } else if (!/^[\w\d\u4e00-\u9fa5]{0,200}$/.test(description)) { - errorMessage.description = i18next.t( - 'import-manager.validator.invalid-format' - ); - } else { - errorMessage.description = ''; - } - } - } - - @action - resetJob(type: 'new' | 'edit') { - if (type === 'new') { - this.newJob = { - name: '', - description: '' - }; - } else { - this.editJob = null; - } - } - - @action - dispose() { - this.requestStatus = initRequestStatus(); - this.errorInfo = initErrorInfo(); - this.currentId = null; - this.jobDetailsStep = 'basic'; - this.selectedJobIndex = NaN; - this.selectedJob = null; - this.isCreateNewProperty = false; - - this.importJobListPageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - - this.isSearched = { - status: false, - value: '' - }; - - this.newJob = { - name: '', - description: '' - }; - - this.editJob = { - name: '', - description: '' - }; - - this.importJobList = []; - this.failedReason = []; - - this.validateNewJobErrorMessage = { - name: '', - description: '' - }; - - this.validateEditJobErrorMessage = { - name: '', - description: '' - }; - } - - fetchImportJobList = flow(function* fetchImportJobList( - this: ImportManagerStore - ) { - this.requestStatus.fetchImportJobList = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .get>( - `${baseUrl}/${this.currentId}/job-manager?page_no=${this.importJobListPageConfig.pageNumber}&page_size=10` + - (this.isSearched.status && this.searchWords !== '' - ? `&content=${this.searchWords}` - : '') - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchImportJobList.code = result.data.status; - throw new Error(result.data.message); - } - - this.importJobList = result.data.data.records; - this.importJobListPageConfig.pageTotal = result.data.data.total; - this.requestStatus.fetchImportJobList = 'success'; - } catch (error) { - this.requestStatus.fetchImportJobList = 'failed'; - this.errorInfo.fetchImportJobList.message = error.message; - } - }); - - createNewJob = flow(function* createNewJob(this: ImportManagerStore) { - this.requestStatus.createNewJob = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post>(`${baseUrl}/${this.currentId}/job-manager`, { - job_name: this.newJob.name, - job_remarks: this.newJob.description - }) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.createNewJob.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.createNewJob = 'success'; - } catch (error) { - this.requestStatus.createNewJob = 'failed'; - this.errorInfo.createNewJob.message = error.message; - } - }); - - updateJobInfo = flow(function* updateJobInfo(this: ImportManagerStore) { - this.requestStatus.updateJobInfo = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .put>( - `${baseUrl}/${this.currentId}/job-manager/${this.selectedJob!.id}`, - { - job_name: this.editJob!.name, - job_remarks: this.editJob!.description - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.updateJobInfo.code = result.data.status; - throw new Error(result.data.message); - } - - this.selectedJob = result.data.data; - this.requestStatus.updateJobInfo = 'success'; - } catch (error) { - this.requestStatus.updateJobInfo = 'failed'; - this.errorInfo.updateJobInfo.message = error.message; - } - }); - - deleteJob = flow(function* deleteJob(this: ImportManagerStore, id: number) { - this.requestStatus.deleteJob = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .delete>( - `${baseUrl}/${this.currentId}/job-manager/${id}` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.deleteJob.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.deleteJob = 'success'; - } catch (error) { - this.requestStatus.deleteJob = 'failed'; - this.errorInfo.deleteJob.message = error.message; - } - }); - - fetchFailedReason = flow(function* fetchFailedReason( - this: ImportManagerStore, - connectId: number, - jobId: number - ) { - this.requestStatus.fetchFailedReason = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .get>( - `${baseUrl}/${connectId}/job-manager/${jobId}/reason` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchFailedReason.code = result.data.status; - throw new Error(result.data.message); - } - - this.failedReason = result.data.data; - this.requestStatus.fetchFailedReason = 'success'; - } catch (error) { - this.requestStatus.fetchFailedReason = 'failed'; - this.errorInfo.fetchFailedReason.message = error.message; - } - }); -} - -export default createContext(new ImportManagerStore()); diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/dataImportRootStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/dataImportRootStore.ts deleted file mode 100644 index fe25499c8..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/dataImportRootStore.ts +++ /dev/null @@ -1,427 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { createContext } from 'react'; -import { observable, action, flow, computed } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; -import { remove, isUndefined } from 'lodash-es'; - -import { DataMapStore } from './dataMapStore'; -import { ServerDataImportStore } from './serverDataImportStore'; -import { - initErrorInfo, - initRequestStatus -} from '../../factory/dataImportStore/dataImportRootStore'; -import { baseUrl, responseData } from '../../types/common'; -import { - FileUploadResult, - FileUploadTask, - FileUploadQueue -} from '../../types/GraphManagementStore/dataImportStore'; -import { - VertexType, - VertexTypeListResponse, - EdgeType, - EdgeTypeListResponse -} from '../../types/GraphManagementStore/metadataConfigsStore'; -import { checkIfLocalNetworkOffline, getErrorMessage } from '../../utils'; - -const MAX_CONCURRENT_UPLOAD = 5; - -export class DataImportRootStore { - dataMapStore: DataMapStore; - serverDataImportStore: ServerDataImportStore; - - constructor() { - this.dataMapStore = new DataMapStore(this); - this.serverDataImportStore = new ServerDataImportStore(this); - } - - @observable currentId: number | null = null; - @observable currentJobId: number | null = null; - @observable currentStatus = ''; - @observable currentStep = NaN; - - @observable requestStatus = initRequestStatus(); - @observable errorInfo = initErrorInfo(); - - @observable fileList: File[] = []; - @observable.ref fileHashes: Record = {}; - @observable fileUploadTasks: FileUploadTask[] = []; - @observable fileUploadQueue: FileUploadQueue[] = []; - @observable fileRetryUploadList: string[] = []; - - @observable.ref fileInfos: FileUploadResult[] = []; - @observable.ref vertexTypes: VertexType[] = []; - @observable.ref edgeTypes: EdgeType[] = []; - - @computed get successFileUploadTaskNames() { - return this.fileUploadTasks - .filter(({ status }) => status === 'success') - .map(({ name }) => name); - } - - @computed get unsuccessFileUploadTasks() { - return this.fileUploadTasks.filter(({ status }) => status !== 'success'); - } - - findFileUploadTask(fileName: string) { - return this.fileUploadTasks.find(({ name }) => name === fileName); - } - - getRequiredFileUploadTask(fileName: string) { - const fileUploadTask = this.findFileUploadTask(fileName); - - if (isUndefined(fileUploadTask)) { - throw new Error(`Upload task '${fileName}' not found`); - } - - return fileUploadTask; - } - - @action - setCurrentId(id: number) { - this.currentId = id; - } - - @action - setCurrentJobId(id: number) { - this.currentJobId = id; - } - - @action - setCurrentStatus(status: string) { - this.currentStatus = status; - } - - @action - setCurrentStep(step: number) { - this.currentStep = step; - } - - @action - updateFileList(files: File[]) { - this.fileList = [...files, ...this.fileList]; - } - - @action - initFileUploadTask(tasks: FileUploadTask) { - this.fileUploadTasks = [tasks, ...this.fileUploadTasks]; - } - - @action - addFileUploadQueue(element: FileUploadQueue) { - this.fileUploadQueue.push(element); - } - - @action - removeFileUploadQueue(fileName: string) { - remove(this.fileUploadQueue, ({ fileName: name }) => name === fileName); - } - - @action - mutateFileUploadQueue( - key: T, - value: FileUploadQueue[T], - index: number - ) { - this.fileUploadQueue[index][key] = value; - } - - @action - mutateFileUploadTasks( - key: T, - value: FileUploadTask[T], - fileName: string - ) { - const fileUploadTask = this.findFileUploadTask(fileName); - - // users may click back button in browser - if (!isUndefined(fileUploadTask)) { - fileUploadTask[key] = value; - } - } - - @action - removeFileUploadTasks(fileName: string) { - remove(this.fileUploadTasks, ({ name }) => fileName === name); - } - - @action - addRetryFileUploadQueue(fileName: string) { - this.fileRetryUploadList.push(fileName); - } - - @action - pullRetryFileUploadQueue() { - return this.fileRetryUploadList.shift(); - } - - @action - resetAllFileInfos() { - this.fileList = []; - this.fileUploadTasks = []; - this.fileUploadQueue = []; - this.fileInfos = []; - } - - @action - dispose() { - this.currentId = null; - this.currentJobId = null; - this.currentStatus = ''; - this.currentStep = NaN; - this.vertexTypes = []; - this.edgeTypes = []; - - this.resetAllFileInfos(); - this.requestStatus = initRequestStatus(); - this.errorInfo = initErrorInfo(); - } - - fetchFilehashes = flow(function* fetchFilehashes( - this: DataImportRootStore, - fileNames: string[] - ) { - this.requestStatus.fetchFilehashes = 'pending'; - - try { - const result = yield axios - .get>>( - `${baseUrl}/${this.currentId}/job-manager/${ - this.currentJobId - }/upload-file/token?${fileNames - .map((name) => `names=${name}`) - .join('&')}` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchFilehashes.code = result.data.status; - throw new Error(result.data.message); - } - - this.fileHashes = { ...this.fileHashes, ...result.data.data }; - this.requestStatus.fetchFilehashes = 'success'; - } catch (error) { - const errorMessage = getErrorMessage(error); - this.requestStatus.fetchFilehashes = 'failed'; - this.errorInfo.fetchFilehashes.message = errorMessage; - console.error(errorMessage); - } - }); - - uploadFiles = flow(function* uploadFiles( - this: DataImportRootStore, - { - fileName, - fileChunkList, - fileChunkTotal - }: { - fileName: string; - fileChunkList: { - chunkIndex: number; - chunk: Blob; - }; - fileChunkTotal: number; - } - ) { - this.requestStatus.uploadFiles = 'pending'; - const formData = new FormData(); - formData.append('file', fileChunkList.chunk); - - if (this.currentId === null || this.currentJobId === null) { - return; - } - - try { - const fileSize = this.getRequiredFileUploadTask(fileName).size; - const result: AxiosResponse> = yield axios - .post>( - `${baseUrl}/${this.currentId}/job-manager/${this.currentJobId}/upload-file?total=${fileChunkTotal}&index=${fileChunkList.chunkIndex}&name=${fileName}&size=${fileSize}&token=${this.fileHashes[fileName]}`, - formData, - { - headers: { - 'Content-Type': 'multipart/form-data' - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.uploadFiles.code = result.data.status; - throw new Error(result.data.message); - } - - this.fileInfos.push(result.data.data); - this.requestStatus.uploadFiles = 'success'; - return result.data.data; - } catch (error) { - const errorMessage = getErrorMessage(error); - this.requestStatus.uploadFiles = 'failed'; - this.errorInfo.uploadFiles.message = errorMessage; - console.error(errorMessage); - } - }); - - deleteFiles = flow(function* deleteFiles( - this: DataImportRootStore, - fileName: string - ) { - this.requestStatus.deleteFiles = 'pending'; - - try { - const result = yield axios - .delete( - `${baseUrl}/${this.currentId}/job-manager/${this.currentJobId}/upload-file?name=${fileName}&token=${this.fileHashes[fileName]}` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.deleteFiles.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.deleteFiles = 'success'; - } catch (error) { - const errorMessage = getErrorMessage(error); - this.requestStatus.deleteFiles = 'failed'; - this.errorInfo.deleteFiles.message = errorMessage; - console.error(errorMessage); - } - }); - - sendUploadCompleteSignal = flow(function* sendUploadCompleteSignal( - this: DataImportRootStore - ) { - this.requestStatus.sendUploadCompleteSignal = 'pending'; - - try { - const result = yield axios - .put( - `${baseUrl}/${this.currentId}/job-manager/${this.currentJobId}/upload-file/next-step` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.sendUploadCompleteSignal.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.sendUploadCompleteSignal = 'success'; - } catch (error) { - const errorMessage = getErrorMessage(error); - this.requestStatus.sendUploadCompleteSignal = 'failed'; - this.errorInfo.sendUploadCompleteSignal.message = errorMessage; - console.error(errorMessage); - } - }); - - sendMappingCompleteSignal = flow(function* sendMappingCompleteSignal( - this: DataImportRootStore - ) { - this.requestStatus.sendMappingCompleteSignal = 'pending'; - - try { - const result = yield axios - .put( - `${baseUrl}/${this.currentId}/job-manager/${this.currentJobId}/file-mappings/next-step` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.sendMappingCompleteSignal.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.sendMappingCompleteSignal = 'success'; - } catch (error) { - const errorMessage = getErrorMessage(error); - this.requestStatus.sendMappingCompleteSignal = 'failed'; - this.errorInfo.sendMappingCompleteSignal.message = errorMessage; - console.error(errorMessage); - } - }); - - fetchVertexTypeList = flow(function* fetchVertexTypeList( - this: DataImportRootStore - ) { - this.requestStatus.fetchVertexTypeList = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .get>( - `${baseUrl}/${this.currentId}/schema/vertexlabels`, - { - params: { - page_size: -1 - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchVertexTypeList.code = result.data.status; - throw new Error(result.data.message); - } - - this.vertexTypes = result.data.data.records; - this.requestStatus.fetchVertexTypeList = 'success'; - } catch (error) { - const errorMessage = getErrorMessage(error); - this.requestStatus.fetchVertexTypeList = 'failed'; - this.errorInfo.fetchVertexTypeList.message = errorMessage; - } - }); - - fetchEdgeTypeList = flow(function* fetchEdgeTypeList( - this: DataImportRootStore - ) { - this.requestStatus.fetchEdgeTypeList = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .get>( - `${baseUrl}/${this.currentId}/schema/edgelabels`, - { - params: { - page_size: -1 - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchEdgeTypeList.code = result.data.status; - throw new Error(result.data.message); - } - - this.edgeTypes = result.data.data.records; - this.requestStatus.fetchEdgeTypeList = 'success'; - } catch (error) { - const errorMessage = getErrorMessage(error); - this.requestStatus.fetchEdgeTypeList = 'failed'; - this.errorInfo.fetchEdgeTypeList.message = errorMessage; - } - }); -} - -export default createContext(new DataImportRootStore()); diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/dataMapStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/dataMapStore.ts deleted file mode 100644 index 67bdcbe97..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/dataMapStore.ts +++ /dev/null @@ -1,1321 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { observable, action, flow, computed } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; -import { isUndefined, isEmpty, cloneDeep, remove, flatMap } from 'lodash-es'; - -import { DataImportRootStore } from './dataImportRootStore'; -import { baseUrl, responseData } from '../../types/common'; -import { - initRequestStatus, - initErrorInfo, - createNewEdgeType, - createNewVertexType, - createValidateFileInfoErrorMessage, - createValidateAdvanceConfigErrorMessage -} from '../../factory/dataImportStore/dataMapStore'; -import { - FileMapInfo, - FileConfig, - FileMapResult, - VertexMap, - EdgeMap, - FileValidator, - ValueMapValidator -} from '../../types/GraphManagementStore/dataImportStore'; -import { checkIfLocalNetworkOffline, validateGraphProperty } from '../../utils'; - -import type { - VertexType, - EdgeType -} from '../../types/GraphManagementStore/metadataConfigsStore'; -import i18next from '../../../i18n'; - -export class DataMapStore { - dataImportRootStore: DataImportRootStore; - - constructor(dataImportRootStore: DataImportRootStore) { - this.dataImportRootStore = dataImportRootStore; - } - - // v1.3.1: check details from import-manager - @observable readOnly = false; - // v1.3.1: task process comes from import-manager entrance - @observable isIrregularProcess = false; - // v1.5.0 no check details but in progress when LOADING - @observable lock = false; - - @observable isExpandFileConfig = true; - // If one of the type info card is being edited - @observable isExpandTypeConfig = false; - @observable isAddNewTypeConfig = false; - @observable fileMapInfos: FileMapInfo[] = []; - // v1.3.1: preFetched file mapping infos from import-manager - @observable preFetchedFileMapInfos: FileMapInfo[] = []; - @observable selectedFileId: number = NaN; - @observable selectedFileInfo: FileMapInfo | null = null; - - @observable newVertexType: VertexMap = createNewVertexType(); - @observable editedVertexMap: VertexMap | null = null; - - @observable newEdgeType: EdgeMap = createNewEdgeType(); - @observable editedEdgeMap: EdgeMap | null = null; - - // validators - @observable - validateFileInfoErrorMessage: FileValidator = createValidateFileInfoErrorMessage(); - @observable - validateAdvanceConfigErrorMessage: ValueMapValidator = createValidateAdvanceConfigErrorMessage(); - - @observable requestStatus = initRequestStatus(); - @observable errorInfo = initErrorInfo(); - - @computed get isValidateFileInfo() { - return ( - !isEmpty(this.selectedFileInfo?.file_setting.delimiter) && - !isEmpty(this.selectedFileInfo?.file_setting.charset) && - !isEmpty(this.selectedFileInfo?.file_setting.date_format) && - !isEmpty(this.selectedFileInfo?.file_setting.skipped_line) && - Object.values(this.validateFileInfoErrorMessage).every( - (errorMessage) => errorMessage === '' - ) - ); - } - - @computed get isValidateSave() { - return ( - this.validateAdvanceConfigErrorMessage.null_values.every((value) => - isEmpty(value) - ) && - this.validateAdvanceConfigErrorMessage.value_mapping.every( - ({ column_name, values }) => { - const errorMessages = flatMap( - values, - ({ column_value, mapped_value }) => [column_value, mapped_value] - ); - - return ( - isEmpty(column_name) && - errorMessages.every((message) => isEmpty(message)) - ); - } - ) - ); - } - - @computed get filteredColumnNamesInVertexEditSelection() { - return this.selectedFileInfo!.file_setting.column_names.filter( - (column_name) => !this.editedVertexMap!.id_fields.includes(column_name) - ); - } - - @computed get filteredColumnNamesInVertexNewSelection() { - return this.selectedFileInfo!.file_setting.column_names.filter( - (column_name) => !this.newVertexType?.id_fields.includes(column_name) - ); - } - - @computed get filteredColumnNamesInEdgeEditSelection() { - return this.selectedFileInfo!.file_setting.column_names.filter( - (column_name) => - !this.editedEdgeMap!.source_fields.includes(column_name) && - !this.editedEdgeMap!.target_fields.includes(column_name) - ); - } - - @computed get filteredColumnNamesInEdgeNewSelection() { - return this.selectedFileInfo!.file_setting.column_names.filter( - (column_name) => - !this.newEdgeType.source_fields.includes(column_name) && - !this.newEdgeType.target_fields.includes(column_name) - ); - } - - @computed get filteredFileMapInfo() { - return this.fileMapInfos.filter(({ name }) => - this.dataImportRootStore.fileList.map(({ name }) => name).includes(name) - ); - } - - @action - switchReadOnly(isReadOnly: boolean) { - this.readOnly = isReadOnly; - } - - @action - switchLock(lock: boolean) { - this.lock = lock; - } - - @action - switchIrregularProcess(flag: boolean) { - this.isIrregularProcess = flag; - } - - @action - switchExpand(card: 'file' | 'type', flag: boolean) { - if (card === 'file') { - this.isExpandFileConfig = flag; - } else { - this.isExpandTypeConfig = flag; - } - } - - @action - switchEditTypeConfig(flag: boolean) { - this.isExpandTypeConfig = flag; - } - - @action - switchAddNewTypeConfig(flag: boolean) { - this.isAddNewTypeConfig = flag; - } - - @action - setSelectedFileId(id: number) { - this.selectedFileId = id; - } - - @action - setSelectedFileInfo() { - const fileInfo = this.fileMapInfos.find( - ({ id }) => id === this.selectedFileId - ); - - if (!isUndefined(fileInfo)) { - this.selectedFileInfo = fileInfo; - } - } - - @action - setFileConfig(key: T, value: FileConfig[T]) { - if (this.selectedFileInfo !== null) { - this.selectedFileInfo.file_setting[key] = value; - } - } - - @action - syncEditMap(type: 'vertex' | 'edge', mapIndex: number) { - if (type === 'vertex') { - this.editedVertexMap = cloneDeep( - this.selectedFileInfo!.vertex_mappings[mapIndex] - ); - } else { - this.editedEdgeMap = cloneDeep( - this.selectedFileInfo!.edge_mappings[mapIndex] - ); - } - } - - @action - setNewVertexConfig(key: T, value: VertexMap[T]) { - this.newVertexType[key] = value; - } - - @action - editVertexMapConfig( - key: T, - value: VertexMap[T], - vertexMapIndex: number - ) { - this.editedVertexMap![key] = value; - } - - @action - setNewEdgeConfig(key: T, value: EdgeMap[T]) { - this.newEdgeType[key] = value; - } - - @action - editEdgeMapConfig( - key: T, - value: EdgeMap[T], - edgeMapIndex: number - ) { - this.editedEdgeMap![key] = value; - } - - @action - setVertexFieldMappingKey(type: 'new' | 'edit', key: string, value?: string) { - if (type === 'new') { - this.newVertexType.field_mapping.unshift({ - column_name: key, - mapped_name: isUndefined(value) ? '' : value - }); - } else { - this.editedVertexMap!.field_mapping.unshift({ - column_name: key, - mapped_name: isUndefined(value) ? '' : value - }); - } - } - - @action - setEdgeFieldMappingKey(type: 'new' | 'edit', key: string, value?: string) { - if (type === 'new') { - this.newEdgeType.field_mapping.unshift({ - column_name: key, - mapped_name: isUndefined(value) ? '' : value - }); - } else { - this.editedEdgeMap!.field_mapping.unshift({ - column_name: key, - mapped_name: isUndefined(value) ? '' : value - }); - } - } - - @action - setVertexFieldMapping( - type: 'new' | 'edit', - value: string, - vertexMapFieldIndex: number - ) { - if (type === 'new') { - this.newVertexType.field_mapping[vertexMapFieldIndex].mapped_name = value; - } else { - this.editedVertexMap!.field_mapping[ - vertexMapFieldIndex - ].mapped_name = value; - } - } - - @action - setEdgeFieldMapping( - type: 'new' | 'edit', - value: string, - edgeMapFieldIndex: number - ) { - if (type === 'new') { - this.newEdgeType.field_mapping[edgeMapFieldIndex].mapped_name = value; - } else { - this.editedEdgeMap!.field_mapping[edgeMapFieldIndex].mapped_name = value; - } - } - - @action - removeVertexFieldMapping(type: 'new' | 'edit', columnName: string) { - if (type === 'new') { - remove( - this.newVertexType.field_mapping, - ({ column_name }) => column_name === columnName - ); - } else { - remove( - this.editedVertexMap!.field_mapping, - ({ column_name }) => column_name === columnName - ); - } - } - - @action - removeEdgeFieldMapping(type: 'new' | 'edit', columnName: string) { - if (type === 'new') { - remove( - this.newEdgeType.field_mapping, - ({ column_name }) => column_name === columnName - ); - } else { - remove( - this.editedEdgeMap!.field_mapping, - ({ column_name }) => column_name === columnName - ); - } - } - - @action - toggleVertexSelectAllFieldMapping( - type: 'new' | 'edit', - selectAll: boolean, - selectedVertex?: VertexType - ) { - if (selectAll) { - if (type === 'new') { - const existedFieldColumnNames = this.newVertexType.field_mapping.map( - ({ column_name }) => column_name - ); - - this.selectedFileInfo!.file_setting.column_names.filter( - (column_name) => - !existedFieldColumnNames.includes(column_name) && - !this.newVertexType.id_fields.includes(column_name) - ).map((columnName) => { - this.setVertexFieldMappingKey( - type, - columnName, - selectedVertex?.properties.find(({ name }) => name === columnName) - ?.name - ); - }); - } else { - const existedFieldColumnNames = this.editedVertexMap!.field_mapping.map( - ({ column_name }) => column_name - ); - - this.selectedFileInfo!.file_setting.column_names.filter( - (column_name) => - !existedFieldColumnNames.includes(column_name) && - !this.editedVertexMap!.id_fields.includes(column_name) - ).forEach((columnName) => { - this.setVertexFieldMappingKey( - type, - columnName, - selectedVertex?.properties.find(({ name }) => name === columnName) - ?.name - ); - }); - } - } else { - if (type === 'new') { - this.newVertexType.field_mapping = []; - } else { - this.editedVertexMap!.field_mapping = []; - } - } - } - - @action - toggleEdgeSelectAllFieldMapping( - type: 'new' | 'edit', - selectAll: boolean, - selectedEdge?: EdgeType - ) { - if (selectAll) { - if (type === 'new') { - const existedFieldColumnNames = this.newEdgeType.field_mapping.map( - ({ column_name }) => column_name - ); - - this.selectedFileInfo!.file_setting.column_names.filter( - (column_name) => - !existedFieldColumnNames.includes(column_name) && - !this.newEdgeType.source_fields.includes(column_name) && - !this.newEdgeType.target_fields.includes(column_name) - ).forEach((columnName) => { - this.setEdgeFieldMappingKey( - type, - columnName, - selectedEdge?.properties.find(({ name }) => name === columnName) - ?.name - ); - }); - } else { - const existedFieldColumnNames = this.editedEdgeMap!.field_mapping.map( - ({ column_name }) => column_name - ); - - this.selectedFileInfo!.file_setting.column_names.filter( - (column_name) => - !existedFieldColumnNames.includes(column_name) && - !this.editedEdgeMap!.source_fields.includes(column_name) && - !this.editedEdgeMap!.target_fields.includes(column_name) - ).map((columnName) => { - this.setEdgeFieldMappingKey( - type, - columnName, - selectedEdge?.properties.find(({ name }) => name === columnName) - ?.name - ); - }); - } - } else { - if (type === 'new') { - this.newEdgeType.field_mapping = []; - } else { - this.editedEdgeMap!.field_mapping = []; - } - } - } - - toggleCustomNullValue( - type: 'new' | 'edit', - collection: 'vertex' | 'edge', - flag: boolean - ) { - if (type === 'new') { - if (collection === 'vertex') { - if (flag) { - this.newVertexType.null_values.customized = ['']; - } else { - this.newVertexType.null_values.customized = []; - } - } else { - if (flag) { - this.newEdgeType.null_values.customized = ['']; - } else { - this.newEdgeType.null_values.customized = []; - } - } - } else { - if (collection === 'vertex') { - if (flag) { - this.editedVertexMap!.null_values.customized = ['']; - } else { - this.editedVertexMap!.null_values.customized = []; - } - } else { - if (flag) { - this.editedEdgeMap!.null_values.customized = ['']; - } else { - this.editedEdgeMap!.null_values.customized = []; - } - } - } - } - - editCheckedNullValues( - type: 'new' | 'edit', - collection: 'vertex' | 'edge', - values: string[] - ) { - if (type === 'new') { - if (collection === 'vertex') { - this.newVertexType.null_values.checked = values; - } else { - this.newEdgeType.null_values.checked = values; - } - } else { - if (collection === 'vertex') { - this.editedVertexMap!.null_values.checked = values; - } else { - this.editedEdgeMap!.null_values.checked = values; - } - } - } - - addCustomNullValues(type: 'new' | 'edit', collection: 'vertex' | 'edge') { - if (type === 'new') { - if (collection === 'vertex') { - this.newVertexType.null_values.customized.push(''); - } else { - this.newEdgeType.null_values.customized.push(''); - } - } else { - if (collection === 'vertex') { - this.editedVertexMap!.null_values.customized.push(''); - } else { - this.editedVertexMap!.null_values.customized.push(''); - } - } - } - - editCustomNullValues( - type: 'new' | 'edit', - collection: 'vertex' | 'edge', - value: string, - nullValueIndex: number - ) { - if (type === 'new') { - if (collection === 'vertex') { - this.newVertexType.null_values.customized[nullValueIndex] = value; - } else { - this.newEdgeType.null_values.customized[nullValueIndex] = value; - } - } else { - if (collection === 'vertex') { - this.editedVertexMap!.null_values.customized[nullValueIndex] = value; - } else { - this.editedEdgeMap!.null_values.customized[nullValueIndex] = value; - } - } - } - - @action - addVertexValueMapping(type: 'new' | 'edit') { - const newValueMapping = { - column_name: '', - values: [ - { - column_value: '', - mapped_value: '' - } - ] - }; - - if (type === 'new') { - this.newVertexType.value_mapping.push(newValueMapping); - } else { - this.editedVertexMap!.value_mapping.push(newValueMapping); - } - } - - @action - addEdgeValueMapping(type: 'new' | 'edit') { - const newValueMapping = { - column_name: '', - values: [ - { - column_value: '', - mapped_value: '' - } - ] - }; - - if (type === 'new') { - this.newEdgeType.value_mapping.push(newValueMapping); - } else { - this.editedEdgeMap!.value_mapping.push(newValueMapping); - } - } - - @action - addVertexValueMappingValue(type: 'new' | 'edit', vertexMapIndex: number) { - const newValue = { - column_value: '', - mapped_value: '' - }; - - if (type === 'new') { - this.newVertexType.value_mapping[vertexMapIndex].values.push(newValue); - } else { - this.editedVertexMap!.value_mapping[vertexMapIndex].values.push(newValue); - } - } - - @action - addEdgeValueMappingValue(type: 'new' | 'edit', vertexMapIndex: number) { - const newValue = { - column_value: '', - mapped_value: '' - }; - - if (type === 'new') { - this.newEdgeType.value_mapping[vertexMapIndex].values.push(newValue); - } else { - this.editedEdgeMap!.value_mapping[vertexMapIndex].values.push(newValue); - } - } - - @action - editVertexValueMappingColumnName( - type: 'new' | 'edit', - value: string, - valueMapIndex: number - ) { - if (type === 'new') { - this.newVertexType.value_mapping[valueMapIndex].column_name = value; - } else { - this.editedVertexMap!.value_mapping[valueMapIndex].column_name = value; - } - } - - @action - editEdgeValueMappingColumnName( - type: 'new' | 'edit', - value: string, - valueMapIndex: number - ) { - if (type === 'new') { - this.newEdgeType.value_mapping[valueMapIndex].column_name = value; - } else { - this.editedEdgeMap!.value_mapping[valueMapIndex].column_name = value; - } - } - - @action - editVertexValueMappingColumnValueName( - type: 'new' | 'edit', - field: 'column_value' | 'mapped_value', - value: string, - valueMapIndex: number, - valueIndex: number - ) { - if (type === 'new') { - this.newVertexType.value_mapping[valueMapIndex].values[valueIndex][ - field - ] = value; - } else { - this.editedVertexMap!.value_mapping[valueMapIndex].values[valueIndex][ - field - ] = value; - } - } - - @action - editEdgeValueMappingColumnValueName( - type: 'new' | 'edit', - field: 'column_value' | 'mapped_value', - value: string, - valueMapIndex: number, - valueIndex: number - ) { - if (type === 'new') { - this.newEdgeType.value_mapping[valueMapIndex].values[valueIndex][ - field - ] = value; - } else { - this.editedEdgeMap!.value_mapping[valueMapIndex].values[valueIndex][ - field - ] = value; - } - } - - @action - removeVertexValueMapping(type: 'new' | 'edit', valueMapIndex: number) { - if (type === 'new') { - remove( - this.newVertexType.value_mapping, - (_, index) => index === valueMapIndex - ); - } else { - remove( - this.editedVertexMap!.value_mapping, - (_, index) => index === valueMapIndex - ); - } - } - - @action - removeEdgeValueMapping(type: 'new' | 'edit', valueMapIndex: number) { - if (type === 'new') { - remove( - this.newEdgeType.value_mapping, - (_, index) => index === valueMapIndex - ); - } else { - remove( - this.editedEdgeMap!.value_mapping, - (_, index) => index === valueMapIndex - ); - } - } - - @action - removeVertexValueMappingValue( - type: 'new' | 'edit', - valueMapIndex: number, - valueIndex: number - ) { - if (type === 'new') { - remove( - this.newVertexType.value_mapping[valueMapIndex].values, - (_, index) => index === valueIndex - ); - } else { - remove( - this.editedVertexMap!.value_mapping[valueMapIndex].values, - (_, index) => index === valueIndex - ); - } - } - - @action - removeEdgeValueMappingValue( - type: 'new' | 'edit', - valueMapIndex: number, - valueIndex: number - ) { - if (type === 'new') { - remove( - this.newEdgeType.value_mapping[valueMapIndex].values, - (_, index) => index === valueIndex - ); - } else { - remove( - this.editedEdgeMap!.value_mapping[valueMapIndex].values, - (_, index) => index === valueIndex - ); - } - } - - @action - resetNewMap(newMap: 'vertex' | 'edge') { - if (newMap === 'vertex') { - this.newVertexType = createNewVertexType(); - } else { - this.newEdgeType = createNewEdgeType(); - } - } - - @action - resetEditMapping(editMapping: 'vertex' | 'edge') { - if (editMapping === 'vertex') { - this.editedVertexMap = createNewVertexType(); - } else { - this.editedEdgeMap = createNewEdgeType(); - } - } - - @action - validateFileInfo( - category: 'delimiter' | 'charset' | 'date_format' | 'skipped_line' - ) { - if (this.selectedFileInfo?.file_setting[category] === '') { - this.validateFileInfoErrorMessage[category] = i18next.t( - 'addition.store.cannot-be-empty1' - ); - return; - } - - if (category === 'date_format') { - const date_format = this.selectedFileInfo!.file_setting.date_format; - - if ( - date_format === 'yyyy-MM-dd' || - date_format === 'yyyy-MM-dd HH:mm:ss' || - date_format === 'yyyy-MM-dd HH:mm:ss.SSS' - ) { - this.validateFileInfoErrorMessage.date_format = ''; - return; - } - - if ( - !validateGraphProperty( - 'DATE', - // hack - this.selectedFileInfo!.file_setting.date_format.replace(/\w/g, '1') - ) - ) { - this.validateFileInfoErrorMessage.date_format = i18next.t( - 'addition.store.incorrect-time-format' - ); - return; - } - } - - this.validateFileInfoErrorMessage[category] = ''; - } - - @action - validateValueMapping( - type: 'vertex' | 'edge', - status: 'new' | 'edit', - category: 'null_values' | 'value_mappings', - optionIndex: number, - valueMapOptions?: { - field: 'column_name' | 'column_value' | 'mapped_value'; - valueIndex?: number; - } - ) { - let mapping; - - if (type === 'vertex') { - mapping = status === 'new' ? this.newVertexType : this.editedVertexMap; - } else { - mapping = status === 'new' ? this.newEdgeType : this.editedEdgeMap; - } - - if (category === 'null_values') { - const value = mapping!.null_values.customized[optionIndex]; - - if (isEmpty(value)) { - this.validateAdvanceConfigErrorMessage.null_values[ - optionIndex - ] = i18next.t('data-configs.validator.no-empty'); - } else { - this.validateAdvanceConfigErrorMessage.null_values[optionIndex] = ''; - } - } - - if (category === 'value_mappings') { - const { column_name, values } = mapping!.value_mapping[optionIndex]; - - if (valueMapOptions?.field === 'column_name') { - this.validateAdvanceConfigErrorMessage.value_mapping[ - optionIndex - ].column_name = isEmpty(column_name) - ? i18next.t('data-configs.validator.no-empty') - : ''; - } else { - const { column_value, mapped_value } = values[ - valueMapOptions?.valueIndex! - ]; - - if (valueMapOptions?.field === 'column_value') { - this.validateAdvanceConfigErrorMessage.value_mapping[ - optionIndex - ].values[valueMapOptions!.valueIndex!].column_value = isEmpty( - column_value - ) - ? i18next.t('data-configs.validator.no-empty') - : ''; - } - - if (valueMapOptions?.field === 'mapped_value') { - this.validateAdvanceConfigErrorMessage.value_mapping[ - optionIndex - ].values[valueMapOptions!.valueIndex!].mapped_value = isEmpty( - mapped_value - ) - ? i18next.t('data-configs.validator.no-empty') - : ''; - } - } - } - } - - @action - addValidateValueMappingOption( - category: 'null_values' | 'value_mappings' | 'value_mappings_value', - valueMapIndex?: number - ) { - if (category === 'null_values') { - this.validateAdvanceConfigErrorMessage.null_values.push(''); - } - - if (category === 'value_mappings') { - this.validateAdvanceConfigErrorMessage.value_mapping.push({ - column_name: '', - values: [ - { - column_value: '', - mapped_value: '' - } - ] - }); - } - - if (category === 'value_mappings_value') { - this.validateAdvanceConfigErrorMessage.value_mapping[ - valueMapIndex! - ].values.push({ - column_value: '', - mapped_value: '' - }); - } - } - - @action - syncValidateNullAndValueMappings(type: 'vertex' | 'edge') { - const { null_values, value_mapping } = - type === 'vertex' ? this.editedVertexMap! : this.editedEdgeMap!; - - null_values.customized.forEach(() => { - this.validateAdvanceConfigErrorMessage.null_values.push(''); - }); - - value_mapping.forEach(({ values }) => { - this.validateAdvanceConfigErrorMessage.value_mapping.push({ - column_name: '', - values: values.map(() => ({ - column_value: '', - mapped_value: '' - })) - }); - }); - } - - @action - removeValidateValueMappingOption( - type: 'vertex' | 'edge', - status: 'new' | 'edit', - category: 'null_values' | 'value_mappings' | 'value_mappings_value', - optionIndex: number, - valueMappingValueIndex?: number - ) { - let mapping; - - if (type === 'vertex') { - mapping = status === 'new' ? this.newVertexType : this.editedVertexMap; - } else { - mapping = status === 'new' ? this.newEdgeType : this.editedEdgeMap; - } - - if (category === 'null_values') { - remove( - this.validateAdvanceConfigErrorMessage.null_values, - (_, index) => index === optionIndex - ); - } - - if (category === 'value_mappings') { - remove( - this.validateAdvanceConfigErrorMessage.value_mapping, - (_, index) => index === optionIndex - ); - } - - if (category === 'value_mappings_value') { - remove( - this.validateAdvanceConfigErrorMessage.value_mapping[optionIndex] - .values, - (_, index) => index === valueMappingValueIndex - ); - } - } - - @action - allowAddPropertyMapping(type: 'vertex' | 'edge') { - let valueMapping; - - if (type === 'vertex') { - valueMapping = this.isExpandTypeConfig - ? this.editedVertexMap!.value_mapping - : this.newVertexType.value_mapping; - } else { - valueMapping = this.isExpandTypeConfig - ? this.editedEdgeMap!.value_mapping - : this.newEdgeType.value_mapping; - } - - return valueMapping.every((_, valueMapIndex) => - this.allowAddPropertyValueMapping(type, valueMapIndex) - ); - } - - @action - allowAddPropertyValueMapping(type: 'vertex' | 'edge', valueMapIndex: number) { - let currentValueMapping; - - if (type === 'vertex') { - currentValueMapping = this.isExpandTypeConfig - ? this.editedVertexMap!.value_mapping - : this.newVertexType.value_mapping; - } else { - currentValueMapping = this.isExpandTypeConfig - ? this.editedEdgeMap!.value_mapping - : this.newEdgeType.value_mapping; - } - - // when status is edit, init currentValueMapping is empty - // it's weired that TS has no error in destruction below - // where column_name or values could be undefined - // if (isEmpty(currentValueMapping[valueMapIndex])) { - // return true; - // } - - const { column_name, values } = currentValueMapping[valueMapIndex]; - - return ( - !isEmpty(column_name) && - values.every( - ({ column_value, mapped_value }) => - !isEmpty(column_value) && !isEmpty(mapped_value) - ) && - this.validateAdvanceConfigErrorMessage.value_mapping[ - valueMapIndex - ].values.every( - ({ column_value, mapped_value }) => - isEmpty(column_value) && isEmpty(mapped_value) - ) - ); - } - - @action - resetValidateFileInfoErrorMessage() { - this.validateFileInfoErrorMessage = createValidateFileInfoErrorMessage(); - } - - @action - resetValidateValueMapping(category: 'null_values' | 'value_mapping' | 'all') { - switch (category) { - case 'null_values': - case 'value_mapping': - this.validateAdvanceConfigErrorMessage[category] = []; - return; - case 'all': - this.validateAdvanceConfigErrorMessage = createValidateAdvanceConfigErrorMessage(); - return; - } - } - - @action - resetDataMaps() { - this.isExpandTypeConfig = false; - this.isAddNewTypeConfig = false; - - this.newVertexType = createNewVertexType(); - this.editedVertexMap = null; - - this.newEdgeType = createNewEdgeType(); - this.editedEdgeMap = null; - - this.validateFileInfoErrorMessage = createValidateFileInfoErrorMessage(); - this.validateAdvanceConfigErrorMessage = createValidateAdvanceConfigErrorMessage(); - - this.requestStatus = initRequestStatus(); - this.errorInfo = initErrorInfo(); - } - - @action - dispose() { - this.resetDataMaps(); - - this.readOnly = false; - this.lock = false; - this.isIrregularProcess = false; - this.isExpandFileConfig = true; - this.fileMapInfos = []; - this.preFetchedFileMapInfos = []; - this.selectedFileId = NaN; - this.selectedFileInfo = null; - } - - fetchDataMaps = flow(function* fetchDataMaps(this: DataMapStore) { - this.requestStatus.fetchDataMaps = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .get>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/file-mappings`, - { - params: { - page_size: -1 - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchDataMaps.code = result.data.status; - throw new Error(result.data.message); - } - - this.fileMapInfos = result.data.data.records; - this.requestStatus.fetchDataMaps = 'success'; - } catch (error) { - this.requestStatus.fetchDataMaps = 'failed'; - this.errorInfo.fetchDataMaps.message = error.message; - console.error(error.message); - } - }); - - updateFileConfig = flow(function* updateFileConfig( - this: DataMapStore, - fileId: number - ) { - this.requestStatus.updateFileConfig = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/file-mappings/${fileId}/file-setting`, - this.selectedFileInfo?.file_setting - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.updateFileConfig.code = result.data.status; - throw new Error(result.data.message); - } - - this.selectedFileInfo!.file_setting = result.data.data.file_setting; - this.requestStatus.updateFileConfig = 'success'; - } catch (error) { - this.requestStatus.updateFileConfig = 'failed'; - this.errorInfo.updateFileConfig.message = error.message; - console.error(error.message); - } - }); - - updateVertexMap = flow(function* updateVertexMap( - this: DataMapStore, - method: 'add' | 'upgrade' | 'delete', - fileId: number - ) { - this.requestStatus.updateVertexMap = 'pending'; - - try { - let result: AxiosResponse>; - - switch (method) { - case 'add': { - const newVertexType = cloneDeep(this.newVertexType); - - if ( - newVertexType.null_values.checked.includes('NULL') && - !newVertexType.null_values.checked.includes('null') - ) { - newVertexType.null_values.checked.push('null'); - } - - result = yield axios - .post( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/file-mappings/${fileId}/vertex-mappings`, - newVertexType - ) - .catch(checkIfLocalNetworkOffline); - break; - } - case 'upgrade': { - const editedVertexMap = cloneDeep(this.editedVertexMap); - - if ( - editedVertexMap!.null_values.checked.includes('NULL') && - !editedVertexMap!.null_values.checked.includes('null') - ) { - editedVertexMap!.null_values.checked.push('null'); - } - - result = yield axios - .put( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/file-mappings/${fileId}/vertex-mappings/${this.editedVertexMap?.id}`, - editedVertexMap - ) - .catch(checkIfLocalNetworkOffline); - break; - } - case 'delete': - result = yield axios - .delete( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/file-mappings/${fileId}/vertex-mappings/${this.editedVertexMap?.id}` - ) - .catch(checkIfLocalNetworkOffline); - break; - } - - if (result.data.status !== 200) { - this.errorInfo.updateVertexMap.code = result.data.status; - throw new Error(result.data.message); - } - - this.selectedFileInfo!.vertex_mappings = result.data.data.vertex_mappings; - this.requestStatus.updateVertexMap = 'success'; - } catch (error) { - this.requestStatus.updateVertexMap = 'failed'; - this.errorInfo.updateVertexMap.message = error.message; - console.error(error.message); - } - }); - - updateEdgeMap = flow(function* updateEdgeMap( - this: DataMapStore, - method: 'add' | 'upgrade' | 'delete', - fileId: number - ) { - this.requestStatus.updateEdgeMap = 'pending'; - - try { - let result: AxiosResponse>; - - switch (method) { - case 'add': { - const newEdgeType = cloneDeep(this.newEdgeType); - - if ( - newEdgeType.null_values.checked.includes('NULL') && - !newEdgeType.null_values.checked.includes('null') - ) { - newEdgeType.null_values.checked.push('null'); - } - - result = yield axios - .post( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/file-mappings/${fileId}/edge-mappings`, - newEdgeType - ) - .catch(checkIfLocalNetworkOffline); - break; - } - case 'upgrade': { - const editedEdgeMap = cloneDeep(this.editedEdgeMap); - - if ( - editedEdgeMap!.null_values.checked.includes('NULL') && - !editedEdgeMap!.null_values.checked.includes('null') - ) { - editedEdgeMap!.null_values.checked.push('null'); - } - - result = yield axios - .put( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/file-mappings/${fileId}/edge-mappings/${this.editedEdgeMap?.id}`, - this.editedEdgeMap - ) - .catch(checkIfLocalNetworkOffline); - break; - } - case 'delete': - result = yield axios - .delete( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/file-mappings/${fileId}/edge-mappings/${this.editedEdgeMap?.id}` - ) - .catch(checkIfLocalNetworkOffline); - break; - } - - if (result.data.status !== 200) { - this.errorInfo.updateEdgeMap.code = result.data.status; - throw new Error(result.data.message); - } - - this.selectedFileInfo!.edge_mappings = result.data.data.edge_mappings; - this.requestStatus.updateEdgeMap = 'success'; - } catch (error) { - this.requestStatus.updateEdgeMap = 'failed'; - this.errorInfo.updateEdgeMap.message = error.message; - console.error(error.message); - } - }); - - deleteVertexMap = flow(function* deleteVertexMap( - this: DataMapStore, - mapIndex: number - ) { - this.requestStatus.deleteVertexMap = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .delete>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${ - this.dataImportRootStore.currentJobId - }/file-mappings/${this.selectedFileInfo!.id}/vertex-mappings/${ - this.selectedFileInfo?.vertex_mappings[mapIndex].id - }` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.deleteVertexMap.code = result.data.status; - throw new Error(result.data.message); - } - - this.selectedFileInfo!.vertex_mappings = result.data.data.vertex_mappings; - this.requestStatus.deleteVertexMap = 'success'; - } catch (error) { - this.requestStatus.deleteVertexMap = 'failed'; - this.errorInfo.deleteVertexMap.message = error.message; - console.error(error.message); - } - }); - - deleteEdgeMap = flow(function* deleteEdgeMap( - this: DataMapStore, - mapIndex: number - ) { - this.requestStatus.deleteEdgeMap = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .delete>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${ - this.dataImportRootStore.currentJobId - }/file-mappings/${this.selectedFileInfo!.id}/edge-mappings/${ - this.selectedFileInfo?.edge_mappings[mapIndex].id - }` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.deleteEdgeMap.code = result.data.status; - throw new Error(result.data.message); - } - - this.selectedFileInfo!.edge_mappings = result.data.data.edge_mappings; - this.requestStatus.deleteEdgeMap = 'success'; - } catch (error) { - this.requestStatus.deleteEdgeMap = 'failed'; - this.errorInfo.deleteEdgeMap.message = error.message; - console.error(error.message); - } - }); -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/serverDataImportStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/serverDataImportStore.ts deleted file mode 100644 index c25c2f4ff..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/dataImportStore/serverDataImportStore.ts +++ /dev/null @@ -1,516 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { observable, action, flow, computed } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; -import { size, isUndefined } from 'lodash-es'; -import isInt from 'validator/lib/isInt'; - -import { DataImportRootStore } from './dataImportRootStore'; -import i18next from '../../../i18n'; -import { baseUrl, responseData } from '../../types/common'; -import { - LoadParameter, - ImportTasks, - AllImportTasksRecords -} from '../../types/GraphManagementStore/dataImportStore'; -import { - initRequestStatus, - initErrorInfo, - createValidateFileInfoErrorMessage -} from '../../../stores/factory/dataImportStore/serverDataImportStore'; -import { checkIfLocalNetworkOffline } from '../../utils'; - -export class ServerDataImportStore { - dataImportRootStore: DataImportRootStore; - - constructor(dataImportRootStore: DataImportRootStore) { - this.dataImportRootStore = dataImportRootStore; - } - - @observable requestStatus = initRequestStatus(); - @observable errorInfo = initErrorInfo(); - - // v1.3.1 - @observable readOnly = false; - @observable importConfigReadOnly = false; - @observable isIrregularProcess = false; - - @observable isExpandImportConfig = true; - @observable isImporting = false; - @observable isImportFinished = false; - @observable importConfigs: LoadParameter | null = null; - @observable - validateImportConfigErrorMessage = createValidateFileInfoErrorMessage(); - - @observable importTasks: ImportTasks[] = []; - @observable.ref fileImportTaskIds: number[] = []; - @observable errorLogs = ''; - - @computed get isServerStartImport() { - return this.requestStatus.startImport !== 'standby'; - } - - @computed get successImportFileStatusNumber() { - return size(this.importTasks.filter(({ status }) => status === 'SUCCEED')); - } - - @computed get pausedImportFileNumber() { - return size(this.importTasks.filter(({ status }) => status === 'PAUSED')); - } - - @computed get abortImportFileNumber() { - return size(this.importTasks.filter(({ status }) => status === 'STOPPED')); - } - - @action - switchReadOnly(isReadOnly: boolean) { - this.readOnly = isReadOnly; - } - - @action - switchImportConfigReadOnly(isReadOnly: boolean) { - this.importConfigReadOnly = isReadOnly; - } - - @action - switchIrregularProcess(flag: boolean) { - this.isIrregularProcess = flag; - } - - @action - switchExpandImportConfig(flag: boolean) { - this.isExpandImportConfig = flag; - } - - @action - switchImporting(flag: boolean) { - this.isImporting = flag; - } - - @action - switchImportFinished(flag: boolean) { - this.isImportFinished = flag; - } - - @action - switchFetchImportStatus(status: string) { - this.requestStatus.fetchImportTasks = status; - } - - @action - syncImportConfigs(configs: LoadParameter) { - this.importConfigs = configs; - } - - @action - mutateImportConfigs( - key: T, - value: LoadParameter[T] - ) { - this.importConfigs![key] = value; - } - - @action - validateImportConfigs(key: keyof LoadParameter) { - switch (key) { - case 'max_parse_errors': - case 'max_insert_errors': - if (this.importConfigs![key] === '') { - this.validateImportConfigErrorMessage[key] = i18next.t( - 'server-data-import.validator.no-empty' - ); - - return; - } else if ( - !isInt(String(this.importConfigs![key]), { min: -1 }) || - String(Number(this.importConfigs![key])) === '0' - ) { - this.validateImportConfigErrorMessage[key] = i18next.t( - 'server-data-import.validator.need-integer-with-negative' - ); - - return; - } - - break; - case 'insert_timeout': - case 'retry_interval': - case 'retry_times': - if (this.importConfigs![key] === '') { - this.validateImportConfigErrorMessage[key] = i18next.t( - 'server-data-import.validator.no-empty' - ); - - return; - } else if (!isInt(String(this.importConfigs![key]), { min: 1 })) { - this.validateImportConfigErrorMessage[key] = i18next.t( - 'server-data-import.validator.need-integer' - ); - - return; - } - - break; - } - - this.validateImportConfigErrorMessage[key] = ''; - } - - @action - resetValidateImportConfigs() { - this.validateImportConfigErrorMessage = createValidateFileInfoErrorMessage(); - } - - @action - resetImportTasks() { - this.importTasks = []; - } - - @action - dispose() { - this.readOnly = false; - this.importConfigReadOnly = false; - this.isIrregularProcess = false; - this.requestStatus = initRequestStatus(); - this.errorInfo = initErrorInfo(); - this.errorLogs = ''; - this.isExpandImportConfig = true; - this.isImporting = false; - this.isImportFinished = false; - this.importConfigs = null; - this.importTasks = []; - this.fileImportTaskIds = []; - this.validateImportConfigErrorMessage = createValidateFileInfoErrorMessage(); - } - - fetchImportTasks = flow(function* fetchImportTasks( - this: ServerDataImportStore, - taskIds: number[] - ) { - this.requestStatus.fetchImportTasks = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .get>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${ - this.dataImportRootStore.currentJobId - }/load-tasks/ids?${taskIds.map((id) => 'task_ids=' + id).join('&')}` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchImportTasks.code = result.data.status; - throw new Error(result.data.message); - } - - this.importTasks = result.data.data; - - if (!this.importTasks.some(({ status }) => status === 'RUNNING')) { - this.switchFetchImportStatus('pending'); - this.switchImporting(false); - this.switchImportFinished(true); - } - - this.requestStatus.fetchImportTasks = 'success'; - } catch (error) { - this.requestStatus.fetchImportTasks = 'failed'; - this.errorInfo.fetchImportTasks.message = error.message; - console.error(error.message); - } - }); - - fetchAllImportTasks = flow(function* fetchAllImportTasks( - this: ServerDataImportStore - ) { - this.requestStatus.fetchImportTasks = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .get>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/load-tasks` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchImportTasks.code = result.data.status; - throw new Error(result.data.message); - } - - this.importTasks = result.data.data.records; - - if (!this.importTasks.some(({ status }) => status === 'RUNNING')) { - this.switchFetchImportStatus('pending'); - this.switchImporting(false); - this.switchImportFinished(true); - } - - this.requestStatus.fetchImportTasks = 'success'; - } catch (error) { - this.requestStatus.fetchImportTasks = 'failed'; - this.errorInfo.fetchImportTasks.message = error.message; - console.error(error.message); - } - }); - - setConfigParams = flow(function* setConfigParams( - this: ServerDataImportStore - ) { - this.requestStatus.setConfigParams = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/file-mappings/load-parameter`, - this.importConfigs - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.setConfigParams.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.setConfigParams = 'success'; - } catch (error) { - this.requestStatus.setConfigParams = 'failed'; - this.errorInfo.setConfigParams.message = error.message; - console.error(error.message); - } - }); - - startImport = flow(function* startImport( - this: ServerDataImportStore, - fileIds: number[] - ) { - this.requestStatus.startImport = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${ - this.dataImportRootStore.currentJobId - }/load-tasks/start?${fileIds - .map((id) => 'file_mapping_ids=' + id) - .join('&')}`, - {} - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.startImport.code = result.data.status; - throw new Error(result.data.message); - } - - this.fileImportTaskIds = result.data.data.map(({ id }) => id); - this.requestStatus.startImport = 'success'; - } catch (error) { - this.requestStatus.startImport = 'failed'; - this.errorInfo.startImport.message = error.message; - console.error(error.message); - } - }); - - pauseImport = flow(function* pauseImport( - this: ServerDataImportStore, - taskId: number - ) { - this.requestStatus.pauseImport = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/load-tasks/pause`, - {}, - { - params: { - task_id: taskId - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.pauseImport.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.pauseImport = 'success'; - } catch (error) { - this.requestStatus.pauseImport = 'failed'; - this.errorInfo.pauseImport.message = error.message; - console.error(error.message); - } - }); - - resumeImport = flow(function* resumeImport( - this: ServerDataImportStore, - taskId: number - ) { - this.requestStatus.resumeImport = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/load-tasks/resume`, - {}, - { - params: { - task_id: taskId - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.resumeImport.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.resumeImport = 'success'; - } catch (error) { - this.requestStatus.resumeImport = 'failed'; - this.errorInfo.resumeImport.message = error.message; - console.error(error.message); - } - }); - - abortImport = flow(function* abortImport( - this: ServerDataImportStore, - taskId: number - ) { - this.requestStatus.abortImport = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/load-tasks/stop`, - {}, - { - params: { - task_id: taskId - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.abortImport.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.abortImport = 'success'; - } catch (error) { - this.requestStatus.abortImport = 'failed'; - this.errorInfo.abortImport.message = error.message; - console.error(error.message); - } - }); - - retryImport = flow(function* retryImport( - this: ServerDataImportStore, - taskId: number - ) { - this.requestStatus.retryImport = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/load-tasks/retry`, - {}, - { - params: { - task_id: taskId - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.retryImport.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.retryImport = 'success'; - } catch (error) { - this.requestStatus.retryImport = 'failed'; - this.errorInfo.retryImport.message = error.message; - console.error(error.message); - } - }); - - deleteTaskImport = flow(function* deleteTaskImport( - this: ServerDataImportStore, - taskId: number - ) { - this.requestStatus.deleteTaskImport = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .delete>( - `${baseUrl}/${this.dataImportRootStore.currentId}/job-manager/${this.dataImportRootStore.currentJobId}/load-tasks/${taskId}` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.deleteTaskImport.code = result.data.status; - throw new Error(result.data.message); - } - - this.requestStatus.deleteTaskImport = 'success'; - } catch (error) { - this.requestStatus.deleteTaskImport = 'failed'; - this.errorInfo.deleteTaskImport.message = error.message; - console.error(error.message); - } - }); - - checkErrorLogs = flow(function* checkErrorLogs( - this: ServerDataImportStore, - id: number, - jobId: number, - taskId: number - ) { - this.requestStatus.checkErrorLogs = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .get>( - `${baseUrl}/${id}/job-manager/${jobId}/load-tasks/${taskId}/reason` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.checkErrorLogs.code = result.data.status; - throw new Error(result.data.message); - } - - this.errorLogs = result.data.data; - this.requestStatus.checkErrorLogs = 'success'; - } catch (error) { - this.requestStatus.checkErrorLogs = 'failed'; - this.errorInfo.checkErrorLogs.message = error.message; - console.error(error.message); - } - }); -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/graphManagementStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/graphManagementStore.ts deleted file mode 100644 index d22e5e782..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/graphManagementStore.ts +++ /dev/null @@ -1,571 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { createContext } from 'react'; -import { observable, action, flow } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; - -import { baseUrl, responseData } from '../types/common'; -import { - LincenseInfo, - GraphData, - GraphDataConfig, - GraphDataPageConfig, - GraphDataResponse -} from '../types/GraphManagementStore/graphManagementStore'; -import i18next from '../../i18n'; - -export class GraphManagementStore { - [key: string]: any; - - // display create new graph layout - @observable showCreateNewGraph = false; - - // display delete modal after dropdown click in GraphList - @observable showDeleteModal = false; - - // disable all other buttons except from the current new/edit layout - @observable selectedEditIndex: number | null = null; - - // values from the Search component - @observable searchWords = ''; - - @observable errorInfo = { - fetchLicenseInfo: { - code: NaN, - message: '' - }, - fetchIdList: { - code: NaN, - message: '' - }, - fetchGraphData: { - code: NaN, - message: '' - }, - AddGraphData: { - code: NaN, - message: '' - }, - upgradeGraphData: { - code: NaN, - message: '' - }, - deleteGraphData: { - code: NaN, - message: '' - } - }; - - // searched results rather than initial fetched result - @observable.shallow isSearched = { - status: false, - value: '' - }; - - // is sidebar in graphdata details has expanded - @observable isExpanded = false; - - // is clicekd submit or save to validate - @observable isValidated = false; - - @observable.shallow requestStatus = { - fetchLicenseInfo: 'standby', - fetchIdList: 'standby', - fetchGraphData: 'standby', - AddGraphData: 'standby', - upgradeGraphData: 'standby', - deleteGraphData: 'standby' - }; - - @observable validateErrorMessage: Record = { - name: '', - graph: '', - host: '', - port: '', - usernameAndPassword: '' - }; - - @observable.shallow newGraphData: GraphDataConfig = { - name: '', - graph: '', - host: '', - port: '', - username: '', - password: '' - }; - - @observable.shallow editGraphData: GraphDataConfig = { - name: '', - graph: '', - host: '', - port: '', - username: '', - password: '' - }; - - @observable.ref idList: { id: number; name: string }[] = []; - @observable.ref graphData: GraphData[] = []; - @observable.ref licenseInfo: LincenseInfo | null = null; - - @observable.shallow graphDataPageConfig: GraphDataPageConfig = { - pageNumber: 1, - pageSize: 10, - pageTotal: 0 - }; - - @action - dispose() { - this.showCreateNewGraph = false; - this.showDeleteModal = false; - this.selectedEditIndex = null; - this.searchWords = ''; - this.isSearched = { - status: false, - value: '' - }; - this.isValidated = false; - this.isExpanded = false; - this.requestStatus = { - fetchLicenseInfo: 'standby', - fetchIdList: 'standby', - fetchGraphData: 'standby', - AddGraphData: 'standby', - upgradeGraphData: 'standby', - deleteGraphData: 'standby' - }; - this.graphData = []; - this.graphDataPageConfig = { - pageNumber: 1, - pageSize: 10, - pageTotal: 0 - }; - this.resetGraphDataConfig('new'); - this.resetGraphDataConfig('edit'); - this.resetErrorInfo(); - this.resetValidateErrorMessage(); - } - - @action - switchCreateNewGraph(flag: boolean) { - this.showCreateNewGraph = flag; - } - - @action - switchDeleteModal(flag: boolean) { - this.showDeleteModal = flag; - } - - @action - switchExpanded(flag: boolean) { - this.isExpanded = flag; - } - - @action - changeSelectedEditIndex(index: number | null) { - this.selectedEditIndex = index; - } - - @action - mutateSearchWords(text: string) { - this.searchWords = text; - } - - @action - mutateGraphDataConfig(key: string, type: 'new' | 'edit') { - return (eventTarget: HTMLInputElement) => { - this.isValidated = false; - - if (type === 'new') { - this.newGraphData[key] = eventTarget.value; - } - - if (type === 'edit') { - this.editGraphData[key] = eventTarget.value; - } - }; - } - - @action - swtichIsSearchedStatus(isSearched: boolean) { - this.isSearched.status = isSearched; - - isSearched - ? (this.isSearched.value = this.searchWords) - : (this.isSearched.value = ''); - } - - @action - fillInGraphDataConfig(index: number) { - this.editGraphData.id = String(this.graphData[index].id); - this.editGraphData.name = this.graphData[index].name; - this.editGraphData.graph = this.graphData[index].graph; - this.editGraphData.host = this.graphData[index].host; - this.editGraphData.port = String(this.graphData[index].port); - this.editGraphData.username = this.graphData[index].username; - this.editGraphData.password = this.graphData[index].password; - } - - @action - fillInGraphDataDefaultConfig() { - this.newGraphData.name = 'test'; - this.newGraphData.graph = 'hugegraph'; - this.newGraphData.host = '0.0.0.0'; - this.newGraphData.port = '8080'; - } - - @action - resetGraphDataConfig(type: 'new' | 'edit') { - if (type === 'new') { - Object.keys(this.newGraphData).forEach((key) => { - this.newGraphData[key] = ''; - }); - } - - if (type === 'edit') { - Object.keys(this.newGraphData).forEach((key) => { - this.editGraphData[key] = ''; - }); - } - } - - @action - mutatePageNumber(pageNumber: number) { - this.graphDataPageConfig.pageNumber = pageNumber; - } - - @action - validate(type: 'new' | 'edit') { - const nameReg = /^[A-Za-z]\w{0,47}$/; - const hostReg = /((\d{1,3}\.){3}\d{1,3}|([\w!~*'()-]+\.)*[\w!~*'()-]+)$/; - const portReg = /^([1-9]|[1-9]\d{1}|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/; - const dataName = type + 'GraphData'; - let readyToSubmit = true; - - this.resetValidateErrorMessage(); - - if (!nameReg.test(this[dataName].name)) { - this[dataName].name.length === 0 - ? (this.validateErrorMessage.name = i18next.t( - 'addition.store.required' - )) - : (this.validateErrorMessage.name = i18next.t( - 'addition.store.no-match-input-requirements' - )); - readyToSubmit = false; - } - - if (!nameReg.test(this[dataName].graph)) { - this[dataName].graph.length === 0 - ? (this.validateErrorMessage.graph = i18next.t( - 'addition.store.required' - )) - : (this.validateErrorMessage.graph = i18next.t( - 'addition.store.no-match-input-requirements' - )); - readyToSubmit = false; - } - - if (!hostReg.test(this[dataName].host)) { - this[dataName].host.length === 0 - ? (this.validateErrorMessage.host = i18next.t( - 'addition.store.required' - )) - : (this.validateErrorMessage.host = i18next.t('addition.store.rule1')); - readyToSubmit = false; - } - - if (!portReg.test(this[dataName].port)) { - this[dataName].port.length === 0 - ? (this.validateErrorMessage.port = i18next.t( - 'addition.store.required' - )) - : (this.validateErrorMessage.port = i18next.t('addition.store.rule2')); - readyToSubmit = false; - } - - if ( - dataName === 'newGraphData' && - ((this[dataName].username.length !== 0 && - this[dataName].password.length === 0) || - (this[dataName].username.length === 0 && - this[dataName].password.length !== 0)) - ) { - this.validateErrorMessage.usernameAndPassword = i18next.t( - 'addition.store.rule3' - ); - readyToSubmit = false; - } - - return readyToSubmit; - } - - @action - switchValidateStatus(flag: boolean) { - this.isValidated = flag; - } - - @action - resetErrorInfo() { - this.errorInfo = { - fetchLicenseInfo: { - code: NaN, - message: '' - }, - fetchIdList: { - code: NaN, - message: '' - }, - fetchGraphData: { - code: NaN, - message: '' - }, - AddGraphData: { - code: NaN, - message: '' - }, - upgradeGraphData: { - code: NaN, - message: '' - }, - deleteGraphData: { - code: NaN, - message: '' - } - }; - } - - @action - resetValidateErrorMessage() { - Object.keys(this.validateErrorMessage).forEach((key) => { - this.validateErrorMessage[key] = ''; - }); - } - - fetchLicenseInfo = flow(function* fetchLicenseInfo( - this: GraphManagementStore - ) { - this.resetErrorInfo(); - this.requestStatus.fetchLicenseInfo = 'pending'; - - try { - const result: AxiosResponse> = yield axios.get( - '/about' - ); - - if (result.data.status !== 200) { - this.errorInfo.fetchLicenseInfo.code = result.data.status; - throw new Error(result.data.message); - } - - this.licenseInfo = result.data.data; - } catch (error) { - this.requestStatus.fetchLicenseInfo = 'failed'; - this.errorInfo.fetchLicenseInfo.message = error.message; - console.error(error.message); - } - }); - - fetchIdList = flow(function* fetchIdList(this: GraphManagementStore) { - this.resetErrorInfo(); - this.requestStatus.fetchIdList = 'pending'; - - try { - const result: AxiosResponse = yield axios.get< - GraphData - >(baseUrl, { - params: { - page_size: -1 - } - }); - - if (result.data.status === 200 || result.data.status === 401) { - if (result.data.status === 200) { - this.requestStatus.fetchIdList = 'success'; - } - - this.idList = result.data.data.records.map(({ id, name }) => ({ - id, - name - })); - - this.graphData = result.data.data.records; - this.graphDataPageConfig.pageTotal = result.data.data.total; - } - - if (result.data.status !== 200) { - this.errorInfo.fetchIdList.code = result.data.status; - throw new Error(result.data.message); - } - } catch (error) { - this.requestStatus.fetchIdList = 'failed'; - this.errorInfo.fetchIdList.message = error.message; - console.error(error.message); - } - }); - - fetchGraphDataList = flow(function* fetchGraphDataList( - this: GraphManagementStore - ) { - this.resetErrorInfo(); - const url = - `${baseUrl}?page_no=${this.graphDataPageConfig.pageNumber}&page_size=${this.graphDataPageConfig.pageSize}` + - (this.isSearched.status && this.searchWords !== '' - ? `&content=${this.searchWords}` - : ''); - - this.requestStatus.fetchGraphData = 'pending'; - - try { - const result: AxiosResponse = yield axios.get< - GraphData - >(url); - - if (result.data.status === 200 || result.data.status === 401) { - if (result.data.status === 200) { - this.requestStatus.fetchGraphData = 'success'; - } - - this.graphData = result.data.data.records; - this.graphDataPageConfig.pageTotal = result.data.data.total; - } - - if (result.data.status !== 200) { - this.errorInfo.fetchGraphData.code = result.data.status; - throw new Error(result.data.message); - } - } catch (error) { - this.requestStatus.fetchGraphData = 'failed'; - this.errorInfo.fetchGraphData.message = error.message; - console.error(error.message); - } - }); - - AddGraphData = flow(function* AddGraphData(this: GraphManagementStore) { - this.resetErrorInfo(); - this.requestStatus.AddGraphData = 'pending'; - const filteredParams = filterParams(this.newGraphData); - - try { - const result: AxiosResponse = yield axios.post< - GraphDataResponse - >(baseUrl, filteredParams); - - if (result.data.status === 200 || result.data.status === 401) { - if (result.data.status === 200) { - this.requestStatus.AddGraphData = 'success'; - } - } - - if (result.data.status !== 200) { - this.errorInfo.AddGraphData.code = result.data.status; - throw new Error(result.data.message); - } - } catch (error) { - this.requestStatus.AddGraphData = 'failed'; - this.errorInfo.AddGraphData.message = error.message; - console.error(error.message); - } - }); - - upgradeGraphData = flow(function* upgradeGraphData( - this: GraphManagementStore, - id: number - ) { - this.resetErrorInfo(); - this.requestStatus.upgradeGraphData = 'pending'; - const filteredParams = filterParams(this.editGraphData); - - try { - const result: AxiosResponse = yield axios.put< - GraphDataResponse - >(`${baseUrl}/${id}`, filteredParams); - - if (result.data.status === 200 || result.data.status === 401) { - if (result.data.status === 200) { - this.requestStatus.upgradeGraphData = 'success'; - } - } - - if (result.data.status !== 200) { - this.errorInfo.upgradeGraphData.code = result.data.status; - throw new Error(result.data.message); - } - } catch (error) { - this.requestStatus.upgradeGraphData = 'failed'; - this.errorInfo.upgradeGraphData.message = error.message; - console.error(error.message); - } - }); - - deleteGraphData = flow(function* deleteGraphData( - this: GraphManagementStore, - id - ) { - this.resetErrorInfo(); - this.requestStatus.deleteGraphData = 'pending'; - - try { - const result: AxiosResponse = yield axios.delete< - GraphDataResponse - >(`${baseUrl}/${id}`); - - if (result.data.status === 200 || result.data.status === 401) { - if (result.data.status === 200) { - this.requestStatus.deleteGraphData = 'success'; - } - - // if current pageNumber has no data after delete, set the pageNumber to the previous - if ( - this.graphData.length === 1 && - this.graphDataPageConfig.pageNumber > 1 - ) { - this.graphDataPageConfig.pageNumber = - this.graphDataPageConfig.pageNumber - 1; - } - } - - if (result.data.status !== 200) { - this.errorInfo.deleteGraphData.code = result.data.status; - throw new Error(result.data.message); - } - } catch (error) { - this.requestStatus.deleteGraphData = 'failed'; - this.errorInfo.deleteGraphData.message = error.message; - console.error(error.message); - } - }); -} - -function filterParams(originParams: GraphDataConfig): GraphDataConfig { - const newParams = {} as GraphDataConfig; - - Object.keys(originParams).forEach((key) => { - const value = originParams[key]; - - if (typeof value !== 'undefined') { - newParams[key] = originParams[key]; - } - }); - - return newParams; -} - -// For DI in subclass -export const GraphManagementStoreInstance = new GraphManagementStore(); - -export default createContext(GraphManagementStoreInstance); diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/edgeTypeStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/edgeTypeStore.ts deleted file mode 100644 index 5fdaca468..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/edgeTypeStore.ts +++ /dev/null @@ -1,1533 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { observable, action, flow, computed } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; -import { cloneDeep, isUndefined, remove } from 'lodash-es'; - -import { MetadataConfigsRootStore } from './metadataConfigsStore'; -import { checkIfLocalNetworkOffline } from '../../utils'; - -import { baseUrl, responseData } from '../../types/common'; -import { - EdgeType, - EditEdgeTypeParams, - EdgeTypeListResponse, - PageConfig, - CheckedReusableData, - EdgeTypeValidateFields, - EdgeTypeValidatePropertyIndexes -} from '../../types/GraphManagementStore/metadataConfigsStore'; - -import SelectedSolidArrowIcon from '../../../assets/imgs/ic_arrow_selected.svg'; -import NoSelectedSolidArrowIcon from '../../../assets/imgs/ic_arrow.svg'; -import SelectedSolidStraightIcon from '../../../assets/imgs/ic_straight_selected.svg'; -import NoSelectedSolidStraightIcon from '../../../assets/imgs/ic_straight.svg'; -import i18next from '../../../i18n'; -export class EdgeTypeStore { - metadataConfigsRootStore: MetadataConfigsRootStore; - - constructor(MetadataConfigsRootStore: MetadataConfigsRootStore) { - this.metadataConfigsRootStore = MetadataConfigsRootStore; - } - - @observable validateLicenseOrMemories = true; - @observable currentTabStatus = 'list'; - - @observable.shallow requestStatus = { - fetchEdgeTypeList: 'pending', - addEdgeType: 'pending', - updateEdgeType: 'pending', - deleteEdgeType: 'pending', - checkConflict: 'pending', - recheckConflict: 'pending', - reuseEdgeType: 'pending' - }; - - @observable errorMessage = ''; - - // should user able to create new vertex type - @observable isCreatedReady = false; - // should user able to create new property index - @observable isAddNewPropertyIndexReady = true; - - // only have to check property - @observable isEditReady = true; - - @observable.ref colorSchemas = [ - '#5c73e6', - '#569380', - '#8ecc93', - '#fe9227', - '#fe5b5d', - '#fd6ace', - '#4d8dda', - '#57c7e3', - '#ffe081', - '#c570ff', - '#2b65ff', - '#0eb880', - '#76c100', - '#ed7600', - '#e65055', - '#a64ee6', - '#108cee', - '#00b5d9', - '#f2ca00', - '#e048ae' - ]; - - @observable.ref edgeShapeSchemas = [ - { - blackicon: NoSelectedSolidArrowIcon, - blueicon: SelectedSolidArrowIcon, - flag: true, - shape: 'solid' - }, - { - blackicon: NoSelectedSolidStraightIcon, - blueicon: SelectedSolidStraightIcon, - flag: false, - shape: 'solid' - } - ]; - - @observable.ref thicknessSchemas = [ - { ch: '粗', en: 'THICK' }, - { ch: '中', en: 'NORMAL' }, - { ch: '细', en: 'FINE' } - ]; - - @observable edgeTypeListPageConfig: PageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - - @observable.shallow newEdgeType: EdgeType = { - name: '', - source_label: '', - target_label: '', - link_multi_times: false, - properties: [], - sort_keys: [], - property_indexes: [], - open_label_index: false, - style: { - color: '#5c73e6', - icon: null, - with_arrow: true, - thickness: 'NORMAL', - display_fields: ['~id'] - } - }; - - @observable.ref edgeTypes: EdgeType[] = []; - - @observable.ref selectedEdgeType: EdgeType | null = null; - @observable.ref selectedEdgeTypeNames: string[] = []; - - @observable.ref editedSelectedEdgeType: EditEdgeTypeParams = { - append_properties: [], - append_property_indexes: [], - remove_property_indexes: [], - style: { - color: null, - icon: null, - with_arrow: null, - thickness: 'NORMAL', - display_fields: [] - } - }; - - @observable addedPropertiesInSelectedEdgeType: Set = new Set(); - - // reuse - @observable reusableEdgeTypes: EdgeType[] = []; - @observable checkedReusableData: CheckedReusableData | null = null; - @observable - editedCheckedReusableData: CheckedReusableData | null = null; - - @observable reusableEdgeTypeNameChangeIndexes: Set = new Set< - number - >(); - @observable reusableVertexTypeNameChangeIndexes: Set = new Set< - number - >(); - @observable reusablePropertyNameChangeIndexes: Set = new Set< - number - >(); - @observable reusablePropertyIndexNameChangeIndexes: Set = new Set< - number - >(); - - @observable validateNewEdgeTypeErrorMessage: Record< - EdgeTypeValidateFields, - string | EdgeTypeValidatePropertyIndexes[] - > = { - name: '', - sourceLabel: '', - targetLabel: '', - properties: '', - sortKeys: '', - propertyIndexes: [], - displayFeilds: [] - }; - - @observable.shallow validateEditEdgeTypeErrorMessage: Record< - 'propertyIndexes', - EdgeTypeValidatePropertyIndexes[] - > = { - propertyIndexes: [] - }; - - @observable validateReuseErrorMessage: Record< - 'edgeType' | 'vertexType' | 'property' | 'property_index', - string - > = { - edgeType: '', - vertexType: '', - property: '', - property_index: '' - }; - - @computed get reusableEdgeTypeDataMap() { - const dataMap: Record> = {}; - - this.reusableEdgeTypes.forEach(({ name }) => { - dataMap[name] = { - key: name, - title: name - }; - }); - - return dataMap; - } - - @computed get isReadyToReuse() { - return ( - this.editedCheckedReusableData && - this.editedCheckedReusableData!.propertykey_conflicts.every( - ({ status }) => status === 'PASSED' || status === 'EXISTED' - ) && - this.editedCheckedReusableData!.vertexlabel_conflicts.every( - ({ status }) => status === 'PASSED' || status === 'EXISTED' - ) && - this.editedCheckedReusableData!.propertyindex_conflicts.every( - ({ status }) => status === 'PASSED' || status === 'EXISTED' - ) && - this.editedCheckedReusableData!.edgelabel_conflicts.every( - ({ status }) => status === 'PASSED' || status === 'EXISTED' - ) && - // no data standingby validation - this.reusableEdgeTypeNameChangeIndexes.size === 0 && - this.reusableVertexTypeNameChangeIndexes.size === 0 && - this.reusablePropertyNameChangeIndexes.size === 0 && - this.reusablePropertyIndexNameChangeIndexes.size === 0 - ); - } - - @action - changeCurrentTabStatus(status: string) { - this.currentTabStatus = status; - } - - @action - mutateNewEdgeType(newEdgeType: EdgeType) { - this.newEdgeType = newEdgeType; - } - - @action - mutateSelectedEdgeTypeNames(names: string[]) { - this.selectedEdgeTypeNames = names; - } - - @action - mutatePageNumber(pageNumber: number) { - this.edgeTypeListPageConfig.pageNumber = pageNumber; - } - - @action - mutatePageSort(sort: 'desc' | 'asc') { - this.edgeTypeListPageConfig.sort = sort; - } - - @action - selectEdgeType(index: number | null) { - if (index === null) { - this.selectedEdgeType = null; - return; - } - - this.selectedEdgeType = cloneDeep(this.edgeTypes[index]); - } - - @action - mutateSelectedProperty(selectedProperty: EdgeType) { - this.selectedEdgeType = selectedProperty; - } - - @action - mutateEditedSelectedEdgeType(editedSelectedEdgeType: EditEdgeTypeParams) { - this.editedSelectedEdgeType = editedSelectedEdgeType; - } - - @action - resetNewEdgeType() { - this.newEdgeType = { - name: '', - source_label: '', - target_label: '', - link_multi_times: false, - properties: [], - sort_keys: [], - property_indexes: [], - open_label_index: false, - style: { - color: '#5c73e6', - icon: null, - with_arrow: true, - thickness: 'NORMAL', - display_fields: ['~id'] - } - }; - - this.isCreatedReady = false; - } - - @action - resetAddedPropertiesInSelectedEdgeType() { - this.addedPropertiesInSelectedEdgeType.clear(); - } - - @action - resetEditedSelectedEdgeType() { - this.editedSelectedEdgeType = { - append_properties: [], - append_property_indexes: [], - remove_property_indexes: [], - style: { - color: null, - icon: null, - with_arrow: null, - thickness: 'NORMAL', - display_fields: [] - } - }; - - this.resetAddedPropertiesInSelectedEdgeType(); - } - - // reuse - - @action - mutateEditedReusableData(newEditedReusableVertexTypes: CheckedReusableData) { - this.editedCheckedReusableData = newEditedReusableVertexTypes; - } - - @action - mutateReusableEdgeTypeChangeIndexes(index: number) { - this.reusableEdgeTypeNameChangeIndexes.add(index); - } - - @action - mutateReusableVertexTypeChangeIndexes(index: number) { - this.reusableVertexTypeNameChangeIndexes.add(index); - } - - @action - mutateReusablePropertyNameChangeIndexes(index: number) { - this.reusablePropertyNameChangeIndexes.add(index); - } - - @action - mutateReusablePropertyIndexNameChangeIndexes(index: number) { - this.reusablePropertyIndexNameChangeIndexes.add(index); - } - - // if cancel clicked, reset to the original name - @action - resetEditedReusableEdgeTypeName(index: number) { - this.editedCheckedReusableData!.edgelabel_conflicts[ - index - ].entity.name = this.checkedReusableData!.edgelabel_conflicts[ - index - ].entity.name; - } - - // if cancel clicked, reset to the original name - @action - resetEditedReusableVertexTypeName(index: number) { - this.editedCheckedReusableData!.vertexlabel_conflicts[ - index - ].entity.name = this.checkedReusableData!.vertexlabel_conflicts[ - index - ].entity.name; - } - - // if cancel clicked, reset to the original name - @action - resetEditedReusablePropertyName(index: number) { - this.editedCheckedReusableData!.propertykey_conflicts[ - index - ].entity.name = this.checkedReusableData!.propertykey_conflicts[ - index - ].entity.name; - } - - // if cancel clicked, reset to the original name - @action - resetEditedReusablePropertyIndexName(index: number) { - this.editedCheckedReusableData!.propertyindex_conflicts[ - index - ].entity.name = this.checkedReusableData!.propertyindex_conflicts[ - index - ].entity.name; - } - - @action - clearReusableNameChangeIndexes() { - this.reusableEdgeTypeNameChangeIndexes.clear(); - this.reusableVertexTypeNameChangeIndexes.clear(); - this.reusablePropertyNameChangeIndexes.clear(); - this.reusablePropertyIndexNameChangeIndexes.clear(); - } - - @action - resetReusableEdgeTypes() { - this.reusableEdgeTypes = []; - } - - @action - validateNewEdgeType(category: EdgeTypeValidateFields, initial = false) { - let isReady = true; - - if (category === 'name') { - if (!/^[\w\u4e00-\u9fa5]{1,128}$/.test(this.newEdgeType.name)) { - if (this.newEdgeType.name.length === 0) { - !initial && - (this.validateNewEdgeTypeErrorMessage.name = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - } else { - !initial && - (this.validateNewEdgeTypeErrorMessage.name = i18next.t( - 'addition.store.rule4' - )); - isReady = false; - } - } else { - this.validateNewEdgeTypeErrorMessage.name = ''; - } - } - - if (category === 'sourceLabel') { - if (this.newEdgeType.source_label === '') { - !initial && - (this.validateNewEdgeTypeErrorMessage.properties = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - } - } - - if (category === 'targetLabel') { - if (this.newEdgeType.target_label === '') { - !initial && - (this.validateNewEdgeTypeErrorMessage.properties = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - } - } - - if (category === 'properties') { - if ( - this.newEdgeType.properties.length === 0 && - this.newEdgeType.link_multi_times - ) { - !initial && - (this.validateNewEdgeTypeErrorMessage.properties = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - } - } - - if (category === 'sortKeys') { - if ( - this.newEdgeType.link_multi_times && - this.newEdgeType.sort_keys.length === 0 - ) { - !initial && - (this.validateNewEdgeTypeErrorMessage.sortKeys = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - } - } - - if (category === 'displayFeilds') { - if (this.newEdgeType.style.display_fields.length === 0) { - !initial && - (this.validateNewEdgeTypeErrorMessage.displayFeilds = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - } - } - - if (category === 'propertyIndexes') { - this.isAddNewPropertyIndexReady = true; - this.validateNewEdgeTypeErrorMessage.propertyIndexes = this.newEdgeType.property_indexes.map( - ({ name, type, fields }) => { - const validatedPropertyIndex = { - name: '', - type: '', - properties: '' - }; - - if (!/^[\w\u4e00-\u9fa5]{1,128}$/.test(name)) { - if (!initial) { - if (name.length !== 0) { - validatedPropertyIndex.name = i18next.t('addition.store.rule4'); - } else { - validatedPropertyIndex.name = i18next.t( - 'addition.store.item-is-required' - ); - } - } - - isReady = false; - this.isAddNewPropertyIndexReady = false; - } else { - validatedPropertyIndex.name = ''; - } - - if (type.length === 0) { - !initial && - (validatedPropertyIndex.type = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - this.isAddNewPropertyIndexReady = false; - } else { - validatedPropertyIndex.type = ''; - } - - if (Array.isArray(fields)) { - if (fields.length === 0) { - !initial && - (validatedPropertyIndex.properties = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - this.isAddNewPropertyIndexReady = false; - } - } else { - validatedPropertyIndex.properties = ''; - } - - return validatedPropertyIndex; - } - ); - } - - return isReady; - } - - @action - validateAllNewEdgeType(initial = false) { - this.isCreatedReady = - this.validateNewEdgeType('name', initial) && - this.validateNewEdgeType('sourceLabel', initial) && - this.validateNewEdgeType('targetLabel', initial) && - this.validateNewEdgeType('properties', initial) && - this.validateNewEdgeType('sortKeys', initial) && - this.validateNewEdgeType('propertyIndexes', initial) && - this.validateNewEdgeType('displayFeilds', initial); - } - - @action - validateEditEdgeType(initial = false) { - this.isEditReady = true; - - this.validateEditEdgeTypeErrorMessage.propertyIndexes = this.editedSelectedEdgeType.append_property_indexes.map( - ({ name, type, fields }) => { - const validatedPropertyIndex = { - name: '', - type: '', - properties: '' - }; - - if (!/^[\w\u4e00-\u9fa5]{1,128}$/.test(name)) { - if (!initial) { - if (name.length !== 0) { - validatedPropertyIndex.name = i18next.t('addition.store.rule4'); - } else { - validatedPropertyIndex.name = i18next.t( - 'addition.store.item-is-required' - ); - } - } - - this.isEditReady = false; - } else { - validatedPropertyIndex.name = ''; - } - - if (type.length === 0) { - !initial && - (validatedPropertyIndex.type = i18next.t( - 'addition.store.item-is-required' - )); - this.isEditReady = false; - } else { - validatedPropertyIndex.type = ''; - } - - if (Array.isArray(fields)) { - if (fields.length === 0) { - !initial && - (validatedPropertyIndex.properties = i18next.t( - 'addition.store.item-is-required' - )); - this.isEditReady = false; - } - } else { - validatedPropertyIndex.properties = ''; - } - - return validatedPropertyIndex; - } - ); - } - - @action - validateReuseData( - category: 'edgeType' | 'vertexType' | 'property' | 'property_index', - originalValue: string, - newValue: string - ) { - if (!/^[\w\u4e00-\u9fa5]{1,128}$/.test(newValue)) { - if (newValue.length === 0) { - this.validateReuseErrorMessage[category] = i18next.t( - 'addition.store.item-is-required' - ); - } else { - this.validateReuseErrorMessage[category] = i18next.t( - 'addition.store.rule4' - ); - } - - return false; - } - - // if value has changed - if (originalValue !== newValue) { - if (category === 'edgeType') { - if ( - !isUndefined( - this.checkedReusableData!.edgelabel_conflicts.find( - ({ entity }) => entity.name === newValue - ) - ) - ) { - this.validateReuseErrorMessage[category] = i18next.t( - 'addition.store.same-edge-name-notice' - ); - - return false; - } - } - - if (category === 'vertexType') { - if ( - !isUndefined( - this.checkedReusableData!.vertexlabel_conflicts.find( - ({ entity }) => entity.name === newValue - ) - ) || - !isUndefined( - this.checkedReusableData!.edgelabel_conflicts.find( - ({ entity }) => - entity.source_label === newValue || - entity.target_label === newValue - ) - ) - ) { - this.validateReuseErrorMessage[category] = i18next.t( - 'addition.store.same-vertex-name-notice' - ); - - return false; - } - } - - if (category === 'property') { - // check if there's an existed value equals to new value - if ( - !isUndefined( - this.checkedReusableData!.propertykey_conflicts.find( - ({ entity }) => entity.name === newValue - ) - ) || - !isUndefined( - this.checkedReusableData!.propertyindex_conflicts.find( - ({ entity }) => - !isUndefined( - entity.fields.find((fieldName) => fieldName === newValue) - ) - ) - ) || - !isUndefined( - this.checkedReusableData!.vertexlabel_conflicts.find( - ({ entity }) => - !isUndefined( - entity.properties.find(({ name }) => name === newValue) - ) || - !isUndefined( - entity.primary_keys.find((key) => key === newValue) - ) || - !isUndefined( - entity.property_indexes.find( - ({ fields }) => - !isUndefined( - fields.find((fieldName) => fieldName === newValue) - ) - ) - ) - ) - ) || - !isUndefined( - this.checkedReusableData!.edgelabel_conflicts.find( - ({ entity }) => - !isUndefined( - entity.properties.find(({ name }) => name === newValue) - ) || - !isUndefined( - entity.sort_keys.find((key) => key === newValue) - ) || - !isUndefined( - entity.property_indexes.find( - ({ fields }) => - !isUndefined( - fields.find((fieldName) => fieldName === newValue) - ) - ) - ) - ) - ) - ) { - this.validateReuseErrorMessage[category] = i18next.t( - 'addition.store.same-property-name-notice' - ); - - return false; - } - } - - if (category === 'property_index') { - if ( - !isUndefined( - this.checkedReusableData!.propertyindex_conflicts.find( - ({ entity }) => entity.name === newValue - ) - ) || - !isUndefined( - this.checkedReusableData!.vertexlabel_conflicts.find( - ({ entity }) => - !isUndefined( - entity.property_indexes.find(({ name }) => name === newValue) - ) - ) - ) || - !isUndefined( - this.checkedReusableData!.edgelabel_conflicts.find( - ({ entity }) => - !isUndefined( - entity.property_indexes.find(({ name }) => name === newValue) - ) - ) - ) - ) { - this.validateReuseErrorMessage[category] = i18next.t( - 'addition.store.same-index-name-notice' - ); - - return false; - } - } - } - - return true; - } - - @action - mutateReuseData( - category: 'edgeType' | 'vertexType' | 'property' | 'property_index', - originalValue: string, - newValue: string - ) { - const editedCheckedReusableData = cloneDeep(this.editedCheckedReusableData); - - if (category === 'edgeType') { - } - - if (category === 'vertexType') { - editedCheckedReusableData!.edgelabel_conflicts.forEach( - ({ entity }, index) => { - if (entity.source_label === originalValue) { - entity.source_label = newValue; - this.reusableEdgeTypeNameChangeIndexes.add(index); - } - - if (entity.target_label === originalValue) { - entity.target_label = newValue; - this.reusableEdgeTypeNameChangeIndexes.add(index); - } - } - ); - } - - if (category === 'property') { - editedCheckedReusableData!.edgelabel_conflicts.forEach( - ({ entity }, index) => { - const mutatePropertyIndex = entity.properties.findIndex( - ({ name }) => name === originalValue - ); - - if (mutatePropertyIndex !== -1) { - entity.properties[mutatePropertyIndex].name = newValue; - // property name in current vertex label has been edited - this.reusableEdgeTypeNameChangeIndexes.add(index); - } - - const sortKeyIndex = entity.sort_keys.findIndex( - (key) => key === originalValue - ); - - if (sortKeyIndex !== -1) { - entity.sort_keys[sortKeyIndex] = newValue; - this.reusableEdgeTypeNameChangeIndexes.add(index); - } - - entity.property_indexes.forEach(({ fields }) => { - const mutatePropertyIndexIndex = fields.findIndex( - (fieldName) => fieldName === originalValue - ); - - if (mutatePropertyIndexIndex !== -1) { - fields[mutatePropertyIndex] = newValue; - this.reusableEdgeTypeNameChangeIndexes.add(index); - } - }); - } - ); - - editedCheckedReusableData!.vertexlabel_conflicts.forEach( - ({ entity }, index) => { - const mutatePropertyIndex = entity.properties.findIndex( - ({ name }) => name === originalValue - ); - - if (mutatePropertyIndex !== -1) { - entity.properties[mutatePropertyIndex].name = newValue; - // property name in current vertex label has been edited - this.reusableVertexTypeNameChangeIndexes.add(index); - - // current vertex belongs to which edge - const mutateEdgeIndex = editedCheckedReusableData!.edgelabel_conflicts.findIndex( - (edge) => - edge.entity.source_label === entity.name || - edge.entity.target_label === entity.name - ); - - // property name in source_label or target_label has been edited - this.reusableEdgeTypeNameChangeIndexes.add(mutateEdgeIndex); - } - - const primaryKeyIndex = entity.primary_keys.findIndex( - (key) => key === originalValue - ); - - if (primaryKeyIndex !== -1) { - entity.primary_keys[primaryKeyIndex] = newValue; - - this.reusableVertexTypeNameChangeIndexes.add(index); - } - - entity.property_indexes.forEach(({ fields }) => { - const mutatePropertyIndexIndex = fields.findIndex( - (fieldName) => fieldName === originalValue - ); - - if (mutatePropertyIndexIndex !== -1) { - fields[mutatePropertyIndex] = newValue; - this.reusableVertexTypeNameChangeIndexes.add(index); - } - }); - } - ); - - editedCheckedReusableData!.propertyindex_conflicts.forEach( - ({ entity }, index) => { - const mutateIndex = entity.fields.findIndex( - (fieldName) => fieldName === originalValue - ); - - if (mutateIndex !== -1) { - entity.fields[mutateIndex] = newValue; - this.reusablePropertyIndexNameChangeIndexes.add(index); - } - } - ); - } - - if (category === 'property_index') { - editedCheckedReusableData!.edgelabel_conflicts.forEach( - ({ entity }, index) => { - const mutateVertexIndex = entity.property_indexes.findIndex( - ({ name }) => name === originalValue - ); - - if (mutateVertexIndex !== -1) { - entity.property_indexes[mutateVertexIndex].name = newValue; - this.reusableVertexTypeNameChangeIndexes.add(index); - } - } - ); - - editedCheckedReusableData!.vertexlabel_conflicts.forEach( - ({ entity }, index) => { - const mutateVertexIndex = entity.property_indexes.findIndex( - ({ name }) => name === originalValue - ); - - if (mutateVertexIndex !== -1) { - entity.property_indexes[mutateVertexIndex].name = newValue; - this.reusableVertexTypeNameChangeIndexes.add(index); - } - } - ); - } - - this.editedCheckedReusableData = editedCheckedReusableData; - this.checkedReusableData = cloneDeep(editedCheckedReusableData); - } - - @action - deleteReuseData( - category: - | 'edgelabel_conflicts' - | 'vertexlabel_conflicts' - | 'propertykey_conflicts' - | 'propertyindex_conflicts', - index: number - ) { - if (this.editedCheckedReusableData !== null) { - const editedCheckedReusableData = cloneDeep( - this.editedCheckedReusableData - ); - - if (category === 'edgelabel_conflicts') { - const deletedEdgeType = - editedCheckedReusableData.edgelabel_conflicts[index]; - const deletedPropertyNames: string[] = []; - const deletedPropertyIndexNames: string[] = []; - const deletedSourceVertexNames = deletedEdgeType.entity.source_label; - const deletedTargetVertexNames = deletedEdgeType.entity.target_label; - - deletedEdgeType.entity.properties.forEach(({ name }) => { - deletedPropertyNames.push(name); - }); - - deletedEdgeType.entity.property_indexes.forEach(({ name }) => { - deletedPropertyIndexNames.push(name); - }); - - editedCheckedReusableData.edgelabel_conflicts.splice(index, 1); - - // if there's no edge labels, return since it will move back to the previous step - if (editedCheckedReusableData.edgelabel_conflicts.length === 0) { - return; - } - - // remove source vertex - if ( - isUndefined( - editedCheckedReusableData.edgelabel_conflicts.find( - ({ entity }) => - entity.source_label === deletedSourceVertexNames || - entity.target_label === deletedSourceVertexNames - ) - ) - ) { - remove( - editedCheckedReusableData.vertexlabel_conflicts, - ({ entity }) => entity.name === deletedSourceVertexNames - ); - } - - // remove target vertex - if ( - isUndefined( - editedCheckedReusableData.edgelabel_conflicts.find( - ({ entity }) => - entity.source_label === deletedTargetVertexNames || - entity.target_label === deletedTargetVertexNames - ) - ) - ) { - remove( - editedCheckedReusableData.vertexlabel_conflicts, - ({ entity }) => entity.name === deletedTargetVertexNames - ); - } - - deletedPropertyIndexNames.forEach((propertyIndexName) => { - editedCheckedReusableData.vertexlabel_conflicts.forEach( - ({ entity }) => { - remove( - entity.property_indexes, - ({ name }) => name === propertyIndexName - ); - } - ); - - editedCheckedReusableData.edgelabel_conflicts.forEach( - ({ entity }) => { - remove( - entity.property_indexes, - ({ name }) => name === propertyIndexName - ); - } - ); - - remove( - editedCheckedReusableData.propertyindex_conflicts, - ({ entity }) => entity.name === propertyIndexName - ); - }); - - deletedPropertyNames - .filter( - (propertyName) => - !isUndefined( - editedCheckedReusableData.vertexlabel_conflicts.find( - ({ entity }) => - isUndefined( - entity.properties.find( - ({ name }) => name === propertyName - ) - ) - ) - ) && - !isUndefined( - editedCheckedReusableData.edgelabel_conflicts.find( - ({ entity }) => - isUndefined( - entity.properties.find( - ({ name }) => name === propertyName - ) - ) - ) - ) - ) - .forEach((propertyName) => { - remove( - editedCheckedReusableData.propertykey_conflicts, - ({ entity }) => entity.name === propertyName - ); - }); - } - - if (category === 'propertykey_conflicts') { - const deletedName = - editedCheckedReusableData.propertykey_conflicts[index].entity.name; - // remove property in properties - editedCheckedReusableData.propertykey_conflicts.splice(index, 1); - - // remove property in property index - editedCheckedReusableData.propertyindex_conflicts.forEach( - ({ entity }) => { - remove(entity.fields, (name) => name === deletedName); - } - ); - - remove( - editedCheckedReusableData.propertyindex_conflicts, - ({ entity }) => entity.fields.length === 0 - ); - - // remove property in vertex labels - editedCheckedReusableData.vertexlabel_conflicts.forEach( - ({ entity }, vertexlabelIndex) => { - const cb = (param: { name: string } | string) => { - const name = typeof param === 'string' ? param : param.name; - - if (name === deletedName) { - this.reusableVertexTypeNameChangeIndexes.add(vertexlabelIndex); - return true; - } - - return false; - }; - - remove(entity.properties, cb); - remove(entity.primary_keys, cb); - - entity.property_indexes.forEach(({ fields }) => { - remove(fields, cb); - }); - } - ); - - // remove property in edge labels - editedCheckedReusableData.edgelabel_conflicts.forEach( - ({ entity }, edgelabelIndex) => { - const cb = (param: { name: string } | string) => { - const name = typeof param === 'string' ? param : param.name; - - if (name === deletedName) { - this.reusableEdgeTypeNameChangeIndexes.add(edgelabelIndex); - return true; - } - - return false; - }; - - remove(entity.properties, cb); - remove(entity.sort_keys, cb); - - entity.property_indexes.forEach(({ fields }) => { - remove(fields, cb); - }); - } - ); - } - - if (category === 'propertyindex_conflicts') { - const { - name: deletedPropertyIndexName - } = editedCheckedReusableData.propertyindex_conflicts[index].entity; - - editedCheckedReusableData.propertyindex_conflicts.splice(index, 1); - - // delete property index in vertex label - editedCheckedReusableData.vertexlabel_conflicts.forEach( - ({ entity }, index) => { - const deletedIndex = entity.property_indexes.findIndex( - ({ name }) => name === deletedPropertyIndexName - ); - - if (deletedIndex !== -1) { - this.reusableVertexTypeNameChangeIndexes.add(index); - entity.property_indexes.splice(deletedIndex, 1); - } - } - ); - - editedCheckedReusableData.edgelabel_conflicts.forEach(({ entity }) => { - const deletedIndex = entity.property_indexes.findIndex( - ({ name }) => name === deletedPropertyIndexName - ); - - if (deletedIndex !== -1) { - this.reusableEdgeTypeNameChangeIndexes.add(index); - entity.property_indexes.splice(deletedIndex, 1); - } - }); - } - - this.mutateEditedReusableData(editedCheckedReusableData); - } - } - - @action - resetValidateNewEdgeTypeMessage( - category?: EdgeTypeValidateFields, - propertIndexIndex?: number, - propertIndexProperty?: keyof EdgeTypeValidatePropertyIndexes - ) { - if (isUndefined(category)) { - this.validateNewEdgeTypeErrorMessage = { - name: '', - sourceLabel: '', - targetLabel: '', - properties: '', - sortKeys: '', - propertyIndexes: [], - displayFeilds: [] - }; - - return; - } - - if (category === 'propertyIndexes') { - (this.validateNewEdgeTypeErrorMessage - .propertyIndexes as EdgeTypeValidatePropertyIndexes[])[ - propertIndexIndex as number - ][propertIndexProperty as keyof EdgeTypeValidatePropertyIndexes] = ''; - - return; - } - - this.validateNewEdgeTypeErrorMessage[category] = ''; - } - - @action - resetValidateReuseErrorMessage( - category?: 'edgeType' | 'vertexType' | 'property' | 'property_index' - ) { - if (isUndefined(category)) { - this.validateReuseErrorMessage = { - edgeType: '', - property: '', - property_index: '', - vertexType: '' - }; - - return; - } - - this.validateReuseErrorMessage[category] = ''; - } - - @action - dispose() { - this.currentTabStatus = 'list'; - this.requestStatus = { - fetchEdgeTypeList: 'pending', - addEdgeType: 'pending', - updateEdgeType: 'pending', - deleteEdgeType: 'pending', - checkConflict: 'pending', - recheckConflict: 'pending', - reuseEdgeType: 'pending' - }; - this.errorMessage = ''; - - this.isCreatedReady = false; - this.isAddNewPropertyIndexReady = true; - this.isEditReady = true; - - this.edgeTypeListPageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - this.resetNewEdgeType(); - this.edgeTypes = []; - this.selectedEdgeType = null; - this.selectedEdgeTypeNames = []; - this.editedSelectedEdgeType = { - append_properties: [], - append_property_indexes: [], - remove_property_indexes: [], - style: { - color: null, - icon: null, - with_arrow: null, - thickness: 'NORMAL', - display_fields: [] - } - }; - this.resetValidateNewEdgeTypeMessage(); - this.resetReusableEdgeTypes(); - this.validateReuseErrorMessage = { - edgeType: '', - vertexType: '', - property: '', - property_index: '' - }; - } - - fetchEdgeTypeList = flow(function* fetchEdgeTypeList( - this: EdgeTypeStore, - options?: { fetchAll?: boolean; reuseId?: number } - ) { - this.requestStatus.fetchEdgeTypeList = 'pending'; - - const conn_id = - options && typeof options.reuseId === 'number' - ? options.reuseId - : this.metadataConfigsRootStore.currentId; - - try { - const result: AxiosResponse> = yield axios - .get(`${baseUrl}/${conn_id}/schema/edgelabels`, { - params: { - page_no: this.edgeTypeListPageConfig.pageNumber, - page_size: !options ? 10 : -1, - name_order: - this.edgeTypeListPageConfig.sort !== '' - ? this.edgeTypeListPageConfig.sort - : null - } - }) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - if (result.data.status === 401) { - this.validateLicenseOrMemories = false; - } - - throw new Error(result.data.message); - } - - if (options && typeof options.reuseId === 'number') { - this.reusableEdgeTypes = result.data.data.records; - } else { - this.edgeTypes = result.data.data.records; - this.edgeTypeListPageConfig.pageTotal = result.data.data.total; - } - - if (this.currentTabStatus !== 'reuse') { - result.data.data.records.length === 0 - ? (this.currentTabStatus = 'empty') - : (this.currentTabStatus = 'list'); - } - - this.requestStatus.fetchEdgeTypeList = 'success'; - } catch (error) { - this.requestStatus.fetchEdgeTypeList = 'failed'; - this.errorMessage = error.message; - } - }); - - addEdgeType = flow(function* addEdgeType(this: EdgeTypeStore) { - this.requestStatus.addEdgeType = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/edgelabels`, - { - name: this.newEdgeType.name, - source_label: this.newEdgeType.source_label, - target_label: this.newEdgeType.target_label, - link_multi_times: this.newEdgeType.link_multi_times, - properties: this.newEdgeType.properties, - sort_keys: this.newEdgeType.sort_keys, - property_indexes: this.newEdgeType.property_indexes, - open_label_index: this.newEdgeType.open_label_index, - style: this.newEdgeType.style - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.requestStatus.addEdgeType = 'success'; - } catch (error) { - this.requestStatus.addEdgeType = 'failed'; - this.errorMessage = error.message; - } - }); - - updateEdgeType = flow(function* updateEdgeType(this: EdgeTypeStore) { - this.requestStatus.updateEdgeType = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .put( - `${baseUrl}/${ - this.metadataConfigsRootStore.currentId - }/schema/edgelabels/${this.selectedEdgeType!.name}`, - { - append_properties: this.editedSelectedEdgeType.append_properties, - append_property_indexes: this.editedSelectedEdgeType - .append_property_indexes, - remove_property_indexes: this.editedSelectedEdgeType - .remove_property_indexes, - style: this.editedSelectedEdgeType.style - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.requestStatus.updateEdgeType = 'success'; - } catch (error) { - this.requestStatus.updateEdgeType = 'failed'; - this.errorMessage = error.message; - } - }); - - deleteEdgeType = flow(function* deleteEdgeType( - this: EdgeTypeStore, - selectedEdgeTypeNames: string[] - ) { - this.requestStatus.deleteEdgeType = 'pending'; - - const combinedParams = selectedEdgeTypeNames - .map((name) => 'names=' + name) - .join('&'); - - try { - const result: AxiosResponse> = yield axios - .delete( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/edgelabels?` + - combinedParams + - `&skip_using=${String( - Array.isArray(selectedEdgeTypeNames) && - selectedEdgeTypeNames.length !== 1 - )}` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - if ( - selectedEdgeTypeNames.length === this.edgeTypes.length && - this.edgeTypeListPageConfig.pageNumber === - Math.ceil(this.edgeTypeListPageConfig.pageTotal / 10) && - this.edgeTypeListPageConfig.pageNumber > 1 - ) { - this.edgeTypeListPageConfig.pageNumber = - this.edgeTypeListPageConfig.pageNumber - 1; - } - - this.requestStatus.deleteEdgeType = 'success'; - } catch (error) { - this.requestStatus.deleteEdgeType = 'failed'; - this.errorMessage = error.message; - } - }); - - checkConflict = flow(function* checkConflict( - this: EdgeTypeStore, - reuseId: string, - selectedEdgeTypes: string[] - ) { - this.requestStatus.checkConflict = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/edgelabels/check_conflict`, - { - edgelabels: selectedEdgeTypes.map((selectedEdgeType) => - this.reusableEdgeTypes.find( - ({ name }) => name === selectedEdgeType - ) - ) - }, - { - params: { - reused_conn_id: this.metadataConfigsRootStore.graphManagementStore.idList.find( - ({ name }) => name === reuseId - )!.id - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.checkedReusableData = result.data.data; - this.editedCheckedReusableData = cloneDeep(result.data.data); - this.requestStatus.checkConflict = 'success'; - } catch (error) { - this.requestStatus.checkConflict = 'failed'; - this.errorMessage = error.message; - } - }); - - recheckConflict = flow(function* recheckConflict(this: EdgeTypeStore) { - this.requestStatus.recheckConflict = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/edgelabels/recheck_conflict`, - { - propertykeys: this.editedCheckedReusableData!.propertykey_conflicts.map( - ({ entity }) => ({ - ...entity - }) - ), - propertyindexes: this.editedCheckedReusableData!.propertyindex_conflicts.map( - ({ entity }) => ({ - ...entity - }) - ), - vertexlabels: this.editedCheckedReusableData!.vertexlabel_conflicts.map( - ({ entity }) => ({ - ...entity - }) - ), - edgelabels: this.editedCheckedReusableData!.edgelabel_conflicts.map( - ({ entity }) => ({ - ...entity - }) - ) - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.checkedReusableData = result.data.data; - this.editedCheckedReusableData = cloneDeep(result.data.data); - this.requestStatus.recheckConflict = 'success'; - } catch (error) { - this.requestStatus.recheckConflict = 'failed'; - this.errorMessage = error.message; - } - }); - - reuseEdgeType = flow(function* reuseEdgeType(this: EdgeTypeStore) { - this.requestStatus.reuseEdgeType = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/edgelabels/reuse`, - this.editedCheckedReusableData - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.requestStatus.reuseEdgeType = 'success'; - } catch (error) { - this.requestStatus.reuseEdgeType = 'failed'; - this.errorMessage = error.message; - } - }); -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/graphViewStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/graphViewStore.ts deleted file mode 100644 index ee99ed87b..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/graphViewStore.ts +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { observable, action, flow, computed } from 'mobx'; -import axios from 'axios'; -import { isUndefined, cloneDeep, clone } from 'lodash-es'; - -import vis from 'vis-network'; -import { MetadataConfigsRootStore } from './metadataConfigsStore'; -import { - checkIfLocalNetworkOffline, - vertexRadiusMapping, - edgeWidthMapping -} from '../../utils'; - -import { baseUrl } from '../../types/common'; -import type { - GraphViewData, - DrawerTypes -} from '../../types/GraphManagementStore/metadataConfigsStore'; -import i18next from '../../../i18n'; - -export class GraphViewStore { - metadataConfigsRootStore: MetadataConfigsRootStore; - - constructor(MetadataConfigsRootStore: MetadataConfigsRootStore) { - this.metadataConfigsRootStore = MetadataConfigsRootStore; - } - - @observable.ref colorMappings: Record = {}; - @observable.ref vertexSizeMappings: Record = {}; - @observable.ref vertexWritingMappings: Record = {}; - @observable.ref edgeColorMappings: Record = {}; - @observable.ref edgeWithArrowMappings: Record = {}; - @observable.ref edgeThicknessMappings: Record = {}; - @observable.ref edgeWritingMappings: Record = {}; - - @observable currentDrawer: DrawerTypes = ''; - @observable currentSelected = ''; - @observable isNodeOrEdgeClicked = false; - - // avoid to re-assign value to originalGraphViewData from re-rendering - // have to set a flag to inform data is empty - @observable isGraphVertexEmpty = true; - - @observable visNetwork: vis.Network | null = null; - @observable visDataSet: Record<'nodes' | 'edges', any> | null = null; - @observable.ref graphViewData: GraphViewData | null = null; - @observable.ref originalGraphViewData: GraphViewData | null = null; - - @observable.shallow requestStatus = { - fetchGraphViewData: 'standby' - }; - - @observable errorInfo = { - fetchGraphViewData: { - code: NaN, - message: '' - } - }; - - @computed get graphNodes() { - if (this.originalGraphViewData === null) { - return []; - } - - return this.originalGraphViewData.vertices.map( - ({ id, label, properties, primary_keys }) => { - return { - id, - label: id.length <= 15 ? id : id.slice(0, 15) + '...', - vLabel: id, - value: vertexRadiusMapping[this.vertexSizeMappings[label]], - font: { size: 16 }, - properties, - title: ` - - - ${Object.entries(properties) - .map(([key, value]) => { - const convertedValue = - value.toLowerCase() === 'text' - ? 'string' - : value.toLowerCase(); - - const primaryKeyIndex = primary_keys.findIndex( - (primaryKey) => primaryKey === key - ); - - return ``; - }) - .join('')} - `, - color: { - background: this.colorMappings[label] || '#5c73e6', - border: this.colorMappings[label] || '#5c73e6', - highlight: { background: '#fb6a02', border: '#fb6a02' }, - hover: { background: '#ec3112', border: '#ec3112' } - }, - // reveal label when zoom to max - scaling: { - label: { - max: Infinity, - maxVisible: Infinity - } - }, - chosen: { - node( - values: any, - id: string, - selected: boolean, - hovering: boolean - ) { - if (hovering || selected) { - values.shadow = true; - values.shadowColor = 'rgba(0, 0, 0, 0.6)'; - values.shadowX = 0; - values.shadowY = 0; - values.shadowSize = 25; - } - - if (selected) { - values.size += 5; - } - } - } - }; - } - ); - } - - @computed get graphEdges() { - if (this.originalGraphViewData === null) { - return []; - } - - return this.originalGraphViewData.edges.map( - ({ id, label, source, target, properties, sort_keys }) => { - return { - id, - label: label.length < 15 ? label : label.slice(0, 15) + '...', - properties, - source, - target, - from: source, - to: target, - font: { size: 16, strokeWidth: 0, color: '#666' }, - arrows: this.edgeWithArrowMappings[label] === true ? 'to' : '', - value: edgeWidthMapping[this.edgeThicknessMappings[label]], - title: ` - - - ${Object.entries(properties) - .map(([key, value]) => { - const convertedValue = - value.toLowerCase() === 'text' - ? 'string' - : value.toLowerCase(); - - const sortKeyIndex = sort_keys.findIndex( - (sortKey) => sortKey === key - ); - - return ``; - }) - .join('')} - `, - color: this.edgeColorMappings[label] || '#5c73e6' - }; - } - ); - } - - @action - setCurrentDrawer(drawer: DrawerTypes) { - this.currentDrawer = drawer; - } - - @action - switchNodeOrEdgeClicked(flag: boolean) { - this.isNodeOrEdgeClicked = flag; - } - - @action - switchGraphDataEmpty(flag: boolean) { - this.isGraphVertexEmpty = flag; - } - - @action - setVisNetwork(visNetwork: vis.Network) { - this.visNetwork = visNetwork; - } - - @action - setVisDataSet(visDataSet: Record<'nodes' | 'edges', any>) { - this.visDataSet = visDataSet; - } - - @action - dispose() { - this.edgeColorMappings = {}; - this.currentDrawer = ''; - this.currentSelected = ''; - this.colorMappings = {}; - this.edgeColorMappings = {}; - this.graphViewData = null; - this.isNodeOrEdgeClicked = false; - this.isGraphVertexEmpty = true; - this.visNetwork = null; - this.visDataSet = null; - this.graphViewData = null; - this.originalGraphViewData = null; - this.requestStatus = { - fetchGraphViewData: 'standby' - }; - this.errorInfo = { - fetchGraphViewData: { - code: NaN, - message: '' - } - }; - } - - fetchGraphViewData = flow(function* fetchGraphViewData( - this: GraphViewStore, - colorMappings?: Record, - vertexSizeMappings?: Record, - vertexWritingMappings?: Record, - edgeColorMappings?: Record, - edgeThicknessMappings?: Record, - edgeWithArrowMappings?: Record, - edgeWritingMappings?: Record - ) { - this.requestStatus.fetchGraphViewData = 'pending'; - - if (!isUndefined(colorMappings)) { - this.colorMappings = colorMappings; - } - if (!isUndefined(vertexSizeMappings)) { - this.vertexSizeMappings = vertexSizeMappings; - } - if (!isUndefined(vertexWritingMappings)) { - this.vertexWritingMappings = vertexWritingMappings; - } - if (!isUndefined(edgeColorMappings)) { - this.edgeColorMappings = edgeColorMappings; - } - if (!isUndefined(edgeThicknessMappings)) { - this.edgeThicknessMappings = edgeThicknessMappings; - } - if (!isUndefined(edgeWithArrowMappings)) { - this.edgeWithArrowMappings = edgeWithArrowMappings; - } - if (!isUndefined(edgeWritingMappings)) { - this.edgeWritingMappings = edgeWritingMappings; - } - - try { - const result = yield axios - .get( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/graphview` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - this.errorInfo.fetchGraphViewData.code = result.data.status; - throw new Error(result.data.message); - } - - const data = result.data.data; - - if (data.vertices.length !== 0) { - this.switchGraphDataEmpty(false); - } - - this.originalGraphViewData = data; - this.graphViewData = data; - - this.requestStatus.fetchGraphViewData = 'success'; - } catch (error) { - this.requestStatus.fetchGraphViewData = 'failed'; - this.errorInfo.fetchGraphViewData.message = error.message; - console.error(error.message); - } - }); -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore.ts deleted file mode 100644 index bc204b6d3..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataConfigsStore.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { createContext } from 'react'; -import { observable, action } from 'mobx'; - -import { MetadataPropertyStore } from './metadataPropertyStore'; -import { VertexTypeStore } from './vertexTypeStore'; -import { EdgeTypeStore } from './edgeTypeStore'; -import { MetadataPropertyIndexStore } from './metadataPropertyIndexStore'; -import { GraphViewStore } from './graphViewStore'; - -import { - GraphManagementStore, - GraphManagementStoreInstance -} from '../graphManagementStore'; - -export class MetadataConfigsRootStore { - graphManagementStore: GraphManagementStore; - metadataPropertyStore: MetadataPropertyStore; - vertexTypeStore: VertexTypeStore; - edgeTypeStore: EdgeTypeStore; - metadataPropertyIndexStore: MetadataPropertyIndexStore; - graphViewStore: GraphViewStore; - - @observable currentId: number | null = null; - - constructor(GraphManagementStore: GraphManagementStore) { - this.graphManagementStore = GraphManagementStore; - - this.metadataPropertyStore = new MetadataPropertyStore(this); - this.vertexTypeStore = new VertexTypeStore(this); - this.edgeTypeStore = new EdgeTypeStore(this); - this.metadataPropertyIndexStore = new MetadataPropertyIndexStore(this); - this.graphViewStore = new GraphViewStore(this); - } - - @action - setCurrentId(id: number | null) { - this.currentId = id; - } - - @action - dispose() { - this.currentId = null; - } -} - -export default createContext( - new MetadataConfigsRootStore(GraphManagementStoreInstance) -); diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyIndexStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyIndexStore.ts deleted file mode 100644 index eff06eb70..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyIndexStore.ts +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { observable, action, flow, computed } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; - -import { MetadataConfigsRootStore } from './metadataConfigsStore'; -import { checkIfLocalNetworkOffline } from '../../utils'; - -import { baseUrl, responseData } from '../../types/common'; -import { - MetadataPropertyIndex, - MetadataPropertyIndexResponse, - PageConfig -} from '../../types/GraphManagementStore/metadataConfigsStore'; - -export class MetadataPropertyIndexStore { - metadataConfigsRootStore: MetadataConfigsRootStore; - - constructor(MetadataConfigsRootStore: MetadataConfigsRootStore) { - this.metadataConfigsRootStore = MetadataConfigsRootStore; - } - - @observable validateLicenseOrMemories = true; - @observable searchWords = ''; - @observable.shallow isSearched = { - status: false, - value: '' - }; - - @observable.shallow requestStatus = { - fetchMetadataPropertIndexes: 'pending' - }; - - @observable metadataPropertyIndexPageConfig: PageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - - @observable errorMessage = ''; - - @observable.ref metadataPropertyIndexes: MetadataPropertyIndex[] = [ - { - owner: 'person', - owner_type: 'VERTEX_LABEL', - name: 'personByBorn', - type: 'RANGE', - fields: ['age', 'city'] - }, - { - owner: 'person', - owner_type: 'VERTEX_LABEL', - name: 'personByBorn', - type: 'RANGE', - fields: ['age'] - }, - { - owner: 'person', - owner_type: 'VERTEX_LABEL', - name: 'personByBorn', - type: 'RANGE', - fields: ['city'] - }, - { - owner: 'company', - owner_type: 'VERTEX_LABEL', - name: 'personByBorn', - type: 'RANGE', - fields: ['age', 'city'] - }, - { - owner: 'company', - owner_type: 'VERTEX_LABEL', - name: 'personByBorn', - type: 'RANGE', - fields: ['age', 'city'] - }, - { - owner: 'company', - owner_type: 'VERTEX_LABEL', - name: 'personByBorn', - type: 'RANGE', - fields: ['age', 'city'] - }, - { - owner: 'city', - owner_type: 'VERTEX_LABEL', - name: 'personByBorn', - type: 'RANGE', - fields: ['age', 'city'] - }, - { - owner: 'city', - owner_type: 'VERTEX_LABEL', - name: 'personByBorn', - type: 'RANGE', - fields: ['age', 'city'] - }, - { - owner: 'city', - owner_type: 'VERTEX_LABEL', - name: 'personByBorn', - type: 'RANGE', - fields: ['age', 'city'] - }, - { - owner: 'name', - owner_type: 'VERTEX_LABEL', - name: 'personByBorn', - type: 'RANGE', - fields: ['age', 'city'] - } - ]; - - @computed get collpaseInfo(): null | number[][] { - const collpaseNumbers: number[] = []; - - this.metadataPropertyIndexes.forEach( - ({ owner }: MetadataPropertyIndex, index: number) => { - // first owner has default rowSpanStart = 1 - if (index === 0) { - collpaseNumbers.push(1); - return; - } - - // if owner equals to the previous one, plus the owner rowSpan by 1 - // else push this different owner rowSpanStartIndex in to array - owner === this.metadataPropertyIndexes[index - 1].owner - ? ++collpaseNumbers[collpaseNumbers.length - 1] - : collpaseNumbers.push(1); - } - ); - - if (collpaseNumbers.length === this.metadataPropertyIndexes.length) { - return null; - } - - const collpaseStartIndexes: number[] = [0]; - - collpaseNumbers - .slice(0, collpaseNumbers.length - 1) - .reduce((prev, curr) => { - collpaseStartIndexes.push(prev + curr); - return prev + curr; - }, 0); - - return [collpaseStartIndexes, collpaseNumbers]; - } - - @action - mutateSearchWords(text: string) { - this.searchWords = text; - } - - @action - mutatePageNumber(pageNumber: number) { - this.metadataPropertyIndexPageConfig.pageNumber = pageNumber; - } - - @action - switchIsSearchedStatus(isSearched: boolean) { - this.isSearched.status = isSearched; - - isSearched - ? (this.isSearched.value = this.searchWords) - : (this.isSearched.value = ''); - } - - @action - dispose() { - this.searchWords = ''; - this.isSearched = { - status: false, - value: '' - }; - this.requestStatus = { - fetchMetadataPropertIndexes: 'pending' - }; - this.metadataPropertyIndexPageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - this.errorMessage = ''; - this.metadataPropertyIndexes = []; - } - - fetchMetadataPropertIndexes = flow(function* fetchMetadataPropertIndexes( - this: MetadataPropertyIndexStore, - indexType: 'vertex' | 'edge' - ) { - this.requestStatus.fetchMetadataPropertIndexes = 'pending'; - - try { - const result: AxiosResponse< - responseData - > = yield axios - .get( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/propertyindexes`, - { - params: { - page_no: this.metadataPropertyIndexPageConfig.pageNumber, - page_size: 10, - is_vertex_label: indexType === 'vertex', - content: - this.isSearched.status && this.searchWords !== '' - ? this.searchWords - : null - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - if (result.data.status === 401) { - this.validateLicenseOrMemories = false; - } - - throw new Error(result.data.message); - } - - this.metadataPropertyIndexes = result.data.data.records; - this.metadataPropertyIndexPageConfig.pageTotal = result.data.data.total; - this.requestStatus.fetchMetadataPropertIndexes = 'success'; - } catch (error) { - this.requestStatus.fetchMetadataPropertIndexes = 'failed'; - this.errorMessage = error.message; - } - }); -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyStore.ts deleted file mode 100644 index 669c1ab28..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/metadataPropertyStore.ts +++ /dev/null @@ -1,590 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { observable, action, flow, computed } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; -import { cloneDeep } from 'lodash-es'; -import { v4 } from 'uuid'; - -import { MetadataConfigsRootStore } from './metadataConfigsStore'; -import { checkIfLocalNetworkOffline } from '../../utils'; - -import { baseUrl, responseData } from '../../types/common'; -import { - MetadataProperty, - MetadataPropertyListResponse, - PageConfig, - CheckedReusableData, - NewMetadataProperty -} from '../../types/GraphManagementStore/metadataConfigsStore'; -import i18next from '../../../i18n'; - -export class MetadataPropertyStore { - metadataConfigsRootStore: MetadataConfigsRootStore; - - constructor(MetadataConfigsRootStore: MetadataConfigsRootStore) { - this.metadataConfigsRootStore = MetadataConfigsRootStore; - } - - @observable validateLicenseOrMemories = true; - @observable currentTabStatus = 'list'; - - @observable.shallow requestStatus = { - fetchMetadataPropertyList: 'standby', - checkIfUsing: 'standby', - addMetadataProperty: 'standby', - deleteMetadataProperty: 'standby', - checkConflict: 'standby', - recheckConflict: 'standby', - reuseMetadataProperties: 'standy' - }; - - @observable errorMessage = ''; - - @observable searchWords = ''; - - @observable isSearched = { - status: false, - value: '' - }; - - @observable metadataPropertyPageConfig: PageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - - @observable isCreateNewProperty = false; - // should user able to create new vertex type - @observable isCreatedReady = false; - - @observable newMetadataProperty: NewMetadataProperty = { - name: v4(), - // real input name, to handle
key problems - _name: '', - data_type: 'string', - cardinality: 'single' - }; - - @observable.ref metadataProperties: MetadataProperty[] = []; - - @observable metadataPropertyUsingStatus: Record | null = - null; - - @observable selectedMetadataProperty: MetadataProperty | null = null; - // table selection from user - @observable.ref selectedMetadataPropertyNames: string[] = []; - - // reuse - @observable reuseableProperties: MetadataProperty[] = []; - @observable - checkedReusableProperties: CheckedReusableData | null = null; - @observable - editedCheckedReusableProperties: CheckedReusableData | null = null; - @observable reusablePropertyNameChangeIndexes: Set = - new Set(); - - @observable validateNewPropertyErrorMessage = { - name: '' - }; - - @observable validateRenameReusePropertyErrorMessage = { - name: '' - }; - - @computed get reunionMetadataProperty() { - return this.metadataProperties.length < 10 - ? [this.newMetadataProperty].concat(this.metadataProperties) - : [this.newMetadataProperty].concat(this.metadataProperties.slice(0, 9)); - } - - @computed get reuseablePropertyDataMap() { - const dataMap: Record> = {}; - - this.reuseableProperties.forEach(({ name }) => { - dataMap[name] = { - key: name, - title: name - }; - }); - - return dataMap; - } - - @computed get isReadyToReuse() { - return ( - this.editedCheckedReusableProperties && - this.editedCheckedReusableProperties!.propertykey_conflicts.every( - ({ status }) => status === 'PASSED' || status === 'EXISTED' - ) && - // no data standingby validation - this.reusablePropertyNameChangeIndexes.size === 0 - ); - } - - @action - changeCurrentTabStatus(status: string) { - this.currentTabStatus = status; - } - - @action - mutateSearchWords(text: string) { - this.searchWords = text; - } - - @action - mutatePageNumber(pageNumber: number) { - this.metadataPropertyPageConfig.pageNumber = pageNumber; - } - - @action - mutatePageSort(sort: 'desc' | 'asc') { - this.metadataPropertyPageConfig.sort = sort; - } - - @action - switchIsSearchedStatus(isSearched: boolean) { - this.isSearched.status = isSearched; - - isSearched - ? (this.isSearched.value = this.searchWords) - : (this.isSearched.value = ''); - } - - @action - switchIsCreateNewProperty(flag: boolean) { - this.isCreateNewProperty = flag; - } - - @action - resetNewProperties() { - this.mutateNewProperty({ - name: v4(), - _name: '', - data_type: 'string', - cardinality: 'single' - }); - - this.isCreatedReady = false; - } - - @action - selectProperty(index: number | null) { - if (index === null) { - this.selectedMetadataProperty = null; - return; - } - - this.selectedMetadataProperty = cloneDeep(this.metadataProperties[index]); - } - - @action - mutateNewProperty(newMetadataProperty: NewMetadataProperty) { - this.newMetadataProperty = newMetadataProperty; - } - - @action - mutateSelectedPropertyName(name: string) { - this.selectedMetadataProperty!.name = name; - } - - @action - mutateSelectedMetadataProperyNames(names: string[]) { - this.selectedMetadataPropertyNames = names; - } - - @action - mutateEditedReusableProperties( - newEditedReusableProperties: CheckedReusableData - ) { - this.editedCheckedReusableProperties = newEditedReusableProperties; - } - - @action - mutateReusablePropertyNameChangeIndexes(index: number) { - this.reusablePropertyNameChangeIndexes.add(index); - } - - @action - clearReusablePropertyNameChangeIndexes() { - this.reusablePropertyNameChangeIndexes.clear(); - } - - @action - resetReusablePropeties() { - this.reuseableProperties = []; - } - - @action - validateNewProperty() { - let isReady = true; - - if (!/^[\w\u4e00-\u9fa5]{1,128}$/.test(this.newMetadataProperty._name!)) { - if (this.newMetadataProperty._name!.length === 0) { - this.validateNewPropertyErrorMessage.name = i18next.t( - 'addition.store.item-is-required' - ); - isReady = false; - } else { - this.validateNewPropertyErrorMessage.name = i18next.t( - 'addition.store.rule4' - ); - isReady = false; - } - } else { - this.validateNewPropertyErrorMessage.name = ''; - } - - this.isCreatedReady = isReady; - return isReady; - } - - @action - validateRenameReuseProperty(index: number) { - let isReady = true; - const propertyName = - this.editedCheckedReusableProperties!.propertykey_conflicts[index].entity - .name; - - if (!/^[\w\u4e00-\u9fa5]{1,128}$/.test(propertyName)) { - if (propertyName.length === 0) { - this.validateRenameReusePropertyErrorMessage.name = i18next.t( - 'addition.store.item-is-required' - ); - isReady = false; - } else { - this.validateRenameReusePropertyErrorMessage.name = i18next.t( - 'addition.store.rule4' - ); - isReady = false; - } - } else { - this.validateRenameReusePropertyErrorMessage.name = ''; - } - - return isReady; - } - - @action - resetValidateNewProperty() { - this.validateNewPropertyErrorMessage.name = ''; - } - - @action - resetValidateRenameReuseProperty() { - this.validateRenameReusePropertyErrorMessage.name = ''; - } - - // if cancel clicked, reset to the original name - @action - resetEditedReusablePropertyName(index: number) { - this.editedCheckedReusableProperties!.propertykey_conflicts[ - index - ].entity.name = - this.checkedReusableProperties!.propertykey_conflicts[index].entity.name; - } - - @action - dispose() { - this.currentTabStatus = 'list'; - this.requestStatus = { - fetchMetadataPropertyList: 'standby', - checkIfUsing: 'standby', - addMetadataProperty: 'standby', - deleteMetadataProperty: 'standby', - checkConflict: 'standby', - recheckConflict: 'standby', - reuseMetadataProperties: 'standy' - }; - this.errorMessage = ''; - this.searchWords = ''; - this.isSearched = { - status: false, - value: '' - }; - this.metadataPropertyPageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - this.isCreateNewProperty = false; - this.isCreatedReady = false; - this.resetNewProperties(); - this.metadataProperties = []; - this.metadataPropertyUsingStatus = null; - this.selectedMetadataProperty = null; - this.selectedMetadataPropertyNames = []; - - this.resetValidateNewProperty(); - this.resetValidateRenameReuseProperty(); - - // reuse - this.reuseableProperties = []; - this.checkedReusableProperties = null; - this.editedCheckedReusableProperties = null; - } - - fetchMetadataPropertyList = flow(function* fetchMetadataPropertyList( - this: MetadataPropertyStore, - options?: { fetchAll?: boolean; reuseId?: number } - ) { - this.requestStatus.fetchMetadataPropertyList = 'pending'; - const conn_id = - options && typeof options.reuseId === 'number' - ? options.reuseId - : this.metadataConfigsRootStore.currentId; - - try { - const result: AxiosResponse> = - yield axios - .get(`${baseUrl}/${conn_id}/schema/propertykeys`, { - params: { - page_no: this.metadataPropertyPageConfig.pageNumber, - page_size: !options ? 10 : -1, - name_order: - this.metadataPropertyPageConfig.sort !== '' - ? this.metadataPropertyPageConfig.sort - : null, - content: - this.isSearched.status && this.searchWords !== '' - ? this.searchWords - : null - } - }) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - if (result.data.status === 401) { - this.validateLicenseOrMemories = false; - } - - throw new Error(result.data.message); - } - - if (options && typeof options.reuseId === 'number') { - this.reuseableProperties = result.data.data.records; - } else { - this.metadataProperties = result.data.data.records; - this.metadataPropertyPageConfig.pageTotal = result.data.data.total; - } - - if (result.data.data.records.length === 0) { - if (this.isSearched.status === true) { - this.currentTabStatus = 'list'; - } else { - this.currentTabStatus = 'empty'; - } - } else if (this.currentTabStatus !== 'reuse') { - // if currentTabStatus is reuse, stay at reuse page - this.currentTabStatus = 'list'; - } - - this.requestStatus.fetchMetadataPropertyList = 'success'; - } catch (error) { - this.requestStatus.fetchMetadataPropertyList = 'failed'; - this.errorMessage = error.message; - } - }); - - checkIfUsing = flow(function* checkIfUsing( - this: MetadataPropertyStore, - selectedPropertyNames: string[] - ) { - this.requestStatus.checkIfUsing = 'pending'; - - try { - const result: AxiosResponse>> = - yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/propertykeys/check_using`, - { - names: selectedPropertyNames - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.metadataPropertyUsingStatus = result.data.data; - this.requestStatus.checkIfUsing = 'success'; - } catch (error) { - this.requestStatus.checkIfUsing = 'failed'; - this.errorMessage = error.message; - } - }); - - addMetadataProperty = flow(function* addMetadataProperty( - this: MetadataPropertyStore - ) { - this.requestStatus.addMetadataProperty = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/propertykeys`, - { - name: this.newMetadataProperty._name, - data_type: - this.newMetadataProperty.data_type === 'string' - ? 'TEXT' - : this.newMetadataProperty.data_type.toUpperCase(), - cardinality: this.newMetadataProperty.cardinality.toUpperCase() - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.requestStatus.addMetadataProperty = 'success'; - } catch (error) { - this.requestStatus.addMetadataProperty = 'failed'; - this.errorMessage = error.message; - } - }); - - deleteMetadataProperty = flow(function* deleteMetadataProperty( - this: MetadataPropertyStore, - selectedPropertyNames: string[] - ) { - this.requestStatus.deleteMetadataProperty = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .delete( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/propertykeys?` + - selectedPropertyNames.map((name) => 'names=' + name).join('&') + - `&skip_using=${String(selectedPropertyNames.length !== 1)}` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - if ( - selectedPropertyNames.length === this.metadataProperties.length && - this.metadataPropertyPageConfig.pageNumber === - Math.ceil(this.metadataPropertyPageConfig.pageTotal / 10) && - this.metadataPropertyPageConfig.pageNumber > 1 - ) { - this.metadataPropertyPageConfig.pageNumber = - this.metadataPropertyPageConfig.pageNumber - 1; - } - - this.requestStatus.deleteMetadataProperty = 'success'; - } catch (error) { - this.requestStatus.deleteMetadataProperty = 'failed'; - this.errorMessage = error.message; - } - }); - - checkConflict = flow(function* checkConflict( - this: MetadataPropertyStore, - selectedNameList: string[] - ) { - this.requestStatus.checkConflict = 'pending'; - - try { - const result: AxiosResponse> = - yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/propertykeys/check_conflict`, - { - propertykeys: selectedNameList.map((selectedName) => - this.reuseableProperties.find( - ({ name }) => name === selectedName - ) - ) - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.checkedReusableProperties = result.data.data; - this.editedCheckedReusableProperties = cloneDeep(result.data.data); - this.requestStatus.checkConflict = 'success'; - } catch (error) { - this.requestStatus.checkConflict = 'failed'; - this.errorMessage = error.message; - } - }); - - recheckConflict = flow(function* recheckConflict( - this: MetadataPropertyStore - ) { - this.requestStatus.recheckConflict = 'pending'; - - try { - const result: AxiosResponse> = - yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/propertykeys/recheck_conflict`, - { - propertykeys: - this.editedCheckedReusableProperties!.propertykey_conflicts.map( - ({ entity }) => ({ - ...entity - }) - ) - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.checkedReusableProperties = result.data.data; - this.editedCheckedReusableProperties = cloneDeep(result.data.data); - this.requestStatus.recheckConflict = 'success'; - } catch (error) { - this.requestStatus.recheckConflict = 'failed'; - this.errorMessage = error.message; - } - }); - - reuseMetadataProperties = flow(function* reuseMetadataProperties( - this: MetadataPropertyStore - ) { - this.requestStatus.reuseMetadataProperties = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/propertykeys/reuse`, - this.editedCheckedReusableProperties! - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.requestStatus.reuseMetadataProperties = 'success'; - } catch (error) { - this.requestStatus.reuseMetadataProperties = 'failed'; - this.errorMessage = error.message; - } - }); -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/vertexTypeStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/vertexTypeStore.ts deleted file mode 100644 index a91c0ad20..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/GraphManagementStore/metadataConfigsStore/vertexTypeStore.ts +++ /dev/null @@ -1,1266 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { observable, action, flow, computed } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; -import { cloneDeep, isUndefined, remove, size } from 'lodash-es'; - -import { MetadataConfigsRootStore } from './metadataConfigsStore'; -import { checkIfLocalNetworkOffline } from '../../utils'; - -import { baseUrl, responseData } from '../../types/common'; -import { - VertexType, - EditVertexTypeParams, - VertexTypeListResponse, - PageConfig, - CheckedReusableData, - VertexTypeValidateFields, - VertexTypeValidatePropertyIndexes -} from '../../types/GraphManagementStore/metadataConfigsStore'; -import i18next from '../../../i18n'; - -export class VertexTypeStore { - metadataConfigsRootStore: MetadataConfigsRootStore; - - constructor(MetadataConfigsRootStore: MetadataConfigsRootStore) { - this.metadataConfigsRootStore = MetadataConfigsRootStore; - } - - @observable validateLicenseOrMemories = true; - @observable currentTabStatus = 'list'; - - @observable.shallow requestStatus = { - fetchVertexTypeList: 'pending', - checkIfUsing: 'pending', - addVertexType: 'pending', - updateVertexType: 'pending', - deleteVertexType: 'pending', - checkConflict: 'pending', - recheckConflict: 'pending', - reuseVertexType: 'pending' - }; - - @observable vertexListPageConfig: PageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - - @observable errorMessage = ''; - - @observable.ref colorSchemas = [ - '#5c73e6', - '#569380', - '#8ecc93', - '#fe9227', - '#fe5b5d', - '#fd6ace', - '#4d8dda', - '#57c7e3', - '#ffe081', - '#c570ff', - '#2b65ff', - '#0eb880', - '#76c100', - '#ed7600', - '#e65055', - '#a64ee6', - '#108cee', - '#00b5d9', - '#f2ca00', - '#e048ae' - ]; - - @observable.ref vertexSizeSchemas = [ - { ch: '超小', en: 'TINY' }, - { ch: '小', en: 'SMALL' }, - { ch: '中', en: 'NORMAL' }, - { ch: '大', en: 'BIG' }, - { ch: '超大', en: 'HUGE' } - ]; - - @observable.shallow newVertexType: VertexType = { - name: '', - id_strategy: 'PRIMARY_KEY', - properties: [], - primary_keys: [], - property_indexes: [], - open_label_index: false, - style: { - color: '#5c73e6', - icon: null, - size: 'NORMAL', - display_fields: ['~id'] - } - }; - - // should user able to create new vertex type - @observable isCreatedReady = false; - // should user able to create new property index - @observable isAddNewPropertyIndexReady = true; - - // only have to check property - @observable isEditReady = true; - - @observable.ref selectedVertexType: VertexType | null = null; - @observable.ref selectedVertexTypeNames: string[] = []; - @observable.ref editedSelectedVertexType: EditVertexTypeParams = { - append_properties: [], - append_property_indexes: [], - remove_property_indexes: [], - style: { - color: '#5c73e6', - icon: null, - size: 'NORMAL', - display_fields: ['~id'] - } - }; - - @observable addedPropertiesInSelectedVertextType: Set = new Set(); - - @observable.ref vertexTypes: VertexType[] = []; - - @observable vertexTypeUsingStatus: Record | null = null; - - // reuse - @observable reusableVertexTypes: VertexType[] = []; - @observable checkedReusableData: CheckedReusableData | null = null; - @observable - editedCheckedReusableData: CheckedReusableData | null = null; - - @observable reusableVertexTypeNameChangeIndexes: Set = new Set< - number - >(); - @observable reusablePropertyNameChangeIndexes: Set = new Set< - number - >(); - @observable reusablePropertyIndexNameChangeIndexes: Set = new Set< - number - >(); - - @observable validateNewVertexTypeErrorMessage: Record< - VertexTypeValidateFields, - string | VertexTypeValidatePropertyIndexes[] - > = { - name: '', - properties: '', - primaryKeys: '', - displayFeilds: '', - propertyIndexes: [] - }; - - @observable.shallow validateEditVertexTypeErrorMessage: Record< - 'propertyIndexes', - VertexTypeValidatePropertyIndexes[] - > = { - propertyIndexes: [] - }; - - @observable validateReuseErrorMessage: Record< - 'vertexType' | 'property' | 'property_index', - string - > = { - vertexType: '', - property: '', - property_index: '' - }; - - @observable validateRenameReuseVertexErrorMessage: Record< - 'vertex' | 'property' | 'property_index', - { name: string } - > = { - vertex: { - name: '' - }, - property: { - name: '' - }, - property_index: { - name: '' - } - }; - - @computed get reusableVertexTypeDataMap() { - const dataMap: Record> = {}; - - this.reusableVertexTypes.forEach(({ name }) => { - dataMap[name] = { - key: name, - title: name - }; - }); - - return dataMap; - } - - @computed get isReadyToReuse() { - return ( - this.editedCheckedReusableData && - this.editedCheckedReusableData!.propertykey_conflicts.every( - ({ status }) => status === 'PASSED' || status === 'EXISTED' - ) && - this.editedCheckedReusableData!.vertexlabel_conflicts.every( - ({ status }) => status === 'PASSED' || status === 'EXISTED' - ) && - this.editedCheckedReusableData!.propertyindex_conflicts.every( - ({ status }) => status === 'PASSED' || status === 'EXISTED' - ) && - // no data standingby validation - this.reusableVertexTypeNameChangeIndexes.size === 0 && - this.reusablePropertyNameChangeIndexes.size === 0 && - this.reusablePropertyIndexNameChangeIndexes.size === 0 - ); - } - - @action - changeCurrentTabStatus(status: string) { - this.currentTabStatus = status; - } - - @action - mutateNewProperty(newVertexType: VertexType) { - this.newVertexType = newVertexType; - } - - @action - mutateSelectedVertexTypeNames(names: string[]) { - this.selectedVertexTypeNames = names; - } - - @action - mutatePageNumber(pageNumber: number) { - this.vertexListPageConfig.pageNumber = pageNumber; - } - - @action - mutatePageSort(sort: 'desc' | 'asc') { - this.vertexListPageConfig.sort = sort; - } - - @action - selectVertexType(index: number | null) { - if (index === null) { - this.selectedVertexType = null; - return; - } - - this.selectedVertexType = cloneDeep(this.vertexTypes[index]); - } - - @action - mutateSelectedProperty(selectedProperty: VertexType) { - this.selectedVertexType = selectedProperty; - } - - @action - mutateEditedSelectedVertexType( - editedSelectedVertexType: EditVertexTypeParams - ) { - this.editedSelectedVertexType = editedSelectedVertexType; - } - - @action - resetNewVertextType() { - this.newVertexType = { - name: '', - id_strategy: 'PRIMARY_KEY', - properties: [], - primary_keys: [], - property_indexes: [], - open_label_index: false, - style: { - color: '#5c73e6', - icon: null, - size: 'NORMAL', - display_fields: ['~id'] - } - }; - - this.isCreatedReady = false; - } - - @action - resetAddedPropertiesInSelectedVertextType() { - this.addedPropertiesInSelectedVertextType.clear(); - } - - @action - resetEditedSelectedVertexType() { - this.editedSelectedVertexType = { - append_properties: [], - append_property_indexes: [], - remove_property_indexes: [], - style: { - color: '#5c73e6', - icon: null, - size: 'NORMAL', - display_fields: ['~id'] - } - }; - - // need to clear checkbox status either - this.resetAddedPropertiesInSelectedVertextType(); - } - - // reuse - - @action - mutateEditedReusableData(newEditedReusableVertexTypes: CheckedReusableData) { - this.editedCheckedReusableData = newEditedReusableVertexTypes; - } - - @action - mutateReusableVertexTypeChangeIndexes(index: number) { - this.reusableVertexTypeNameChangeIndexes.add(index); - } - - @action - mutateReusablePropertyNameChangeIndexes(index: number) { - this.reusablePropertyNameChangeIndexes.add(index); - } - - @action - mutateReusablePropertyIndexNameChangeIndexes(index: number) { - this.reusablePropertyIndexNameChangeIndexes.add(index); - } - - // if cancel clicked, reset to the original name - @action - resetEditedReusableVertexTypeName(index: number) { - this.editedCheckedReusableData!.vertexlabel_conflicts[ - index - ].entity.name = this.checkedReusableData!.vertexlabel_conflicts[ - index - ].entity.name; - } - - // if cancel clicked, reset to the original name - @action - resetEditedReusablePropertyName(index: number) { - this.editedCheckedReusableData!.propertykey_conflicts[ - index - ].entity.name = this.checkedReusableData!.propertykey_conflicts[ - index - ].entity.name; - } - - // if cancel clicked, reset to the original name - @action - resetEditedReusablePropertyIndexName(index: number) { - this.editedCheckedReusableData!.propertyindex_conflicts[ - index - ].entity.name = this.checkedReusableData!.propertyindex_conflicts[ - index - ].entity.name; - } - - @action - clearReusableNameChangeIndexes() { - this.reusableVertexTypeNameChangeIndexes.clear(); - this.reusablePropertyNameChangeIndexes.clear(); - this.reusablePropertyIndexNameChangeIndexes.clear(); - } - - @action - resetReusableVertexTypes() { - this.reusableVertexTypes = []; - } - - @action - validateNewVertexType(category: VertexTypeValidateFields, initial = false) { - let isReady = true; - - // if initial is true, error message won't be assigned - // which intends to not pop up error layer - if (category === 'name') { - if (!/^[\w\u4e00-\u9fa5]{1,128}$/.test(this.newVertexType.name)) { - if (this.newVertexType.name.length === 0) { - !initial && - (this.validateNewVertexTypeErrorMessage.name = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - } else { - !initial && - (this.validateNewVertexTypeErrorMessage.name = i18next.t( - 'addition.store.rule4' - )); - isReady = false; - } - } else { - this.validateNewVertexTypeErrorMessage.name = ''; - } - } - - if (category === 'properties') { - if ( - this.newVertexType.properties.length === 0 && - this.newVertexType.id_strategy === 'PRIMARY_KEY' - ) { - !initial && - (this.validateNewVertexTypeErrorMessage.properties = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - } - } - - if (category === 'primaryKeys') { - if ( - this.newVertexType.id_strategy === 'PRIMARY_KEY' && - this.newVertexType.primary_keys.length === 0 - ) { - !initial && - (this.validateNewVertexTypeErrorMessage.primaryKeys = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - } - } - - if (category === 'displayFeilds') { - if (this.newVertexType.style.display_fields.length === 0) { - !initial && - (this.validateNewVertexTypeErrorMessage.displayFeilds = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - } - } - - if (category === 'propertyIndexes') { - this.isAddNewPropertyIndexReady = true; - - this.validateNewVertexTypeErrorMessage.propertyIndexes = this.newVertexType.property_indexes.map( - ({ name, type, fields }) => { - const validatedPropertyIndex = { - name: '', - type: '', - properties: '' - }; - - if (!/^[\w\u4e00-\u9fa5]{1,128}$/.test(name)) { - if (!initial) { - if (name.length !== 0) { - validatedPropertyIndex.name = i18next.t('addition.store.rule4'); - } else { - validatedPropertyIndex.name = i18next.t( - 'addition.store.item-is-required' - ); - } - } - - isReady = false; - this.isAddNewPropertyIndexReady = false; - } else { - validatedPropertyIndex.name = ''; - } - - if (type.length === 0) { - !initial && - (validatedPropertyIndex.type = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - this.isAddNewPropertyIndexReady = false; - } else { - validatedPropertyIndex.type = ''; - } - - if (Array.isArray(fields)) { - if (fields.length === 0) { - !initial && - (validatedPropertyIndex.properties = i18next.t( - 'addition.store.item-is-required' - )); - isReady = false; - this.isAddNewPropertyIndexReady = false; - } - } else { - validatedPropertyIndex.properties = ''; - } - - return validatedPropertyIndex; - } - ); - } - - return isReady; - } - - @action - validateAllNewVertexType(initial = false) { - this.isCreatedReady = - this.validateNewVertexType('name', initial) && - this.validateNewVertexType('properties', initial) && - this.validateNewVertexType('primaryKeys', initial) && - this.validateNewVertexType('propertyIndexes', initial) && - this.validateNewVertexType('displayFeilds', initial); - } - - @action - validateEditVertexType(initial = false) { - this.isEditReady = true; - - this.validateEditVertexTypeErrorMessage.propertyIndexes = this.editedSelectedVertexType.append_property_indexes.map( - ({ name, type, fields }) => { - const validatedPropertyIndex = { - name: '', - type: '', - properties: '' - }; - if (!/^[\w\u4e00-\u9fa5]{1,128}$/.test(name)) { - if (!initial) { - if (name.length !== 0) { - validatedPropertyIndex.name = i18next.t('addition.store.rule4'); - } else { - validatedPropertyIndex.name = i18next.t( - 'addition.store.item-is-required' - ); - } - } - - this.isEditReady = false; - } else { - validatedPropertyIndex.name = ''; - } - - if (type.length === 0) { - !initial && - (validatedPropertyIndex.type = i18next.t( - 'addition.store.item-is-required' - )); - this.isEditReady = false; - } else { - validatedPropertyIndex.type = ''; - } - - if (Array.isArray(fields)) { - if (fields.length === 0) { - !initial && - (validatedPropertyIndex.properties = i18next.t( - 'addition.store.item-is-required' - )); - this.isEditReady = false; - } - } else { - validatedPropertyIndex.properties = ''; - } - - return validatedPropertyIndex; - } - ); - } - - @action - validateReuseData( - category: 'vertexType' | 'property' | 'property_index', - originalValue: string, - newValue: string - ) { - if (!/^[\w\u4e00-\u9fa5]{1,128}$/.test(newValue)) { - if (newValue.length === 0) { - this.validateReuseErrorMessage[category] = i18next.t( - 'addition.store.item-is-required' - ); - } else { - this.validateReuseErrorMessage[category] = i18next.t( - 'addition.store.rule4' - ); - } - - return false; - } - - // if value has changed - if (originalValue !== newValue) { - if (category === 'vertexType') { - if ( - !isUndefined( - this.checkedReusableData!.vertexlabel_conflicts.find( - ({ entity }) => entity.name === newValue - ) - ) - ) { - this.validateReuseErrorMessage[category] = i18next.t( - 'addition.store.same-vertex-name-notice' - ); - - return false; - } - } - - if (category === 'property') { - // check if there's an existed value equals to new value - if ( - !isUndefined( - this.checkedReusableData!.propertykey_conflicts.find( - ({ entity }) => entity.name === newValue - ) - ) || - !isUndefined( - this.checkedReusableData!.propertyindex_conflicts.find( - ({ entity }) => - !isUndefined( - entity.fields.find((fieldName) => fieldName === newValue) - ) - ) - ) || - !isUndefined( - this.checkedReusableData!.vertexlabel_conflicts.find( - ({ entity }) => - !isUndefined( - entity.properties.find(({ name }) => name === newValue) - ) || - !isUndefined( - entity.primary_keys.find((key) => key === newValue) - ) || - !isUndefined( - entity.property_indexes.find( - ({ fields }) => - !isUndefined( - fields.find((fieldName) => fieldName === newValue) - ) - ) - ) - ) - ) - ) { - this.validateReuseErrorMessage[category] = i18next.t( - 'addition.store.same-property-name-notice' - ); - - return false; - } - } - - if (category === 'property_index') { - if ( - !isUndefined( - this.checkedReusableData!.propertyindex_conflicts.find( - ({ entity }) => entity.name === newValue - ) - ) || - !isUndefined( - this.checkedReusableData!.vertexlabel_conflicts.find( - ({ entity }) => - !isUndefined( - entity.property_indexes.find(({ name }) => name === newValue) - ) - ) - ) - ) { - this.validateReuseErrorMessage[category] = i18next.t( - 'addition.store.same-index-name-notice' - ); - - return false; - } - } - } - - return true; - } - - @action - mutateReuseData( - category: 'vertexType' | 'property' | 'property_index', - originalValue: string, - newValue: string - ) { - const editedCheckedReusableData = cloneDeep(this.editedCheckedReusableData); - - if (category === 'vertexType') { - } - - if (category === 'property') { - editedCheckedReusableData!.vertexlabel_conflicts.forEach( - ({ entity }, index) => { - const mutatePropertyIndex = entity.properties.findIndex( - ({ name }) => name === originalValue - ); - - if (mutatePropertyIndex !== -1) { - entity.properties[mutatePropertyIndex].name = newValue; - // property name in current vertex label has been edited - this.reusableVertexTypeNameChangeIndexes.add(index); - } - - const primaryKeyIndex = entity.primary_keys.findIndex( - (key) => key === originalValue - ); - - if (primaryKeyIndex !== -1) { - entity.primary_keys[primaryKeyIndex] = newValue; - this.reusableVertexTypeNameChangeIndexes.add(index); - } - - entity.property_indexes.forEach(({ fields }) => { - const mutatePropertyIndexIndex = fields.findIndex( - (fieldName) => fieldName === originalValue - ); - - if (mutatePropertyIndexIndex !== -1) { - fields[mutatePropertyIndex] = newValue; - this.reusableVertexTypeNameChangeIndexes.add(index); - } - }); - } - ); - - editedCheckedReusableData!.propertyindex_conflicts.forEach( - ({ entity }, index) => { - const mutateIndex = entity.fields.findIndex( - (fieldName) => fieldName === originalValue - ); - - if (mutateIndex !== -1) { - entity.fields[mutateIndex] = newValue; - this.reusablePropertyIndexNameChangeIndexes.add(index); - } - } - ); - } - - if (category === 'property_index') { - editedCheckedReusableData!.vertexlabel_conflicts.forEach( - ({ entity }, index) => { - const mutateVertexIndex = entity.property_indexes.findIndex( - ({ name }) => name === originalValue - ); - - if (mutateVertexIndex !== -1) { - entity.property_indexes[mutateVertexIndex].name = newValue; - this.reusableVertexTypeNameChangeIndexes.add(index); - } - } - ); - } - - this.editedCheckedReusableData = editedCheckedReusableData; - this.checkedReusableData = cloneDeep(editedCheckedReusableData); - } - - @action - deleteReuseData( - category: - | 'vertexlabel_conflicts' - | 'propertykey_conflicts' - | 'propertyindex_conflicts', - index: number - ) { - if (this.editedCheckedReusableData !== null) { - const editedCheckedReusableData = cloneDeep( - this.editedCheckedReusableData - ); - - if (category === 'vertexlabel_conflicts') { - const deletedVertexType = - editedCheckedReusableData.vertexlabel_conflicts[index]; - const deletedPropertyNames: string[] = []; - const deletedPropertyIndexNames: string[] = []; - - deletedVertexType.entity.properties.forEach(({ name }) => { - deletedPropertyNames.push(name); - }); - - deletedVertexType.entity.property_indexes.forEach(({ name }) => { - deletedPropertyIndexNames.push(name); - }); - - editedCheckedReusableData.vertexlabel_conflicts.splice(index, 1); - - // if there's no vertex labels, return since it will move back to the previous step - if (editedCheckedReusableData.vertexlabel_conflicts.length === 0) { - return; - } - - deletedPropertyIndexNames.forEach((propertyIndexName) => { - remove( - editedCheckedReusableData.propertyindex_conflicts, - ({ entity }) => entity.name === propertyIndexName - ); - }); - - deletedPropertyNames - .filter( - (propertyName) => - !isUndefined( - editedCheckedReusableData.vertexlabel_conflicts.find( - ({ entity }) => - isUndefined( - entity.properties.find( - ({ name }) => name === propertyName - ) - ) - ) - ) - ) - .forEach((propertyName) => { - remove( - editedCheckedReusableData.propertykey_conflicts, - ({ entity }) => entity.name === propertyName - ); - }); - } - - if (category === 'propertykey_conflicts') { - const deletedName = - editedCheckedReusableData.propertykey_conflicts[index].entity.name; - // remove property in properties - editedCheckedReusableData.propertykey_conflicts.splice(index, 1); - - // remove property in property index - editedCheckedReusableData.propertyindex_conflicts.forEach( - ({ entity }) => { - remove(entity.fields, (name) => name === deletedName); - } - ); - - remove( - editedCheckedReusableData.propertyindex_conflicts, - ({ entity }) => entity.fields.length === 0 - ); - - // remove property in vertex labels - editedCheckedReusableData.vertexlabel_conflicts.forEach( - ({ entity }, vertexlabelIndex) => { - const cb = (param: { name: string } | string) => { - const name = typeof param === 'string' ? param : param.name; - - if (name === deletedName) { - this.reusableVertexTypeNameChangeIndexes.add(vertexlabelIndex); - return true; - } - - return false; - }; - - remove(entity.properties, cb); - remove(entity.primary_keys, cb); - - entity.property_indexes.forEach(({ fields }) => { - remove(fields, cb); - }); - } - ); - } - - if (category === 'propertyindex_conflicts') { - const { - name: deletedPropertyIndexName, - fields - } = editedCheckedReusableData.propertyindex_conflicts[index].entity; - - editedCheckedReusableData.propertyindex_conflicts.splice(index, 1); - - // delete property index in vertex label - editedCheckedReusableData.vertexlabel_conflicts.forEach( - ({ entity }, index) => { - const deletedIndex = entity.property_indexes.findIndex( - ({ name }) => name === deletedPropertyIndexName - ); - - if (deletedIndex !== -1) { - this.reusableVertexTypeNameChangeIndexes.add(index); - entity.property_indexes.splice(deletedIndex, 1); - } - } - ); - } - - this.mutateEditedReusableData(editedCheckedReusableData); - } - } - - @action - resetValidateNewVertexTypeMessage( - category?: VertexTypeValidateFields, - propertIndexIndex?: number, - propertIndexProperty?: keyof VertexTypeValidatePropertyIndexes - ) { - if (isUndefined(category)) { - this.validateNewVertexTypeErrorMessage = { - name: '', - properties: '', - primaryKeys: '', - displayFeilds: '', - propertyIndexes: [] - }; - - return; - } - - if (category === 'propertyIndexes') { - (this.validateNewVertexTypeErrorMessage - .propertyIndexes as VertexTypeValidatePropertyIndexes[])[ - propertIndexIndex as number - ][propertIndexProperty as keyof VertexTypeValidatePropertyIndexes] = ''; - - return; - } - - this.validateNewVertexTypeErrorMessage[category] = ''; - } - - @action - resetValidateReuseErrorMessage( - category?: 'vertexType' | 'property' | 'property_index' - ) { - if (isUndefined(category)) { - this.validateReuseErrorMessage = { - property: '', - property_index: '', - vertexType: '' - }; - - return; - } - - this.validateReuseErrorMessage[category] = ''; - } - - @action - dispose() { - this.currentTabStatus = 'list'; - this.requestStatus = { - fetchVertexTypeList: 'pending', - checkIfUsing: 'pending', - addVertexType: 'pending', - updateVertexType: 'pending', - deleteVertexType: 'pending', - checkConflict: 'pending', - recheckConflict: 'pending', - reuseVertexType: 'pending' - }; - this.vertexListPageConfig = { - pageNumber: 1, - pageTotal: 0, - sort: '' - }; - this.errorMessage = ''; - - this.isCreatedReady = false; - this.isAddNewPropertyIndexReady = true; - this.isEditReady = true; - - this.resetNewVertextType(); - this.selectedVertexType = null; - this.selectedVertexTypeNames = []; - this.resetEditedSelectedVertexType(); - this.vertexTypes = []; - this.vertexTypeUsingStatus = null; - // reuse - this.reusableVertexTypes = []; - this.checkedReusableData = null; - this.editedCheckedReusableData = null; - this.resetValidateNewVertexTypeMessage(); - this.resetValidateReuseErrorMessage(); - } - - fetchVertexTypeList = flow(function* fetchVertexTypeList( - this: VertexTypeStore, - options?: { fetchAll?: boolean; reuseId?: number } - ) { - this.requestStatus.fetchVertexTypeList = 'pending'; - - const conn_id = - options && typeof options.reuseId === 'number' - ? options.reuseId - : this.metadataConfigsRootStore.currentId; - - try { - const result: AxiosResponse> = yield axios - .get(`${baseUrl}/${conn_id}/schema/vertexlabels`, { - params: { - page_no: this.vertexListPageConfig.pageNumber, - page_size: !options ? 10 : -1, - name_order: - this.vertexListPageConfig.sort !== '' - ? this.vertexListPageConfig.sort - : null - } - }) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - if (result.data.status === 401) { - this.validateLicenseOrMemories = false; - } - - throw new Error(result.data.message); - } - - if (options && typeof options.reuseId === 'number') { - this.reusableVertexTypes = result.data.data.records; - } else { - this.vertexTypes = result.data.data.records; - this.vertexListPageConfig.pageTotal = result.data.data.total; - } - - if (this.currentTabStatus !== 'reuse') { - result.data.data.records.length === 0 - ? (this.currentTabStatus = 'empty') - : (this.currentTabStatus = 'list'); - } - - this.requestStatus.fetchVertexTypeList = 'success'; - } catch (error) { - this.requestStatus.fetchVertexTypeList = 'failed'; - this.errorMessage = error.message; - } - }); - - checkIfUsing = flow(function* checkIfUsing( - this: VertexTypeStore, - selectedPropertyNames: string[] - ) { - this.requestStatus.checkIfUsing = 'pending'; - - try { - const result: AxiosResponse - >> = yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/vertexlabels/check_using`, - { - names: selectedPropertyNames - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.vertexTypeUsingStatus = result.data.data; - this.requestStatus.checkIfUsing = 'success'; - } catch (error) { - this.requestStatus.checkIfUsing = 'failed'; - this.errorMessage = error.message; - } - }); - - addVertexType = flow(function* addVertexType(this: VertexTypeStore) { - this.requestStatus.addVertexType = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/vertexlabels`, - { - name: this.newVertexType.name, - id_strategy: this.newVertexType.id_strategy, - properties: this.newVertexType.properties, - primary_keys: this.newVertexType.primary_keys, - property_indexes: this.newVertexType.property_indexes, - open_label_index: this.newVertexType.open_label_index, - style: this.newVertexType.style - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.requestStatus.addVertexType = 'success'; - } catch (error) { - this.requestStatus.addVertexType = 'failed'; - this.errorMessage = error.message; - } - }); - - updateVertexType = flow(function* updateVertexType(this: VertexTypeStore) { - this.requestStatus.updateVertexType = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .put( - `${baseUrl}/${ - this.metadataConfigsRootStore.currentId - }/schema/vertexlabels/${this.selectedVertexType!.name}`, - { - append_properties: this.editedSelectedVertexType.append_properties, - append_property_indexes: this.editedSelectedVertexType - .append_property_indexes, - remove_property_indexes: this.editedSelectedVertexType - .remove_property_indexes, - style: this.editedSelectedVertexType.style - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.requestStatus.updateVertexType = 'success'; - } catch (error) { - this.requestStatus.updateVertexType = 'failed'; - this.errorMessage = error.message; - } - }); - - deleteVertexType = flow(function* deleteVertexType( - this: VertexTypeStore, - selectedVertexTypeNames: string[] - ) { - this.requestStatus.deleteVertexType = 'pending'; - - const combinedParams = selectedVertexTypeNames - .map((name) => 'names=' + name) - .join('&'); - - try { - const result: AxiosResponse> = yield axios - .delete( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/vertexlabels?` + - combinedParams + - `&skip_using=${String(size(selectedVertexTypeNames) !== 1)}` - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - if ( - selectedVertexTypeNames.length === this.vertexTypes.length && - this.vertexListPageConfig.pageNumber === - Math.ceil(this.vertexListPageConfig.pageTotal / 10) && - this.vertexListPageConfig.pageNumber > 1 - ) { - this.vertexListPageConfig.pageNumber = - this.vertexListPageConfig.pageNumber - 1; - } - - this.requestStatus.deleteVertexType = 'success'; - } catch (error) { - this.requestStatus.deleteVertexType = 'failed'; - this.errorMessage = error.message; - } - }); - - checkConflict = flow(function* checkConflict( - this: VertexTypeStore, - reuseId: string, - selectedVertexTypes: string[] - ) { - this.requestStatus.checkConflict = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/vertexlabels/check_conflict`, - { - vertexlabels: selectedVertexTypes.map((selectedVertexType) => - this.reusableVertexTypes.find( - ({ name }) => name === selectedVertexType - ) - ) - }, - { - params: { - reused_conn_id: this.metadataConfigsRootStore.graphManagementStore.idList.find( - ({ name }) => name === reuseId - )!.id - } - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.checkedReusableData = result.data.data; - this.editedCheckedReusableData = cloneDeep(result.data.data); - this.requestStatus.checkConflict = 'success'; - } catch (error) { - this.requestStatus.checkConflict = 'failed'; - this.errorMessage = error.message; - } - }); - - recheckConflict = flow(function* recheckConflict(this: VertexTypeStore) { - this.requestStatus.recheckConflict = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/vertexlabels/recheck_conflict`, - { - propertykeys: this.editedCheckedReusableData!.propertykey_conflicts.map( - ({ entity }) => ({ - ...entity - }) - ), - propertyindexes: this.editedCheckedReusableData!.propertyindex_conflicts.map( - ({ entity }) => ({ - ...entity - }) - ), - vertexlabels: this.editedCheckedReusableData!.vertexlabel_conflicts.map( - ({ entity }) => ({ - ...entity - }) - ) - } - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.checkedReusableData = result.data.data; - this.editedCheckedReusableData = cloneDeep(result.data.data); - this.requestStatus.recheckConflict = 'success'; - } catch (error) { - this.requestStatus.recheckConflict = 'failed'; - this.errorMessage = error.message; - } - }); - - reuseVertexType = flow(function* reuseVertexType(this: VertexTypeStore) { - this.requestStatus.reuseVertexType = 'pending'; - - try { - const result: AxiosResponse> = yield axios - .post( - `${baseUrl}/${this.metadataConfigsRootStore.currentId}/schema/vertexlabels/reuse`, - this.editedCheckedReusableData - ) - .catch(checkIfLocalNetworkOffline); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.requestStatus.reuseVertexType = 'success'; - } catch (error) { - this.requestStatus.reuseVertexType = 'failed'; - this.errorMessage = error.message; - } - }); -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/appStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/appStore.ts deleted file mode 100644 index d8819211f..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/appStore.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { createContext } from 'react'; -import { observable, action, flow } from 'mobx'; -import axios, { AxiosResponse } from 'axios'; -import { responseData, baseUrl } from './types/common'; - -export class AppStore { - @observable user: string = 'Hi, User name'; - @observable currentId: number | null = null; - @observable currentTab: string = 'graph-management'; - @observable errorMessage = ''; - - @observable colorList: string[] = []; - - @observable.shallow requestStatus = { - fetchColorList: 'pending' - }; - - @action.bound - setCurrentId(id: number) { - this.currentId = id; - } - - @action.bound - switchCurrentTab(tab: string) { - this.currentTab = tab; - } - - @action.bound - setUser(user: string) { - this.user = user; - } - - @action - dispose() { - this.user = 'Hi, User name'; - this.currentTab = 'graph-management'; - this.requestStatus = { - fetchColorList: 'pending' - }; - } - - fetchColorList = flow(function* fetchColorList(this: AppStore) { - this.requestStatus.fetchColorList = 'pending'; - - try { - const result: AxiosResponse> = yield axios.get( - `${baseUrl}/${this.currentId}/schema/vertexlabels/optional-colors` - ); - - if (result.data.status !== 200) { - throw new Error(result.data.message); - } - - this.colorList = result.data.data; - this.requestStatus.fetchColorList = 'success'; - } catch (error) { - this.requestStatus.fetchColorList = 'failed'; - this.errorMessage = error.message; - console.error(error.message); - } - }); -} - -export default createContext(new AppStore()); diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/asyncTasksStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/asyncTasksStore.ts deleted file mode 100644 index 9a0a54052..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/asyncTasksStore.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -export function initRequestStatus() { - return { - fetchAsyncTaskList: 'standby', - fetchAsyncTask: 'standby', - deleteAsyncTask: 'standby', - abortAsyncTask: 'standby' - }; -} - -export function initErrorInfo() { - return { - fetchAsyncTaskList: { - code: NaN, - message: '' - }, - fetchAsyncTask: { - code: NaN, - message: '' - }, - deleteAsyncTask: { - code: NaN, - message: '' - }, - abortAsyncTask: { - code: NaN, - message: '' - } - }; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataAnalyzeStore/algorithmStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataAnalyzeStore/algorithmStore.ts deleted file mode 100644 index b58aa6cd4..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataAnalyzeStore/algorithmStore.ts +++ /dev/null @@ -1,529 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { v4 } from 'uuid'; - -export enum Algorithm { - loopDetection = 'loop-detection', - focusDetection = 'focus-detection', - shortestPath = 'shortest-path', - shortestPathAll = 'shortest-path-all', - allPath = 'all-path', - modelSimilarity = 'model-similarity', - neighborRank = 'neighbor-rank', - kStepNeighbor = 'k-step-neighbor', - kHop = 'k-hop', - customPath = 'custom-path', - radiographicInspection = 'radiographic-inspection', - sameNeighbor = 'same-neighbor', - weightedShortestPath = 'weighted-shortest-path', - singleSourceWeightedShortestPath = 'single-source-weighted-shortest-path', - jaccard = 'jaccard', - personalRankRecommendation = 'personal-rank' -} - -export function initializeRequestStatus() { - return { - fetchAlgorithmResult: 'standby' - }; -} - -export function initializeErrorInfo() { - return { - fetchAlgorithmResult: { - code: NaN, - message: '' - } - }; -} - -export function createLoopDetectionDefaultParams() { - return { - source: '', - direction: 'BOTH', - max_depth: '', - label: '__all__', - max_degree: '10000', - source_in_ring: true, - limit: '10', - capacity: '10000000' - }; -} - -export function createValidateLoopDetectionParamsErrorMessage() { - return { - source: '', - direction: '', - max_depth: '', - label: '', - max_degree: '', - source_in_ring: '', - limit: '', - capacity: '' - }; -} - -export function createFocusDetectionDefaultParams() { - return { - source: '', - target: '', - direction: 'BOTH', - max_depth: '', - label: '__all__', - max_degree: '10000', - capacity: '10000000', - limit: '10' - }; -} - -export function createValidateFocusDetectionParamsErrorMessage() { - return { - source: '', - target: '', - direction: '', - max_depth: '', - label: '', - max_degree: '', - skip_degree: '', - capacity: '', - limit: '' - }; -} - -export function createShortestPathDefaultParams() { - return { - source: '', - target: '', - direction: 'BOTH', - max_depth: '', - label: '__all__', - max_degree: '10000', - skip_degree: '0', - capacity: '10000000' - }; -} - -export function createValidateShortestPathParamsErrorMessage() { - return { - source: '', - target: '', - direction: '', - max_depth: '', - label: '', - max_degree: '', - skip_degree: '', - capacity: '' - }; -} - -export function createShortestPathAllDefaultParams() { - return { - source: '', - target: '', - direction: 'BOTH', - max_depth: '', - label: '__all__', - max_degree: '10000', - skip_degree: '0', - capacity: '10000000' - }; -} - -export function createValidateShortestPathAllParamsErrorMessage() { - return { - source: '', - target: '', - direction: '', - max_depth: '', - label: '', - max_degree: '', - skip_degree: '', - capacity: '' - }; -} - -export function createAllPathDefaultParams() { - return { - source: '', - target: '', - direction: 'BOTH', - max_depth: '', - label: '__all__', - max_degree: '10000', - skip_degree: '0', - capacity: '10000000', - limit: '10' - }; -} - -export function createValidateAllPathParamsErrorMessage() { - return { - source: '', - target: '', - direction: '', - max_depth: '', - label: '', - max_degree: '', - skip_degree: '', - capacity: '', - limit: '' - }; -} - -export function createModelSimilarityDefaultParams() { - return { - method: 'id', - source: '', - vertexType: '', - vertexProperty: [['', '']], - direction: 'BOTH', - least_neighbor: '', - similarity: '', - label: '__all__', - max_similar: '1', - least_similar: '1', - property_filter: '', - least_property_number: '', - max_degree: '10000', - capacity: '10000000', - limit: '10', - return_common_connection: false, - return_complete_info: false - }; -} - -export function createValidateModelSimilarParamsErrorMessage() { - return { - method: '', - source: '', - vertexType: '', - vertexProperty: '', - direction: '', - least_neighbor: '', - similarity: '', - label: '', - max_similar: '', - least_similar: '', - property_filter: '', - least_property_number: '', - max_degree: '', - capacity: '', - limit: '', - return_common_connection: '', - return_complete_info: '' - }; -} - -export function createNeighborRankDefaultParams(): { - source: string; - alpha: string; - capacity: string; - steps: { - uuid: string; - direction: string; - labels: string[]; - degree: string; - top: string; - }[]; -} { - return { - source: '', - alpha: '', - capacity: '10000000', - steps: [ - { - uuid: v4(), - direction: 'BOTH', - labels: ['__all__'], - degree: '10000', - top: '100' - } - ] - }; -} - -export function createValidateNeighborRankErrorMessage(): { - source: string; - alpha: string; - capacity: string; - steps: { - uuid: string; - direction: string; - labels: string; - degree: string; - top: string; - }[]; -} { - return { - source: '', - alpha: '', - capacity: '', - steps: [ - { - uuid: '', - direction: '', - labels: '', - degree: '', - top: '' - } - ] - }; -} - -export function createKStepNeighborDefaultParams() { - return { - source: '', - direction: 'BOTH', - max_depth: '', - label: '__all__', - max_degree: '10000', - limit: '10000000' - }; -} - -export function createValidateKStepNeighborParamsErrorMessage() { - return { - source: '', - direction: '', - max_depth: '', - label: '', - max_degree: '', - limit: '' - }; -} - -export function createKHopDefaultParams() { - return { - source: '', - direction: 'BOTH', - max_depth: '', - nearest: true, - label: '__all__', - max_degree: '10000', - limit: '10000000', - capacity: '10000000' - }; -} - -export function createValidateKHopParamsErrorMessage() { - return { - source: '', - direction: '', - max_depth: '', - nearest: '', - label: '', - max_degree: '', - limit: '', - capacity: '' - }; -} - -export function createCustomPathDefaultParams() { - return { - method: 'id', - source: '', - vertexType: '', - vertexProperty: [['', '']], - sort_by: 'NONE', - capacity: '10000000', - limit: '10', - steps: [ - { - uuid: v4(), - direction: 'BOTH', - labels: [], - properties: [['', '']], - weight_by: '', - default_weight: '', - degree: '10000', - sample: '100' - } - ] - }; -} - -export function createValidateCustomPathParamsErrorMessage() { - return { - method: '', - source: '', - vertexType: '', - vertexProperty: '', - sort_by: '', - capacity: '', - limit: '', - steps: [ - { - uuid: '', - direction: '', - labels: '', - properties: '', - weight_by: '', - default_weight: '', - degree: '', - sample: '' - } - ] - }; -} - -export function createRadiographicInspectionDefaultParams() { - return { - source: '', - direction: 'BOTH', - max_depth: '', - label: '__all__', - max_degree: '10000', - capacity: '1000000', - limit: '10' - }; -} - -export function createValidateRadiographicInspectionParamsErrorMessage() { - return { - source: '', - direction: '', - max_depth: '', - label: '', - max_degree: '', - capacity: '', - limit: '' - }; -} - -export function createSameNeighborDefaultParams() { - return { - vertex: '', - other: '', - direction: 'BOTH', - label: '__all__', - max_degree: '10000', - limit: '10000000' - }; -} - -export function createValidateSameNeighborParamsErrorMessage() { - return { - vertex: '', - other: '', - direction: '', - label: '', - max_degree: '', - limit: '' - }; -} - -export function createWeightedShortestPathDefaultParams() { - return { - source: '', - target: '', - direction: 'BOTH', - weight: '', - with_vertex: true, - label: '__all__', - max_degree: '10000', - skip_degree: '0', - capacity: '10000000' - }; -} - -export function createValidateWeightedShortestPathParamsErrorMessage() { - return { - source: '', - target: '', - direction: '', - weight: '', - with_vertex: '', - label: '', - max_degree: '', - skip_degree: '', - capacity: '' - }; -} - -export function createSingleSourceWeightedShortestPathDefaultParams() { - return { - source: '', - direction: 'BOTH', - weight: '', - with_vertex: true, - label: '__all__', - max_degree: '10000', - skip_degree: '0', - capacity: '10000000', - limit: '10' - }; -} - -export function createValidateSingleSourceWeightedShortestPathParamsErrorMessage() { - return { - source: '', - direction: '', - weight: '', - with_vertex: '', - label: '', - max_degree: '', - skip_degree: '', - capacity: '', - limit: '' - }; -} - -export function createJaccardDefaultParams() { - return { - vertex: '', - other: '', - direction: 'BOTH', - label: '__all__', - max_degree: '10000' - }; -} - -export function createValidateJaccardParamsErrorMessage() { - return { - vertex: '', - other: '', - direction: '', - label: '', - max_degree: '' - }; -} - -export function createPersonalRankDefaultParams() { - return { - source: '', - alpha: '', - max_depth: '', - with_label: 'SAME_LABEL', - label: '', - degree: '10000', - limit: '10000000', - sorted: true - }; -} - -export function createValidatePersonalRankParamsErrorMessage() { - return { - source: '', - alpha: '', - max_depth: '', - with_label: '', - label: '', - degree: '', - limit: '', - sorted: '' - }; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataAnalyzeStore/dataAnalyzeStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataAnalyzeStore/dataAnalyzeStore.ts deleted file mode 100644 index 236a95734..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataAnalyzeStore/dataAnalyzeStore.ts +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -export function initalizeRequestStatus() { - return { - fetchIdList: 'standby', - fetchValueTypes: 'standby', - fetchVertexTypeList: 'standby', - fetchColorSchemas: 'standby', - fetchColorList: 'standby', - fetchEdgeTypes: 'standby', - fetchAllNodeStyle: 'standby', - fetchAllEdgeStyle: 'standby', - fetchAllPropertyIndexes: 'standby', - fetchGraphs: 'standby', - createAsyncTask: 'standby', - addGraphNode: 'standby', - fetchRelatedEdges: 'standby', - addGraphEdge: 'standby', - expandGraphNode: 'standby', - filteredGraphData: 'standby', - updateGraphProperties: 'standby', - fetchRelatedVertex: 'standby', - fetchFilteredPropertyOptions: 'standby', - addQueryCollection: 'standby', - editQueryCollection: 'standby', - deleteQueryCollection: 'standby', - fetchExecutionLogs: 'standby', - fetchFavoriteQueries: 'standby' - }; -} - -export function initalizeErrorInfo() { - return { - fetchIdList: { - code: NaN, - message: '' - }, - fetchValueTypes: { - code: NaN, - message: '' - }, - fetchVertexTypeList: { - code: NaN, - message: '' - }, - fetchColorSchemas: { - code: NaN, - message: '' - }, - fetchColorList: { - code: NaN, - message: '' - }, - fetchEdgeTypes: { - code: NaN, - message: '' - }, - fetchAllNodeStyle: { - code: NaN, - message: '' - }, - fetchAllEdgeStyle: { - code: NaN, - message: '' - }, - fetchAllPropertyIndexes: { - code: NaN, - message: '' - }, - fetchGraphs: { - code: NaN, - message: '' - }, - createAsyncTask: { - code: NaN, - message: '' - }, - addGraphNode: { - code: NaN, - message: '' - }, - fetchRelatedEdges: { - code: NaN, - message: '' - }, - addGraphEdge: { - code: NaN, - message: '' - }, - expandGraphNode: { - code: NaN, - message: '' - }, - filteredGraphData: { - code: NaN, - message: '' - }, - updateGraphProperties: { - code: NaN, - message: '' - }, - fetchRelatedVertex: { - code: NaN, - message: '' - }, - filteredPropertyOptions: { - code: NaN, - message: '' - }, - addQueryCollection: { - code: NaN, - message: '' - }, - editQueryCollection: { - code: NaN, - message: '' - }, - fetchExecutionLogs: { - code: NaN, - message: '' - }, - fetchFavoriteQueries: { - code: NaN, - message: '' - }, - deleteQueryCollection: { - code: NaN, - message: '' - } - }; -} - -export function createGraphNode() { - return { - id: '', - label: '', - properties: {} - }; -} - -export function createGraphEdge() { - return { - id: '', - source: '', - target: '', - label: '', - properties: {} - }; -} - -export function createGraphEditableProperties() { - return { - primary: new Map(), - nonNullable: new Map(), - nullable: new Map() - }; -} - -export function createNewGraphDataConfig() { - return { - id: '', - label: '', - properties: { - nullable: new Map(), - nonNullable: new Map() - } - }; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/dataImportRootStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/dataImportRootStore.ts deleted file mode 100644 index 442247a3d..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/dataImportRootStore.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -export function initRequestStatus() { - return { - fetchFilehashes: 'standby', - uploadFiles: 'standby', - deleteFiles: 'standby', - fetchVertexTypeList: 'standby', - fetchEdgeTypeList: 'standby', - sendUploadCompleteSignal: 'standby', - sendMappingCompleteSignal: 'standby' - }; -} - -export function initErrorInfo() { - return { - fetchFilehashes: { - code: NaN, - message: '' - }, - uploadFiles: { - code: NaN, - message: '' - }, - deleteFiles: { - code: NaN, - message: '' - }, - fetchVertexTypeList: { - code: NaN, - message: '' - }, - fetchEdgeTypeList: { - code: NaN, - message: '' - }, - sendUploadCompleteSignal: { - code: NaN, - message: '' - }, - sendMappingCompleteSignal: { - code: NaN, - message: '' - } - }; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/dataMapStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/dataMapStore.ts deleted file mode 100644 index 297383095..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/dataMapStore.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -export function initRequestStatus() { - return { - updateFileConfig: 'standby', - fetchDataMaps: 'standby', - updateVertexMap: 'standby', - updateEdgeMap: 'standby', - deleteVertexMap: 'standby', - deleteEdgeMap: 'standby' - }; -} - -export function initErrorInfo() { - return { - updateFileConfig: { - code: NaN, - message: '' - }, - fetchDataMaps: { - code: NaN, - message: '' - }, - updateVertexMap: { - code: NaN, - message: '' - }, - updateEdgeMap: { - code: NaN, - message: '' - }, - deleteVertexMap: { - code: NaN, - message: '' - }, - deleteEdgeMap: { - code: NaN, - message: '' - } - }; -} - -export function createNewVertexType() { - return { - label: '', - id_fields: [''], - field_mapping: [], - value_mapping: [], - null_values: { - checked: ['NULL', 'null'], - customized: [] - } - }; -} - -export function createNewEdgeType() { - return { - label: '', - source_fields: [''], - target_fields: [''], - field_mapping: [], - value_mapping: [], - null_values: { - checked: ['NULL', 'null'], - customized: [] - } - }; -} - -export function createValidateFileInfoErrorMessage() { - return { - delimiter: '', - charset: '', - date_format: '', - skipped_line: '' - }; -} - -export function createValidateAdvanceConfigErrorMessage() { - return { - null_values: [], - value_mapping: [] - }; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/importManagmentStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/importManagmentStore.ts deleted file mode 100644 index 08be4a12b..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/importManagmentStore.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -export function initRequestStatus() { - return { - fetchImportJobList: 'standby', - createNewJob: 'standby', - updateJobInfo: 'standby', - deleteJob: 'standby', - fetchFailedReason: 'standby' - }; -} - -export function initErrorInfo() { - return { - fetchImportJobList: { - code: NaN, - message: '' - }, - createNewJob: { - code: NaN, - message: '' - }, - updateJobInfo: { - code: NaN, - message: '' - }, - deleteJob: { - code: NaN, - message: '' - }, - fetchFailedReason: { - code: NaN, - message: '' - } - }; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/serverDataImportStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/serverDataImportStore.ts deleted file mode 100644 index 0cc588b1d..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/factory/dataImportStore/serverDataImportStore.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { LoadParameter } from '../../types/GraphManagementStore/dataImportStore'; - -export function initRequestStatus() { - return { - fetchImportTasks: 'standby', - fetchAllImportTasks: 'standby', - setConfigParams: 'standby', - startImport: 'standby', - pauseImport: 'standby', - resumeImport: 'standby', - abortImport: 'standby', - retryImport: 'standby', - deleteTaskImport: 'standby', - checkErrorLogs: 'standby' - }; -} - -export function initErrorInfo() { - return { - fetchImportTasks: { - code: NaN, - message: '' - }, - fetchAllImportTasks: { - code: NaN, - message: '' - }, - setConfigParams: { - code: NaN, - message: '' - }, - startImport: { - code: NaN, - message: '' - }, - pauseImport: { - code: NaN, - message: '' - }, - resumeImport: { - code: NaN, - message: '' - }, - abortImport: { - code: NaN, - message: '' - }, - retryImport: { - code: NaN, - message: '' - }, - deleteTaskImport: { - code: NaN, - message: '' - }, - checkErrorLogs: { - code: NaN, - message: '' - } - }; -} - -export function createValidateFileInfoErrorMessage(): Record< - keyof LoadParameter, - string -> { - return { - check_vertex: '', - insert_timeout: '', - max_parse_errors: '', - max_insert_errors: '', - retry_times: '', - retry_interval: '' - }; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/index.ts deleted file mode 100644 index 59f9b51c5..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/index.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import AppStoreContext, { AppStore } from './appStore'; -import GraphManagementStoreContext, { - GraphManagementStore -} from './GraphManagementStore/graphManagementStore'; -import DataAnalyzeStoreContext, { - DataAnalyzeStore -} from './GraphManagementStore/dataAnalyzeStore/dataAnalyzeStore'; -import DataImportRootStoreContext, { - DataImportRootStore -} from './GraphManagementStore/dataImportStore/dataImportRootStore'; -import ImportManagerStoreContext, { - ImportManagerStore -} from './GraphManagementStore/dataImportStore/ImportManagerStore'; -import AsyncTasksStoreContext, { - AsyncTasksStore -} from './GraphManagementStore/asyncTasksStore'; - -export { - AppStore, - AppStoreContext, - GraphManagementStore, - GraphManagementStoreContext, - DataAnalyzeStore, - DataAnalyzeStoreContext, - DataImportRootStore, - DataImportRootStoreContext, - ImportManagerStore, - ImportManagerStoreContext, - AsyncTasksStore, - AsyncTasksStoreContext -}; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/asyncTasksStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/asyncTasksStore.ts deleted file mode 100644 index 48d31e170..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/asyncTasksStore.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -export interface AsyncTask { - id: number; - task_type: string; - task_name: string; - task_status: string; - task_create: string; - task_update: string; - task_result: string; -} - -export interface AsyncTaskListResponse { - records: AsyncTask[]; - total: number; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/dataAnalyzeStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/dataAnalyzeStore.ts deleted file mode 100644 index 7a2eed3ac..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/dataAnalyzeStore.ts +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { Node, Edge } from 'vis-network'; -import { dict, responseData } from '../common'; -import { EdgeType } from './metadataConfigsStore'; - -export type ColorSchemas = dict; -export type RuleMap = dict; - -export interface FetchColorSchemas { - status: number; - data: ColorSchemas; - message: string; -} - -export type FetchFilteredPropertyOptions = responseData; - -export interface GraphNode extends Node { - id: string; - label: string; - properties: dict; - chosen?: any; - vLabel?: string; - style?: dict; -} - -export interface GraphEdge extends Edge { - id: string; - label: string; - properties: dict; - source: string; - target: string; -} - -export interface GraphView { - vertices: GraphNode[]; - edges: GraphEdge[]; -} - -export interface NewGraphData { - id?: string; - label: string; - properties: { - nullable: Map; - nonNullable: Map; - }; -} - -export interface EditableProperties { - nonNullable: Map; - nullable: Map; -} - -export interface QueryResult { - table_view: { - header: string[]; - rows: dict[]; - }; - json_view: { - data: dict[]; - }; - graph_view: GraphView; - type: string; -} - -export type FetchGraphResponse = responseData; - -export interface ValueTypes { - name: string; - data_type: string; - cardinality: string; - create_time: string; -} - -export interface AddQueryCollectionParams { - name: string; - content: string; -} - -export interface ExecutionLogs { - id: number; - async_id: number; - async_status: - | 'UNKNOWN' - | 'SCHEDULING' - | 'SCHEDULED' - | 'QUEUED' - | 'RESTORING' - | 'RUNNING' - | 'SUCCESS' - | 'CANCELLING' - | 'CANCELLED' - | 'FAILED'; - type: string; - algorithm_name: string; - content: string; - status: 'SUCCESS' | 'RUNNING' | 'FAILED'; - duration: string; - create_time: string; -} - -export type ExecutionLogsResponse = responseData<{ - records: ExecutionLogs[]; - total: number; -}>; - -export interface FavoriteQuery { - id: number; - name: string; - content: string; - create_time: string; -} - -export type FavoriteQueryResponse = responseData<{ - records: FavoriteQuery[]; - total: number; -}>; - -/* algorithm store */ -export interface LoopDetectionParams { - source: string; - direction: string; - max_depth: string; - label: string; - source_in_ring: boolean; - max_degree: string; - limit: string; - capacity: string; -} - -export interface FocusDetectionParams { - source: string; - target: string; - direction: string; - max_depth: string; - label: string; - max_degree: string; - limit: string; - capacity: string; -} - -export interface ShortestPathAlgorithmParams { - source: string; - target: string; - direction: string; - max_depth: string; - label: string; - max_degree: string; - skip_degree: string; - capacity: string; -} - -// export type ShortestPathAllAlgorithmParams = ShortestPathAlgorithmParams; -export interface ShortestPathAllAlgorithmParams { - source: string; - target: string; - direction: string; - max_depth: string; - label: string; - max_degree: string; - skip_degree: string; - capacity: string; -} - -export type AllPathAlgorithmParams = { - source: string; - target: string; - direction: string; - max_depth: string; - label: string; - max_degree: string; - capacity: string; - limit: string; -}; - -export interface ModelSimilarityParams { - method: string; - source: string; - vertexType: string; - vertexProperty: string[][]; - direction: string; - least_neighbor: string; - similarity: string; - label: string; - max_similar: string; - least_similar: string; - property_filter: string; - least_property_number: string; - max_degree: string; - capacity: string; - limit: string; - return_common_connection: boolean; - return_complete_info: boolean; -} - -export interface NeighborRankRule { - uuid: string; - direction: string; - labels: string[]; - degree: string; - top: string; -} - -export interface NeighborRankParams { - source: string; - alpha: string; - capacity: string; - steps: NeighborRankRule[]; -} - -export interface KStepNeighbor { - source: string; - direction: string; - max_depth: string; - label: string; - max_degree: string; - limit: string; -} - -export interface KHop { - source: string; - direction: string; - max_depth: string; - nearest: boolean; - label: string; - max_degree: string; - limit: string; - capacity: string; -} - -export interface CustomPathParams { - method: string; - source: string; - vertexType: string; - vertexProperty: string[][]; - sort_by: string; - capacity: string; - limit: string; - steps: CustomPathRule[]; -} - -export interface CustomPathRule { - uuid: string; - direction: string; - labels: string[]; - properties: string[][]; - weight_by: string; - default_weight: string; - degree: string; - sample: string; -} - -export interface RadiographicInspection { - source: string; - direction: string; - max_depth: string; - label: string; - max_degree: string; - capacity: string; - limit: string; -} - -export interface SameNeighbor { - vertex: string; - other: string; - direction: string; - label: string; - max_degree: string; - limit: string; -} - -export interface WeightedShortestPath { - source: string; - target: string; - direction: string; - weight: string; - with_vertex: boolean; - label: string; - max_degree: string; - skip_degree: string; - capacity: string; -} - -export interface SingleSourceWeightedShortestPath { - source: string; - direction: string; - weight: string; - with_vertex: boolean; - label: string; - max_degree: string; - skip_degree: string; - capacity: string; - limit: string; -} - -export interface Jaccard { - vertex: string; - other: string; - direction: string; - label: string; - max_degree: string; -} - -export interface PersonalRank { - source: string; - alpha: string; - max_depth: string; - with_label: string; - label: string; - degree: string; - limit: string; - sorted: boolean; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/dataImportStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/dataImportStore.ts deleted file mode 100644 index 28a1d81b1..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/dataImportStore.ts +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { CancellablePromise } from 'mobx/lib/api/flow'; - -export interface JobGlance { - name: string; - description: string; -} - -export interface Job { - id: number; - conn_id: number; - job_name: string; - job_remarks: string; - job_size: string; - job_status: string; - job_duration: string; - update_time: string; - create_time: string; -} - -export interface JobResponse { - records: Job[]; - total: number; -} - -export interface JobFailedReason { - task_id: number; - file_id: number; - file_name: string; - reason: string; -} - -export interface FileUploadTask { - name: string; - size: number; - status: 'uploading' | 'failed' | 'success'; - chunkList: { - chunkIndex: number; - chunk: Blob; - }[]; - chunkTotal: number; - uploadedChunkTotal: number; - pendingChunkIndexes: number[]; - failedChunkIndexes: number[]; - uploadedChunksIndexes: number[]; -} - -export interface FileUploadResult { - id: string; - name: string; - size: string; - status: string; - cause: string | null; -} - -export interface FileUploadQueue { - fileName: string; - status: string; - task: CancellablePromise; -} - -export interface FileConfig { - has_header: boolean; - column_names: string[]; - column_values: string[]; - format: string; - delimiter: string; - charset: string; - date_format: string; - time_zone: string; - skipped_line: string; -} - -export type FileValidator = Pick< - FileConfig, - 'delimiter' | 'charset' | 'date_format' | 'skipped_line' ->; - -export interface FieldMapping { - column_name: string; - mapped_name: string; -} - -export interface ValueMapping { - column_name: string; - values: { - column_value: string; - mapped_value: string; - }[]; -} - -export type ValueMapValidator = { - null_values: string[]; - value_mapping: ValueMapping[]; -}; - -export interface NullValues { - checked: string[]; - customized: string[]; -} - -export interface VertexMap { - id?: string; - label: string; - id_fields: string[]; - field_mapping: FieldMapping[]; - value_mapping: ValueMapping[]; - null_values: NullValues; -} - -export interface EdgeMap { - id?: string; - label: string; - source_fields: string[]; - target_fields: string[]; - field_mapping: FieldMapping[]; - value_mapping: ValueMapping[]; - null_values: NullValues; -} - -export interface LoadParameter { - check_vertex: boolean; - insert_timeout: string; - max_parse_errors: string; - max_insert_errors: string; - retry_times: string; - retry_interval: string; -} - -export interface FileMapInfo { - id: number; - name: string; - total_lines: number; - total_size: string; - total_size_bytes: number; - file_setting: FileConfig; - file_status: string; - vertex_mappings: VertexMap[]; - edge_mappings: EdgeMap[]; - load_parameter: LoadParameter; - last_access_time: string; -} - -export interface FileMapResult { - records: FileMapInfo[]; -} - -export interface ImportTasks { - id: number; - conn_id: number; - file_id: number; - vertices: string[]; - edges: string[]; - load_rate: number; - load_progress: number; - file_total_lines: number; - file_read_lines: number; - status: string; - duration: string; -} - -export interface AllImportTasksRecords { - records: ImportTasks[]; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/graphManagementStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/graphManagementStore.ts deleted file mode 100644 index fdca50cb1..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/graphManagementStore.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { responseData } from '../common'; - -export interface LincenseInfo { - name: string; - edition: string; - version: string; - allowed_graphs: number; - allowed_datasize: string; -} - -export interface GraphData { - id: number; - name: string; - graph: string; - host: string; - port: number; - create_time: string; - username: string; - enabled: boolean; - password: string; -} - -export interface GraphDataConfig { - [index: string]: string | undefined; - name: string; - graph: string; - host: string; - port: string; - username: string; - password: string; -} - -export interface GraphDataPageConfig { - pageNumber: number; - pageSize: number; - pageTotal: number; -} - -export interface GraphDataList { - records: GraphData[]; - total: number; -} - -export type GraphDataResponse = responseData; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/metadataConfigsStore.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/metadataConfigsStore.ts deleted file mode 100644 index 8ed2c3a8c..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/GraphManagementStore/metadataConfigsStore.ts +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { dict } from '../common'; -import { VertexTypeStore } from '../../GraphManagementStore/metadataConfigsStore/vertexTypeStore'; - -export interface PageConfig { - pageNumber: number; - pageTotal: number; - sort: 'asc' | 'desc' | ''; -} - -// metadata property - -export interface MetadataProperty { - name: string; - data_type: string; - cardinality: string; - create_time?: string; -} - -export interface NewMetadataProperty extends MetadataProperty { - _name?: string; -} - -export interface MetadataPropertyListResponse { - records: MetadataProperty[]; - total: number; -} - -// vertex types - -export type VertexTypeProperty = { - name: string; - nullable: boolean; -}; - -export type VertexTypePropertyIndex = { - name: string; - type: string; - fields: string[]; -}; - -export type VertexTypeStyle = { - icon: string | null; - color: string | null; - size: string; - display_fields: string[]; -}; - -export type VertexTypeValidateFields = - | 'name' - | 'properties' - | 'primaryKeys' - | 'displayFeilds' - | 'propertyIndexes'; - -export type VertexTypeValidatePropertyIndexes = { - name: string; - type: string; - properties: string; -}; - -export interface EditVertexTypeParams { - append_properties: VertexTypeProperty[]; - append_property_indexes: VertexTypePropertyIndex[]; - remove_property_indexes: string[]; - style: { - color: string | null; - icon: null; - size: string; - display_fields: string[]; - }; -} - -export interface VertexType { - [index: string]: string | any[] | VertexTypeStyle | boolean; - - name: string; - id_strategy: string; - properties: VertexTypeProperty[]; - primary_keys: string[]; - property_indexes: VertexTypePropertyIndex[]; - open_label_index: boolean; - style: VertexTypeStyle; -} - -export interface VertexTypeListResponse { - records: VertexType[]; - total: number; -} - -export interface CheckedReusableData { - type: string; - propertykey_conflicts: { entity: MetadataProperty; status: string }[]; - propertyindex_conflicts: { entity: MetadataPropertyIndex; status: string }[]; - vertexlabel_conflicts: { entity: VertexType; status: string }[]; - edgelabel_conflicts: { entity: EdgeType; status: string }[]; -} - -export interface ReCheckedReusableData { - propertykeys: MetadataProperty[]; - propertyindexes: MetadataPropertyIndex[]; - vertexlabels: VertexType[]; -} - -// edge types - -type EdgeTypeProperty = VertexTypeProperty; -type EdgeTypePropertyIndex = VertexTypePropertyIndex; - -type EdgeTypeStyle = { - color: string | null; - icon: string | null; - with_arrow: boolean; - thickness: string; - display_fields: string[]; -}; - -export type EdgeTypeValidateFields = - | 'name' - | 'sourceLabel' - | 'targetLabel' - | 'properties' - | 'sortKeys' - | 'propertyIndexes' - | 'displayFeilds'; - -export type EdgeTypeValidatePropertyIndexes = VertexTypeValidatePropertyIndexes; - -export interface EditEdgeTypeParams { - append_properties: VertexTypeProperty[]; - append_property_indexes: VertexTypePropertyIndex[]; - remove_property_indexes: string[]; - style: { - color: string | null; - icon: null; - with_arrow: boolean | null; - thickness: string; - display_fields: string[]; - }; -} - -export interface EdgeType { - name: string; - source_label: string; - target_label: string; - link_multi_times: boolean; - properties: EdgeTypeProperty[]; - sort_keys: string[]; - property_indexes: EdgeTypePropertyIndex[]; - open_label_index: boolean; - style: EdgeTypeStyle; -} - -export interface EdgeTypeListResponse { - records: EdgeType[]; - total: number; -} - -// metadata property index - -export interface MetadataPropertyIndex { - owner: string; - owner_type: string; - name: string; - type: string; - fields: string[]; -} - -export interface MetadataPropertyIndexResponse { - records: MetadataPropertyIndex[]; - total: number; -} - -// graph view data - -export type DrawerTypes = - | 'create-property' - | 'create-vertex' - | 'create-edge' - | 'check-property' - | 'check-vertex' - | 'check-edge' - | 'edit-vertex' - | 'edit-edge' - | ''; - -export interface GraphViewData { - vertices: { - id: string; - label: string; - properties: Record; - primary_keys: string[]; - style?: dict; - }[]; - edges: { - id: string; - label: string; - source: string; - target: string; - properties: Record; - sort_keys: string[]; - }[]; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/common.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/common.ts deleted file mode 100644 index ea4ec7eeb..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/types/common.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -export const baseUrl = '/api/v1.2/graph-connections'; - -export type dict = Record; - -export interface responseData { - status: number; - data: T; - message: string; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/utils/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/utils/index.ts deleted file mode 100644 index 36e820177..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/stores/utils/index.ts +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { isUndefined, size } from 'lodash-es'; -import isInt from 'validator/lib/isInt'; -import isFloat from 'validator/lib/isFloat'; -import isBoolean from 'validator/lib/isBoolean'; -import isISO8601 from 'validator/lib/isISO8601'; -import isUUID from 'validator/lib/isUUID'; -import isEmpty from 'validator/lib/isEmpty'; -import i18next from '../../i18n'; - -import type vis from 'vis-network'; -import type { - GraphNode, - GraphEdge -} from '../types/GraphManagementStore/dataAnalyzeStore'; -import type { - VertexTypeProperty, - MetadataProperty -} from '../types/GraphManagementStore/metadataConfigsStore'; - -/* variables */ - -export const vertexRadiusMapping: Record = { - HUGE: 40, - BIG: 30, - NORMAL: 20, - SMALL: 10, - TINY: 1 -}; - -export const edgeWidthMapping: Record = { - THICK: 45, - NORMAL: 20, - FINE: -10 -}; - -/* functions */ - -export function getErrorMessage(error: unknown) { - if (error instanceof Error) { - return error.message; - } - - if (typeof error === 'string') { - return error; - } - - if ( - typeof error === 'object' && - error !== null && - 'message' in error - ) { - const errorWithMessage = error as { message?: unknown }; - - if (typeof errorWithMessage.message === 'string') { - return errorWithMessage.message; - } - } - - return String(error); -} - -export function checkIfLocalNetworkOffline(error: unknown) { - if ( - typeof error === 'object' && - error !== null && - 'request' in error - ) { - const errorWithRequest = error as { request?: unknown }; - - if (!isUndefined(errorWithRequest.request)) { - throw new Error(i18next.t('addition.store.network-error')); - } - } - - throw error; -} - -export function mapMetadataProperties( - properties: VertexTypeProperty[], - propertyCollection: MetadataProperty[] -) { - const mappedProperties: Record = {}; - - properties.forEach(({ name }) => { - const value = propertyCollection.find( - ({ name: propertyName }) => propertyName === name - )!.data_type; - - mappedProperties[name] = value; - }); - - return mappedProperties; -} - -export function generateGraphModeId( - id: string, - source: string, - target: string -): string { - return `${source}-${id}->${target}`; -} - -export function convertArrayToString( - values: any[] | any, - separtor: string = ',' -) { - return Array.isArray(values) - ? values.filter((value) => value !== '').join(separtor) - : String(values); -} - -export function validateGraphProperty( - type: string, - value: string, - premitEmpty: boolean = false -) { - if (premitEmpty) { - if (value === '') { - return true; - } - } - - switch (type) { - case 'BOOLEAN': - return isBoolean(value); - case 'BYTE': - return isInt(value) && Number(value) > -128 && Number(value) <= 127; - case 'INT': - case 'LONG': - return isInt(value); - case 'FLOAT': - case 'DOUBLE': - return isFloat(value); - case 'TEXT': - case 'BLOB': - return !isEmpty(value); - case 'DATE': - return isISO8601(value); - case 'UUID': - return isUUID(value); - } -} - -export function addGraphNodes( - collection: GraphNode[], - visGraphNodes: vis.data.DataSet, - vertexSizeMapping: Record, - colorMappings: Record, - displayFieldMappings: Record -) { - collection.forEach(({ id, label, properties }) => { - const joinedLabel = !isUndefined(displayFieldMappings[label]) - ? displayFieldMappings[label] - .map((field) => (field === '~id' ? id : properties[field])) - .filter((label) => label !== undefined && label !== null) - .join('-') - : id; - - visGraphNodes.add({ - id, - label: - size(joinedLabel) <= 15 - ? joinedLabel - : joinedLabel.slice(0, 15) + '...', - vLabel: label, - value: vertexRadiusMapping[vertexSizeMapping[label]], - font: { size: 16 }, - properties, - title: ` -
-
${i18next.t('addition.common.vertex-type')}:
-
${label}
-
-
-
${i18next.t('addition.common.vertex-id')}:
-
${id}
-
- ${Object.entries(properties) - .map(([key, value]) => { - return `
-
${key}:
-
${convertArrayToString(value)}
-
`; - }) - .join('')} - `, - color: { - background: colorMappings[label] || '#5c73e6', - border: colorMappings[label] || '#5c73e6', - highlight: { background: '#fb6a02', border: '#fb6a02' }, - hover: { background: '#ec3112', border: '#ec3112' } - }, - // reveal label when zoom to max - scaling: { - label: { - max: Infinity, - maxVisible: Infinity - } - }, - chosen: { - node(values: any, id: string, selected: boolean, hovering: boolean) { - if (hovering || selected) { - values.shadow = true; - values.shadowColor = 'rgba(0, 0, 0, 0.6)'; - values.shadowX = 0; - values.shadowY = 0; - values.shadowSize = 25; - } - - if (selected) { - values.size += 5; - } - } - } - }); - }); -} - -export function addGraphEdges( - collection: GraphEdge[], - visGraphEdges: vis.data.DataSet, - colorMappings: Record, - edgeThicknessMappings: Record, - edgeWithArrowMappings: Record, - displayFieldMappings: Record -) { - collection.forEach(({ id, label, source, target, properties }) => { - const joinedLabel = displayFieldMappings[label] - .map((field) => (field === '~id' ? label : properties[field])) - .join('-'); - - visGraphEdges.add({ - id, - label: - joinedLabel.length <= 15 - ? joinedLabel - : joinedLabel.slice(0, 15) + '...', - properties, - source, - target, - from: source, - to: target, - font: { size: 16, strokeWidth: 0, color: '#666' }, - arrows: edgeWithArrowMappings[label] ? 'to' : '', - color: colorMappings[label], - value: edgeWidthMapping[edgeThicknessMappings[label]], - title: ` -
-
${i18next.t('addition.common.edge-type')}:
-
${label}
-
-
-
${i18next.t('addition.common.edge-id')}:
-
${id}
-
- ${Object.entries(properties) - .map(([key, value]) => { - return `
-
${key}:
-
${convertArrayToString(value)}
-
`; - }) - .join('')} - ` - }); - }); -} - -export function formatVertexIdText( - text: string, - replacedText: string, - revert: boolean = false -) { - if (!revert) { - return text === '~id' ? replacedText : text; - } else { - return text === replacedText ? '~id' : text; - } -} - -export function isGtNegativeOneButZero(value: string | number) { - if (typeof value === 'number') { - value = String(value); - } - - return !( - !isEmpty(value) && - (!isInt(value as string, { min: -1 }) || String(Number(value)) === '0') - ); -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/third-party.d.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/third-party.d.ts deleted file mode 100644 index 9e63323ba..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/third-party.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -declare module 'hubble-ui'; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/calcAlgorithmFormWidth.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/calcAlgorithmFormWidth.ts deleted file mode 100644 index 76e1a896c..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/calcAlgorithmFormWidth.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -export function calcAlgorithmFormWidth( - expand: boolean, - min: number, - max: number -) { - return expand ? min : max; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/convertStringToJSON.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/convertStringToJSON.ts deleted file mode 100644 index 975563027..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/convertStringToJSON.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -export default function convertStringToJSON(text: any): object | null { - if (typeof text !== 'string') { - return null; - } - - let context; - - try { - context = JSON.parse(text); - } catch (e) { - return null; - } - - return typeof context === 'object' && context !== null ? context : null; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/filterEmptyAlgorightmParams.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/filterEmptyAlgorightmParams.ts deleted file mode 100644 index 6918ddc0a..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/filterEmptyAlgorightmParams.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { omitBy, cloneDeep, isEmpty } from 'lodash-es'; - -export function removeLabelKey>( - params: T, - isCloned = true, - key = 'label' -) { - const paramObject = isCloned ? params : cloneDeep(params); - - if (paramObject[key] === '__all__') { - delete paramObject[key]; - } - - return paramObject; -} - -export function filterEmptyAlgorightmParams(params: object, keys: string[]) { - return omitBy(params, (value, key) => keys.includes(key) && isEmpty(value)); -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/formatAlgorithmStatement.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/formatAlgorithmStatement.ts deleted file mode 100644 index 56b46cc93..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/formatAlgorithmStatement.ts +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import { - isUndefined, - cloneDeep, - trimEnd, - isEmpty, - isObject, - fromPairs -} from 'lodash-es'; - -import type { TFunction, i18n } from 'i18next'; -import type { - NeighborRankParams, - CustomPathParams -} from '../stores/types/GraphManagementStore/dataAnalyzeStore'; - -export const AlgorithmInternalNameMapping: Record = { - rings: 'loop-detection', - crosspoints: 'focus-detection', - shortpath: 'shortest-path', - allshortpath: 'shortest-path-all', - paths: 'all-path', - fsimilarity: 'model-similarity', - neighborrank: 'neighbor-rank', - kneighbor: 'k-step-neighbor', - kout: 'k-hop', - customizedpaths: 'custom-path', - rays: 'radiographic-inspection', - sameneighbors: 'same-neighbor', - weightedshortpath: 'weighted-shortest-path', - singleshortpath: 'single-source-weighted-shortest-path', - jaccardsimilarity: 'jaccard', - personalrank: 'personal-rank' -}; - -export function formatAlgorithmStatement( - content: string, - algorithmType: string | undefined, - translator: TFunction, - i18n: i18n -) { - if (isUndefined(algorithmType)) { - return ['']; - } - - const algorithmName = translator( - `data-analyze.algorithm-forms.api-name-mapping.${algorithmType}` - ); - let algorithmParams = JSON.parse(content); - const statements: string[] = [algorithmName]; - - if (algorithmType === 'fsimilarity') { - let convertedParams: Record; - - if (!isUndefined(algorithmParams.sources)) { - convertedParams = { - source: algorithmParams.sources.ids ?? [], - 'vertex-type': algorithmParams.sources.label ?? '', - 'vertex-property': algorithmParams.sources.properties ?? [], - direction: algorithmParams.direction, - least_neighbor: algorithmParams.min_neighbors, - similarity: algorithmParams.alpha, - label: - algorithmParams.label === null || algorithmParams.label === '__all__' - ? translator( - `data-analyze.algorithm-forms.model-similarity.pre-value` - ) - : algorithmParams.label, - max_similar: algorithmParams.top, - least_similar: algorithmParams.min_similars, - property_filter: algorithmParams.group_property, - least_property_number: algorithmParams.min_groups, - max_degree: algorithmParams.max_degree, - capacity: algorithmParams.capacity, - limit: algorithmParams.limit, - return_common_connection: algorithmParams.with_intermediary, - return_complete_info: algorithmParams.with_vertex - }; - } else { - // no need to convert relative fields in temp log (which sources field is undefined) - convertedParams = { ...algorithmParams }; - convertedParams['vertex-type'] = convertedParams.vertexType; - convertedParams['vertex-property'] = convertedParams.vertexProperty; - convertedParams.label = - algorithmParams.label === null || algorithmParams.label === '__all__' - ? translator( - `data-analyze.algorithm-forms.model-similarity.pre-value` - ) - : algorithmParams.label; - - delete convertedParams.vertexType; - delete convertedParams.vertexProperty; - } - - algorithmParams = convertedParams; - } - - if (algorithmType === 'neighborrank') { - const convertedParams = cloneDeep(algorithmParams); - - convertedParams.steps = []; - - (algorithmParams as NeighborRankParams).steps.forEach( - ({ degree, direction, labels, top }, stepIndex) => { - const step: Record = {}; - - step[ - trimEnd( - translator( - 'data-analyze.algorithm-forms.neighbor-rank.options.degree' - ), - ':' - ) - ] = degree; - step[ - trimEnd( - translator( - 'data-analyze.algorithm-forms.neighbor-rank.options.direction' - ), - ':' - ) - ] = direction; - step[ - trimEnd( - translator( - 'data-analyze.algorithm-forms.neighbor-rank.options.label' - ), - ':' - ) - ] = isEmpty(labels) - ? translator('data-analyze.algorithm-forms.neighbor-rank.pre-value') - : labels.map((label) => - // value may be "__all__" from temp log (local) - label === '__all__' - ? translator( - 'data-analyze.algorithm-forms.neighbor-rank.pre-value' - ) - : label - ); - step[ - trimEnd( - translator( - 'data-analyze.algorithm-forms.neighbor-rank.options.top' - ), - ':' - ) - ] = top; - - convertedParams.steps[stepIndex] = step; - } - ); - - algorithmParams = convertedParams; - } - - // params struct fetched from server is not as consistent as front end - if (algorithmType === 'kout' && algorithmParams.hasOwnProperty('step')) { - algorithmParams.direction = algorithmParams.step.direction; - algorithmParams.max_degree = algorithmParams.step.degree; - algorithmParams.skip_degree = algorithmParams.step.skip_degree; - algorithmParams.label = algorithmParams.step.labels[0] ?? null; - - delete algorithmParams.step; - } - - if (algorithmType === 'customizedpaths') { - let convertedParams: Record; - - if (!isUndefined(algorithmParams.sources)) { - convertedParams = { - source: algorithmParams.sources.ids ?? [], - 'vertex-type': algorithmParams.sources.label ?? '', - 'vertex-property': algorithmParams.sources.properties ?? [], - capacity: algorithmParams.capacity, - limit: algorithmParams.limit, - sort_by: algorithmParams.sort_by, - steps: [] - }; - } else { - convertedParams = { - ...algorithmParams, - source: algorithmParams.source.split(','), - 'vertex-type': algorithmParams.vertexType, - 'vertex-property': fromPairs( - algorithmParams.vertexProperty.map( - ([key, value]: [string, string]) => [key, value.split(',')] - ) - ) - }; - - delete convertedParams.vertexType; - delete convertedParams.vertexProperty; - } - - (algorithmParams as CustomPathParams).steps.forEach((step, stepIndex) => { - const convertedStep: Record = {}; - - delete step.uuid; - - if (step.default_weight !== '') { - step.weight_by = step.default_weight; - } - - delete step.default_weight; - - Object.entries(step).forEach(([key, value]) => { - convertedStep[ - trimEnd( - translator( - `data-analyze.algorithm-forms.custom-path.options.${key}` - ), - ':' - ) - ] = value; - }); - - convertedParams.steps[stepIndex] = convertedStep; - }); - - algorithmParams = convertedParams; - } - - Object.entries(algorithmParams).forEach(([key, value]) => { - value = isObject(value) ? JSON.stringify(value, null, 4) : value; - - // label value could be null when it means all - if (key === 'label' && (value === null || value === '__all__')) { - value = translator( - `data-analyze.algorithm-forms.${AlgorithmInternalNameMapping[algorithmType]}.pre-value` - ); - } - - // personal rank customized - if (algorithmType === 'personalrank' && key === 'with_label') { - value = translator( - `data-analyze.algorithm-forms.personal-rank.with-label-radio-value.${(value as string).toLowerCase()}` - ); - } - - const fullPathKey = `data-analyze.algorithm-forms.${AlgorithmInternalNameMapping[algorithmType]}.options.${key}`; - - // remove redundant key from server - if (!i18n.exists(fullPathKey)) { - return; - } - - key = translator( - `data-analyze.algorithm-forms.${AlgorithmInternalNameMapping[algorithmType]}.options.${key}` - ); - - statements.push(`${key} ${value}`); - }); - - return statements; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/getUnicodeLength.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/getUnicodeLength.ts deleted file mode 100644 index 35b920f1b..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/getUnicodeLength.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -export default function getUnicodeLength(str?: string) { - if (typeof str === 'undefined') { - return 0; - } - - return str.replace(/[^\x00-\xff]/g, '01').length; -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/index.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/index.ts deleted file mode 100644 index 0caa170cd..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/index.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import convertStringToJSON from './convertStringToJSON'; -import getUnicodeLength from './getUnicodeLength'; -import { - AlgorithmInternalNameMapping, - formatAlgorithmStatement -} from './formatAlgorithmStatement'; -import isDataTypeNumeric from './isDataTypeNumeric'; -import { calcAlgorithmFormWidth } from './calcAlgorithmFormWidth'; -import { - removeLabelKey, - filterEmptyAlgorightmParams -} from './filterEmptyAlgorightmParams'; - -export { - convertStringToJSON, - getUnicodeLength, - AlgorithmInternalNameMapping, - formatAlgorithmStatement, - isDataTypeNumeric, - calcAlgorithmFormWidth, - removeLabelKey, - filterEmptyAlgorightmParams -}; diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/isDataTypeNumeric.ts b/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/isDataTypeNumeric.ts deleted file mode 100644 index 8b9d0e408..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/src/utils/isDataTypeNumeric.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -export default function isDataTypeNumeric(type: string | undefined) { - return ( - type === 'BYTE' || - type === 'INT' || - type === 'LONG' || - type === 'FLOAT' || - type === 'DOUBLE' || - type === 'DATE' - ); -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/tsconfig-extend.json b/hugegraph-hubble/hubble-fe-old(legacy)/tsconfig-extend.json deleted file mode 100644 index 5d35b2a3d..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/tsconfig-extend.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "hubble-ui": ["src/components/hubble-ui"] - } - } -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/tsconfig.json b/hugegraph-hubble/hubble-fe-old(legacy)/tsconfig.json deleted file mode 100644 index 0acd731ef..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "esModuleInterop": true, - "downlevelIteration": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "preserve", - "experimentalDecorators": true - }, - "include": [ - "src" - ], - "extends": "./tsconfig-extend.json" -} diff --git a/hugegraph-hubble/hubble-fe-old(legacy)/yarn.lock b/hugegraph-hubble/hubble-fe-old(legacy)/yarn.lock deleted file mode 100644 index 712d00e2e..000000000 --- a/hugegraph-hubble/hubble-fe-old(legacy)/yarn.lock +++ /dev/null @@ -1,13380 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ant-design/colors@^6.0.0": - version "6.0.0" - resolved "https://registry.npmmirror.com/@ant-design/colors/download/@ant-design/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298" - integrity sha1-m5NmJXz/zEfbQrnQIDu1ksE8Apg= - dependencies: - "@ctrl/tinycolor" "^3.4.0" - -"@ant-design/icons-svg@^4.2.1": - version "4.2.1" - resolved "https://registry.npmmirror.com/@ant-design/icons-svg/download/@ant-design/icons-svg-4.2.1.tgz?cache=0&sync_timestamp=1632478308697&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40ant-design%2Ficons-svg%2Fdownload%2F%40ant-design%2Ficons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a" - integrity sha1-hjDajrRHGkqr2u19H/apfcss8Fo= - -"@ant-design/icons@^4.7.0": - version "4.7.0" - resolved "https://registry.npmmirror.com/@ant-design/icons/download/@ant-design/icons-4.7.0.tgz?cache=0&sync_timestamp=1632478665145&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40ant-design%2Ficons%2Fdownload%2F%40ant-design%2Ficons-4.7.0.tgz#8c3cbe0a556ba92af5dc7d1e70c0b25b5179af0f" - integrity sha1-jDy+ClVrqSr13H0ecMCyW1F5rw8= - dependencies: - "@ant-design/colors" "^6.0.0" - "@ant-design/icons-svg" "^4.2.1" - "@babel/runtime" "^7.11.2" - classnames "^2.2.6" - rc-util "^5.9.4" - -"@ant-design/react-slick@~0.28.1": - version "0.28.4" - resolved "https://registry.npmmirror.com/@ant-design/react-slick/download/@ant-design/react-slick-0.28.4.tgz#8b296b87ad7c7ae877f2a527b81b7eebd9dd29a9" - integrity sha1-iylrh618euh38qUnuBt+69ndKak= - dependencies: - "@babel/runtime" "^7.10.4" - classnames "^2.2.5" - json2mq "^0.2.0" - lodash "^4.17.21" - resize-observer-polyfill "^1.5.0" - -"@babel/code-frame@7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha1-M+JZA9dIEYFTThLsCiXxa2/PQZ4= - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.9.0": - version "7.16.8" - resolved "https://registry.npmmirror.com/@babel/compat-data/download/@babel/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" - integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== - -"@babel/core@7.9.0": - version "7.9.0" - resolved "https://registry.npmmirror.com/@babel/core/download/@babel/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5": - version "7.16.12" - resolved "https://registry.npmmirror.com/@babel/core/download/@babel/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" - integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.16.7" - "@babel/parser" "^7.16.12" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.10" - "@babel/types" "^7.16.8" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.16.8", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0": - version "7.16.8" - resolved "https://registry.npmmirror.com/@babel/generator/download/@babel/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" - integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== - dependencies: - "@babel/types" "^7.16.8" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.8.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.8.3": - version "7.16.10" - resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" - integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - -"@babel/helper-create-regexp-features-plugin@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" - integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^4.7.1" - -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/download/@babel/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/download/@babel/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-function-name/download/@babel/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== - dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-member-expression-to-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" - integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-module-imports/download/@babel/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" - integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helper-replace-supers@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" - integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-simple-access/download/@babel/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" - integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.16.0.tgz?cache=0&sync_timestamp=1635567064131&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-skip-transparent-expression-wrappers%2Fdownload%2F%40babel%2Fhelper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha1-DuM4gHAUfDrgUeSH7KPrsOLouwk= - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helper-validator-option/download/@babel/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== - dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helpers@^7.16.7", "@babel/helpers@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/helpers/download/@babel/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" - integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/highlight@^7.16.7", "@babel/highlight@^7.8.3": - version "7.16.10" - resolved "https://registry.npmmirror.com/@babel/highlight/download/@babel/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": - version "7.16.12" - resolved "https://registry.npmmirror.com/@babel/parser/download/@babel/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" - integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/download/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" - integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/download/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" - integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - -"@babel/plugin-proposal-async-generator-functions@^7.16.8", "@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.16.8" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" - integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" - integrity sha1-XgZlSvXNBLYIkVqtqbKmeIAERk4= - dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-proposal-class-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" - integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/download/@babel/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" - integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-decorators@7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/download/@babel/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" - integrity sha1-IVaGCrZcWr8GjD9nBCGEBBBmVD4= - dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-decorators" "^7.8.3" - -"@babel/plugin-proposal-dynamic-import@^7.16.7", "@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" - integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.16.7", "@babel/plugin-proposal-json-strings@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" - integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" - integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" - integrity sha1-5FciU/3u1lzd7s/as/kor+sv1dI= - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" - integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" - integrity sha1-XWdpQJaZ7Js7aGhM2BFs7f+Tutg= - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.16.7", "@babel/plugin-proposal-numeric-separator@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.16.7", "@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" - integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.16.7", "@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@7.9.0": - version "7.9.0" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" - integrity sha1-MdsWsVTDnWuKZFKSRyuYOUwpKlg= - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - -"@babel/plugin-proposal-optional-chaining@^7.16.7", "@babel/plugin-proposal-optional-chaining@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" - integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.16.11": - version "7.16.11" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" - integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.10" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-private-property-in-object@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/download/@babel/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" - integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" - integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha1-qYP7Gusuw/btBCohD2QOkOeG/g0= - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA= - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/download/@babel/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha1-GV34mxRrS3izv4l/16JXyEZZ1AY= - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-decorators@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/download/@babel/plugin-syntax-decorators-7.16.7.tgz#f66a0199f16de7c1ef5192160ccf5d069739e3d3" - integrity sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM= - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha1-AolkqbqA28CUyRXEh618TnpmRlo= - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-flow/download/@babel/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" - integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo= - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" - integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha1-ypHvRjA1MESLkGZSusLp/plB9pk= - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak= - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c= - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE= - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha1-YRGiZbz7Ag6579D9/X0mQCue1sE= - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io= - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/download/@babel/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0= - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw= - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/download/@babel/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" - integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-arrow-functions@^7.16.7", "@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" - integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-async-to-generator@^7.16.8", "@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.16.8" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" - integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - -"@babel/plugin-transform-block-scoped-functions@^7.16.7", "@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-block-scoping@^7.16.7", "@babel/plugin-transform-block-scoping@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" - integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-classes@^7.16.7", "@babel/plugin-transform-classes@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" - integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.16.7", "@babel/plugin-transform-computed-properties@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" - integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-destructuring@^7.16.7", "@babel/plugin-transform-destructuring@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" - integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-duplicate-keys@^7.16.7", "@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" - integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-exponentiation-operator@^7.16.7", "@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-flow-strip-types@7.9.0": - version "7.9.0" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-flow-strip-types/download/@babel/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" - integrity sha1-ijU4qkBDTgALj0Sjxcmscim9I5I= - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-flow" "^7.8.3" - -"@babel/plugin-transform-for-of@^7.16.7", "@babel/plugin-transform-for-of@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" - integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-function-name@^7.16.7", "@babel/plugin-transform-function-name@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== - dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-literals@^7.16.7", "@babel/plugin-transform-literals@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" - integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-member-expression-literals@^7.16.7", "@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-modules-amd@^7.16.7", "@babel/plugin-transform-modules-amd@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" - integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.16.8", "@babel/plugin-transform-modules-commonjs@^7.9.0": - version "7.16.8" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" - integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.16.7", "@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" - integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== - dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.16.7", "@babel/plugin-transform-modules-umd@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" - integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8", "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.16.8" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" - integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - -"@babel/plugin-transform-new-target@^7.16.7", "@babel/plugin-transform-new-target@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" - integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-object-super@^7.16.7", "@babel/plugin-transform-object-super@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - -"@babel/plugin-transform-parameters@^7.16.7", "@babel/plugin-transform-parameters@^7.8.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" - integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-property-literals@^7.16.7", "@babel/plugin-transform-property-literals@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-constant-elements@^7.0.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-constant-elements/download/@babel/plugin-transform-react-constant-elements-7.16.7.tgz#19e9e4c2df2f6c3e6b3aea11778297d81db8df62" - integrity sha512-lF+cfsyTgwWkcw715J88JhMYJ5GpysYNLhLP1PkvkhTRN7B3e74R/1KsDxFxhRpSn0UUD3IWM4GvdBR2PEbbQQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-display-name@7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/download/@babel/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" - integrity sha1-cN7Zh8kWCfeDU9120vsqC7mR6OU= - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-react-display-name@^7.16.7", "@babel/plugin-transform-react-display-name@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/download/@babel/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" - integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx-development@^7.16.7", "@babel/plugin-transform-react-jsx-development@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/download/@babel/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" - -"@babel/plugin-transform-react-jsx-self@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/download/@babel/plugin-transform-react-jsx-self-7.16.7.tgz#f432ad0cba14c4a1faf44f0076c69e42a4d4479e" - integrity sha512-oe5VuWs7J9ilH3BCCApGoYjHoSO48vkjX2CbA5bFVhIuO2HKxA3vyF7rleA4o6/4rTDbk6r8hBW7Ul8E+UZrpA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx-source@^7.9.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/download/@babel/plugin-transform-react-jsx-source-7.16.7.tgz#1879c3f23629d287cc6186a6c683154509ec70c0" - integrity sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.9.1": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/download/@babel/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" - integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/plugin-transform-react-pure-annotations@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-pure-annotations/download/@babel/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" - integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-regenerator@^7.16.7", "@babel/plugin-transform-regenerator@^7.8.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" - integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.16.7", "@babel/plugin-transform-reserved-words@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" - integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-runtime@7.9.0": - version "7.9.0" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" - integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - resolve "^1.8.1" - semver "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@^7.16.7", "@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-spread@^7.16.7", "@babel/plugin-transform-spread@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" - integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - -"@babel/plugin-transform-sticky-regex@^7.16.7", "@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-template-literals@^7.16.7", "@babel/plugin-transform-template-literals@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" - integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-typeof-symbol@^7.16.7", "@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" - integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-typescript@^7.9.0": - version "7.16.8" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/download/@babel/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" - integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-typescript" "^7.16.7" - -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-unicode-regex@^7.16.7", "@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/preset-env@7.9.0": - version "7.9.0" - resolved "https://registry.npmmirror.com/@babel/preset-env/download/@babel/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" - integrity sha1-pfxCSA6VCuj12fjyu8A/UnIt86g= - dependencies: - "@babel/compat-data" "^7.9.0" - "@babel/helper-compilation-targets" "^7.8.7" - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-async-generator-functions" "^7.8.3" - "@babel/plugin-proposal-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-json-strings" "^7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-numeric-separator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.9.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.9.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.8.0" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.8.3" - "@babel/plugin-transform-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.9.0" - "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" - "@babel/plugin-transform-dotall-regex" "^7.8.3" - "@babel/plugin-transform-duplicate-keys" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.9.0" - "@babel/plugin-transform-function-name" "^7.8.3" - "@babel/plugin-transform-literals" "^7.8.3" - "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.0" - "@babel/plugin-transform-modules-commonjs" "^7.9.0" - "@babel/plugin-transform-modules-systemjs" "^7.9.0" - "@babel/plugin-transform-modules-umd" "^7.9.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.8.3" - "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.7" - "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.7" - "@babel/plugin-transform-reserved-words" "^7.8.3" - "@babel/plugin-transform-shorthand-properties" "^7.8.3" - "@babel/plugin-transform-spread" "^7.8.3" - "@babel/plugin-transform-sticky-regex" "^7.8.3" - "@babel/plugin-transform-template-literals" "^7.8.3" - "@babel/plugin-transform-typeof-symbol" "^7.8.4" - "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.9.0" - browserslist "^4.9.1" - core-js-compat "^3.6.2" - invariant "^2.2.2" - levenary "^1.1.1" - semver "^5.5.0" - -"@babel/preset-env@^7.4.5": - version "7.16.11" - resolved "https://registry.npmmirror.com/@babel/preset-env/download/@babel/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== - dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.8" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.11" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.npmmirror.com/@babel/preset-modules/download/@babel/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha1-75Odbn8miCfhhBY43G/5VRXhFdk= - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@7.9.1": - version "7.9.1" - resolved "https://registry.npmmirror.com/@babel/preset-react/download/@babel/preset-react-7.9.1.tgz#b346403c36d58c3bb544148272a0cefd9c28677a" - integrity sha1-s0ZAPDbVjDu1RBSCcqDO/ZwoZ3o= - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-react-display-name" "^7.8.3" - "@babel/plugin-transform-react-jsx" "^7.9.1" - "@babel/plugin-transform-react-jsx-development" "^7.9.0" - "@babel/plugin-transform-react-jsx-self" "^7.9.0" - "@babel/plugin-transform-react-jsx-source" "^7.9.0" - -"@babel/preset-react@^7.0.0": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/preset-react/download/@babel/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" - integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-react-display-name" "^7.16.7" - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations" "^7.16.7" - -"@babel/preset-typescript@7.9.0": - version "7.9.0" - resolved "https://registry.npmmirror.com/@babel/preset-typescript/download/@babel/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" - integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-typescript" "^7.9.0" - -"@babel/runtime-corejs3@^7.12.1": - version "7.16.8" - resolved "https://registry.npmmirror.com/@babel/runtime-corejs3/download/@babel/runtime-corejs3-7.16.8.tgz#ea533d96eda6fdc76b1812248e9fbd0c11d4a1a7" - integrity sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg== - dependencies: - core-js-pure "^3.20.2" - regenerator-runtime "^0.13.4" - -"@babel/runtime@7.9.0": - version "7.9.0" - resolved "https://registry.npmmirror.com/@babel/runtime/download/@babel/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b" - integrity sha1-M37aZ0AfWwZqbyBaMRPUrBi6SVs= - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/runtime/download/@babel/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" - integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.16.7", "@babel/template@^7.4.0", "@babel/template@^7.8.6": - version "7.16.7" - resolved "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": - version "7.16.10" - resolved "https://registry.npmmirror.com/@babel/traverse/download/@babel/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" - integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.16.10" - "@babel/types" "^7.16.8" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.9.0": - version "7.16.8" - resolved "https://registry.npmmirror.com/@babel/types/download/@babel/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" - integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.npmmirror.com/@cnakazawa/watch/download/@cnakazawa/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha1-+GSuhQBND8q29QvpFBxNo2jRZWo= - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.npmmirror.com/@csstools/convert-colors/download/@csstools/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" - integrity sha1-rUldxBsS511YjG24uYNPCPoTHrc= - -"@csstools/normalize.css@^10.1.0": - version "10.1.0" - resolved "https://registry.npmmirror.com/@csstools/normalize.css/download/@csstools/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" - integrity sha1-8JULuhiBlRLUL3GX5WxRiqSRzxg= - -"@ctrl/tinycolor@^3.4.0": - version "3.4.0" - resolved "https://registry.npmmirror.com/@ctrl/tinycolor/download/@ctrl/tinycolor-3.4.0.tgz#c3c5ae543c897caa9c2a68630bed355be5f9990f" - integrity sha1-w8WuVDyJfKqcKmhjC+01W+X5mQ8= - -"@emotion/is-prop-valid@^0.8.2": - version "0.8.8" - resolved "https://registry.npmmirror.com/@emotion/is-prop-valid/download/@emotion/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha1-2yixxDaKJZtgqXMR1qlS1P0BrBo= - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.npmmirror.com/@emotion/memoize/download/@emotion/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha1-Gb8PWvGRSREcQNmLsM+CEZ9dnus= - -"@hapi/address@2.x.x": - version "2.1.4" - resolved "https://registry.npmmirror.com/@hapi/address/download/@hapi/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha1-XWftQ/P9QaadS5/3tW58DR0KgeU= - -"@hapi/bourne@1.x.x": - version "1.3.2" - resolved "https://registry.npmmirror.com/@hapi/bourne/download/@hapi/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" - integrity sha1-CnCVreoGckPOMoPhtWuKj0U7JCo= - -"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": - version "8.5.1" - resolved "https://registry.npmmirror.com/@hapi/hoek/download/@hapi/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" - integrity sha1-/elgZMpEbeyMVajC8TCVewcMbgY= - -"@hapi/joi@^15.0.0": - version "15.1.1" - resolved "https://registry.npmmirror.com/@hapi/joi/download/@hapi/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" - integrity sha1-xnW4pxKW8Cgz+NbSQ7NMV7jOGdc= - dependencies: - "@hapi/address" "2.x.x" - "@hapi/bourne" "1.x.x" - "@hapi/hoek" "8.x.x" - "@hapi/topo" "3.x.x" - -"@hapi/topo@3.x.x": - version "3.1.6" - resolved "https://registry.npmmirror.com/@hapi/topo/download/@hapi/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha1-aNk1+j6uf91asNf5U/MgXYsr/Ck= - dependencies: - "@hapi/hoek" "^8.3.0" - -"@hypnosphi/create-react-context@^0.3.1": - version "0.3.1" - resolved "https://registry.npmmirror.com/@hypnosphi/create-react-context/download/@hypnosphi/create-react-context-0.3.1.tgz#f8bfebdc7665f5d426cba3753e0e9c7d3154d7c6" - integrity sha1-+L/r3HZl9dQmy6N1Pg6cfTFU18Y= - dependencies: - gud "^1.0.0" - warning "^4.0.3" - -"@jest/console@^24.7.1", "@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.npmmirror.com/@jest/console/download/@jest/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha1-ebG8Bvt0qM+wHL3t+UVYSxuXB/A= - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/core@^24.9.0": - version "24.9.0" - resolved "https://registry.npmmirror.com/@jest/core/download/@jest/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" - integrity sha1-LOzNC5MYH5xIUOdPKprUPTUTacQ= - dependencies: - "@jest/console" "^24.7.1" - "@jest/reporters" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-changed-files "^24.9.0" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-resolve-dependencies "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - jest-watcher "^24.9.0" - micromatch "^3.1.10" - p-each-series "^1.0.0" - realpath-native "^1.1.0" - rimraf "^2.5.4" - slash "^2.0.0" - strip-ansi "^5.0.0" - -"@jest/environment@^24.3.0", "@jest/environment@^24.9.0": - version "24.9.0" - resolved "https://registry.npmmirror.com/@jest/environment/download/@jest/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" - integrity sha1-IeOvotZcBYbL1svv4gi6+t5Eqxg= - dependencies: - "@jest/fake-timers" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - -"@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0": - version "24.9.0" - resolved "https://registry.npmmirror.com/@jest/fake-timers/download/@jest/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" - integrity sha1-uj5r8O7NCaY2BJiWQ00wZjZUDJM= - dependencies: - "@jest/types" "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - -"@jest/reporters@^24.9.0": - version "24.9.0" - resolved "https://registry.npmmirror.com/@jest/reporters/download/@jest/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" - integrity sha1-hmYO/44rlmHQQqjpigKLjWMaW0M= - dependencies: - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - istanbul-lib-coverage "^2.0.2" - istanbul-lib-instrument "^3.0.1" - istanbul-lib-report "^2.0.4" - istanbul-lib-source-maps "^3.0.1" - istanbul-reports "^2.2.6" - jest-haste-map "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - node-notifier "^5.4.2" - slash "^2.0.0" - source-map "^0.6.0" - string-length "^2.0.0" - -"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.npmmirror.com/@jest/source-map/download/@jest/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha1-DiY6lEML5LQdpoPMwea//ioZFxQ= - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.npmmirror.com/@jest/test-result/download/@jest/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha1-EXluiqnb+I6gJXV7MVJZWtBroMo= - dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/test-sequencer@^24.9.0": - version "24.9.0" - resolved "https://registry.npmmirror.com/@jest/test-sequencer/download/@jest/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" - integrity sha1-+PM081tiWk8vNV8v5+YDba0uazE= - dependencies: - "@jest/test-result" "^24.9.0" - jest-haste-map "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - -"@jest/transform@^24.9.0": - version "24.9.0" - resolved "https://registry.npmmirror.com/@jest/transform/download/@jest/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" - integrity sha1-SuJ2iyllU/rasJ6ewRlUPJCxbFY= - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^24.9.0" - babel-plugin-istanbul "^5.1.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.15" - jest-haste-map "^24.9.0" - jest-regex-util "^24.9.0" - jest-util "^24.9.0" - micromatch "^3.1.10" - pirates "^4.0.1" - realpath-native "^1.1.0" - slash "^2.0.0" - source-map "^0.6.1" - write-file-atomic "2.4.1" - -"@jest/types@^24.3.0", "@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.npmmirror.com/@jest/types/download/@jest/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha1-Y8smy3UA0Gnlo4lEGnxqtekJ/Fk= - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.npmmirror.com/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4= - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U= - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmmirror.com/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos= - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.npmmirror.com/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs= - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npmmirror.com/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po= - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@react-dnd/asap@^4.0.0": - version "4.0.0" - resolved "https://registry.npmmirror.com/@react-dnd/asap/download/@react-dnd/asap-4.0.0.tgz#b300eeed83e9801f51bd66b0337c9a6f04548651" - integrity sha1-swDu7YPpgB9RvWawM3yabwRUhlE= - -"@react-dnd/invariant@^2.0.0": - version "2.0.0" - resolved "https://registry.npmmirror.com/@react-dnd/invariant/download/@react-dnd/invariant-2.0.0.tgz#09d2e81cd39e0e767d7da62df9325860f24e517e" - integrity sha1-CdLoHNOeDnZ9faYt+TJYYPJOUX4= - -"@react-dnd/shallowequal@^2.0.0": - version "2.0.0" - resolved "https://registry.npmmirror.com/@react-dnd/shallowequal/download/@react-dnd/shallowequal-2.0.0.tgz#a3031eb54129f2c66b2753f8404266ec7bf67f0a" - integrity sha1-owMetUEp8sZrJ1P4QEJm7Hv2fwo= - -"@stylelint/postcss-css-in-js@^0.37.2": - version "0.37.2" - resolved "https://registry.npmmirror.com/@stylelint/postcss-css-in-js/download/@stylelint/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2" - integrity sha1-flqErRgfQjSiSAgDQipHuHSa89I= - dependencies: - "@babel/core" ">=7.9.0" - -"@stylelint/postcss-markdown@^0.36.2": - version "0.36.2" - resolved "https://registry.npmmirror.com/@stylelint/postcss-markdown/download/@stylelint/postcss-markdown-0.36.2.tgz#0a540c4692f8dcdfc13c8e352c17e7bfee2bb391" - integrity sha1-ClQMRpL43N/BPI41LBfnv+4rs5E= - dependencies: - remark "^13.0.0" - unist-util-find-all-after "^3.0.2" - -"@svgr/babel-plugin-add-jsx-attribute@^4.2.0": - version "4.2.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-add-jsx-attribute/download/@svgr/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" - integrity sha1-2ty2IYUDUy1ohLIQ5/PFAsqqRLE= - -"@svgr/babel-plugin-remove-jsx-attribute@^4.2.0": - version "4.2.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-attribute/download/@svgr/babel-plugin-remove-jsx-attribute-4.2.0.tgz#297550b9a8c0c7337bea12bdfc8a80bb66f85abc" - integrity sha1-KXVQuajAxzN76hK9/IqAu2b4Wrw= - -"@svgr/babel-plugin-remove-jsx-empty-expression@^4.2.0": - version "4.2.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-empty-expression/download/@svgr/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz#c196302f3e68eab6a05e98af9ca8570bc13131c7" - integrity sha1-wZYwLz5o6ragXpivnKhXC8ExMcc= - -"@svgr/babel-plugin-replace-jsx-attribute-value@^4.2.0": - version "4.2.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-replace-jsx-attribute-value/download/@svgr/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz#310ec0775de808a6a2e4fd4268c245fd734c1165" - integrity sha1-MQ7Ad13oCKai5P1CaMJF/XNMEWU= - -"@svgr/babel-plugin-svg-dynamic-title@^4.3.3": - version "4.3.3" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-dynamic-title/download/@svgr/babel-plugin-svg-dynamic-title-4.3.3.tgz#2cdedd747e5b1b29ed4c241e46256aac8110dd93" - integrity sha1-LN7ddH5bGyntTCQeRiVqrIEQ3ZM= - -"@svgr/babel-plugin-svg-em-dimensions@^4.2.0": - version "4.2.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-em-dimensions/download/@svgr/babel-plugin-svg-em-dimensions-4.2.0.tgz#9a94791c9a288108d20a9d2cc64cac820f141391" - integrity sha1-mpR5HJoogQjSCp0sxkysgg8UE5E= - -"@svgr/babel-plugin-transform-react-native-svg@^4.2.0": - version "4.2.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-react-native-svg/download/@svgr/babel-plugin-transform-react-native-svg-4.2.0.tgz#151487322843359a1ca86b21a3815fd21a88b717" - integrity sha1-FRSHMihDNZocqGsho4Ff0hqItxc= - -"@svgr/babel-plugin-transform-svg-component@^4.2.0": - version "4.2.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-svg-component/download/@svgr/babel-plugin-transform-svg-component-4.2.0.tgz#5f1e2f886b2c85c67e76da42f0f6be1b1767b697" - integrity sha1-Xx4viGsshcZ+dtpC8Pa+Gxdntpc= - -"@svgr/babel-preset@^4.3.3": - version "4.3.3" - resolved "https://registry.npmmirror.com/@svgr/babel-preset/download/@svgr/babel-preset-4.3.3.tgz#a75d8c2f202ac0e5774e6bfc165d028b39a1316c" - integrity sha1-p12MLyAqwOV3Tmv8Fl0CizmhMWw= - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^4.2.0" - "@svgr/babel-plugin-remove-jsx-attribute" "^4.2.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^4.2.0" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^4.2.0" - "@svgr/babel-plugin-svg-dynamic-title" "^4.3.3" - "@svgr/babel-plugin-svg-em-dimensions" "^4.2.0" - "@svgr/babel-plugin-transform-react-native-svg" "^4.2.0" - "@svgr/babel-plugin-transform-svg-component" "^4.2.0" - -"@svgr/core@^4.3.3": - version "4.3.3" - resolved "https://registry.npmmirror.com/@svgr/core/download/@svgr/core-4.3.3.tgz#b37b89d5b757dc66e8c74156d00c368338d24293" - integrity sha1-s3uJ1bdX3Gbox0FW0Aw2gzjSQpM= - dependencies: - "@svgr/plugin-jsx" "^4.3.3" - camelcase "^5.3.1" - cosmiconfig "^5.2.1" - -"@svgr/hast-util-to-babel-ast@^4.3.2": - version "4.3.2" - resolved "https://registry.npmmirror.com/@svgr/hast-util-to-babel-ast/download/@svgr/hast-util-to-babel-ast-4.3.2.tgz#1d5a082f7b929ef8f1f578950238f630e14532b8" - integrity sha1-HVoIL3uSnvjx9XiVAjj2MOFFMrg= - dependencies: - "@babel/types" "^7.4.4" - -"@svgr/plugin-jsx@^4.3.3": - version "4.3.3" - resolved "https://registry.npmmirror.com/@svgr/plugin-jsx/download/@svgr/plugin-jsx-4.3.3.tgz#e2ba913dbdfbe85252a34db101abc7ebd50992fa" - integrity sha1-4rqRPb376FJSo02xAavH69UJkvo= - dependencies: - "@babel/core" "^7.4.5" - "@svgr/babel-preset" "^4.3.3" - "@svgr/hast-util-to-babel-ast" "^4.3.2" - svg-parser "^2.0.0" - -"@svgr/plugin-svgo@^4.3.1": - version "4.3.1" - resolved "https://registry.npmmirror.com/@svgr/plugin-svgo/download/@svgr/plugin-svgo-4.3.1.tgz#daac0a3d872e3f55935c6588dd370336865e9e32" - integrity sha1-2qwKPYcuP1WTXGWI3TcDNoZenjI= - dependencies: - cosmiconfig "^5.2.1" - merge-deep "^3.0.2" - svgo "^1.2.2" - -"@svgr/webpack@4.3.3": - version "4.3.3" - resolved "https://registry.npmmirror.com/@svgr/webpack/download/@svgr/webpack-4.3.3.tgz#13cc2423bf3dff2d494f16b17eb7eacb86895017" - integrity sha1-E8wkI789/y1JTxaxfrfqy4aJUBc= - dependencies: - "@babel/core" "^7.4.5" - "@babel/plugin-transform-react-constant-elements" "^7.0.0" - "@babel/preset-env" "^7.4.5" - "@babel/preset-react" "^7.0.0" - "@svgr/core" "^4.3.3" - "@svgr/plugin-jsx" "^4.3.3" - "@svgr/plugin-svgo" "^4.3.1" - loader-utils "^1.2.3" - -"@types/babel__core@^7.1.0": - version "7.1.18" - resolved "https://registry.npmmirror.com/@types/babel__core/download/@types/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" - integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.npmmirror.com/@types/babel__generator/download/@types/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.npmmirror.com/@types/babel__template/download/@types/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha1-PRpI/Z1sDt/Vby/1eNrtSPNsiWk= - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.14.2" - resolved "https://registry.npmmirror.com/@types/babel__traverse/download/@types/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha1-/81HC7s/i/MEgWePtVAieMqDOkM= - dependencies: - "@babel/types" "^7.3.0" - -"@types/classnames@^2.2.10": - version "2.3.1" - resolved "https://registry.npmmirror.com/@types/classnames/download/@types/classnames-2.3.1.tgz#3c2467aa0f1a93f1f021e3b9bcf938bd5dfdc0dd" - integrity sha1-PCRnqg8ak/HwIeO5vPk4vV39wN0= - dependencies: - classnames "*" - -"@types/codemirror@^0.0.96": - version "0.0.96" - resolved "https://registry.npmmirror.com/@types/codemirror/download/@types/codemirror-0.0.96.tgz#73b52e784a246cebef31d544fef45ea764de5bad" - integrity sha1-c7UueEokbOvvMdVE/vRep2TeW60= - dependencies: - "@types/tern" "*" - -"@types/d3-array@^1": - version "1.2.9" - resolved "https://registry.npmmirror.com/@types/d3-array/download/@types/d3-array-1.2.9.tgz#c7dc78992cd8ca5c850243a265fd257ea56df1fa" - integrity sha1-x9x4mSzYylyFAkOiZf0lfqVt8fo= - -"@types/d3-axis@^1": - version "1.0.16" - resolved "https://registry.npmmirror.com/@types/d3-axis/download/@types/d3-axis-1.0.16.tgz#93d7a28795c2f8b0e2fd550fcc4d29b7f174e693" - integrity sha1-k9eih5XC+LDi/VUPzE0pt/F05pM= - dependencies: - "@types/d3-selection" "^1" - -"@types/d3-brush@^1": - version "1.1.5" - resolved "https://registry.npmmirror.com/@types/d3-brush/download/@types/d3-brush-1.1.5.tgz#c7cfb58decbfd53ad3e47f0376345e3640a68186" - integrity sha1-x8+1jey/1TrT5H8DdjReNkCmgYY= - dependencies: - "@types/d3-selection" "^1" - -"@types/d3-chord@^1": - version "1.0.11" - resolved "https://registry.npmmirror.com/@types/d3-chord/download/@types/d3-chord-1.0.11.tgz#5760765db1b1a4b936c0d9355a821dde9dd25da2" - integrity sha1-V2B2XbGxpLk2wNk1WoId3p3SXaI= - -"@types/d3-collection@*": - version "1.0.10" - resolved "https://registry.npmmirror.com/@types/d3-collection/download/@types/d3-collection-1.0.10.tgz#bca161e336156968f267c077f7f2bfa8ff224e58" - integrity sha1-vKFh4zYVaWjyZ8B39/K/qP8iTlg= - -"@types/d3-color@^1": - version "1.4.2" - resolved "https://registry.npmmirror.com/@types/d3-color/download/@types/d3-color-1.4.2.tgz#944f281d04a0f06e134ea96adbb68303515b2784" - integrity sha1-lE8oHQSg8G4TTqlq27aDA1FbJ4Q= - -"@types/d3-contour@^1": - version "1.3.3" - resolved "https://registry.npmmirror.com/@types/d3-contour/download/@types/d3-contour-1.3.3.tgz#44529d498bbc1db78b195d75e1c9bb889edd647a" - integrity sha1-RFKdSYu8HbeLGV114cm7iJ7dZHo= - dependencies: - "@types/d3-array" "^1" - "@types/geojson" "*" - -"@types/d3-dispatch@^1": - version "1.0.9" - resolved "https://registry.npmmirror.com/@types/d3-dispatch/download/@types/d3-dispatch-1.0.9.tgz#c5a180f1e251de853b399cfbfbb6dd7f8bf842ae" - integrity sha1-xaGA8eJR3oU7OZz7+7bdf4v4Qq4= - -"@types/d3-drag@^1": - version "1.2.5" - resolved "https://registry.npmmirror.com/@types/d3-drag/download/@types/d3-drag-1.2.5.tgz#0b1b852cb41577075aa625ae6149379ea6c34dfd" - integrity sha1-CxuFLLQVdwdapiWuYUk3nqbDTf0= - dependencies: - "@types/d3-selection" "^1" - -"@types/d3-dsv@^1": - version "1.2.1" - resolved "https://registry.npmmirror.com/@types/d3-dsv/download/@types/d3-dsv-1.2.1.tgz#1524fee9f19d689c2f76aa0e24e230762bf96994" - integrity sha1-FST+6fGdaJwvdqoOJOIwdiv5aZQ= - -"@types/d3-ease@^1": - version "1.0.11" - resolved "https://registry.npmmirror.com/@types/d3-ease/download/@types/d3-ease-1.0.11.tgz#c4728639f5703dcb75b216dfa0860b2720f26898" - integrity sha512-wUigPL0kleGZ9u3RhzBP07lxxkMcUjL5IODP42mN/05UNL+JJCDnpEPpFbJiPvLcTeRKGIRpBBJyP/1BNwYsVA== - -"@types/d3-fetch@^1": - version "1.2.2" - resolved "https://registry.npmmirror.com/@types/d3-fetch/download/@types/d3-fetch-1.2.2.tgz#b93bfe248b8b761af82f4dac57959c989f67da3e" - integrity sha1-uTv+JIuLdhr4L02sV5WcmJ9n2j4= - dependencies: - "@types/d3-dsv" "^1" - -"@types/d3-force@^1": - version "1.2.4" - resolved "https://registry.npmmirror.com/@types/d3-force/download/@types/d3-force-1.2.4.tgz#6e274c72288c2db08fbdb8f5b87b9aa83e55a9e8" - integrity sha1-bidMciiMLbCPvbj1uHuaqD5Vqeg= - -"@types/d3-format@^1": - version "1.4.2" - resolved "https://registry.npmmirror.com/@types/d3-format/download/@types/d3-format-1.4.2.tgz#ea17bf559b71d9afd569ae9bfe4c544dab863baa" - integrity sha1-6he/VZtx2a/Vaa6b/kxUTauGO6o= - -"@types/d3-geo@^1": - version "1.12.3" - resolved "https://registry.npmmirror.com/@types/d3-geo/download/@types/d3-geo-1.12.3.tgz#512ebe735cb1cdf5f87ad59608416e2e9e868c5a" - integrity sha1-US6+c1yxzfX4etWWCEFuLp6GjFo= - dependencies: - "@types/geojson" "*" - -"@types/d3-hierarchy@^1": - version "1.1.8" - resolved "https://registry.npmmirror.com/@types/d3-hierarchy/download/@types/d3-hierarchy-1.1.8.tgz#50657f420d565a06c0b950a4b82eee0a369f2dea" - integrity sha1-UGV/Qg1WWgbAuVCkuC7uCjafLeo= - -"@types/d3-interpolate@^1": - version "1.4.2" - resolved "https://registry.npmmirror.com/@types/d3-interpolate/download/@types/d3-interpolate-1.4.2.tgz#88902a205f682773a517612299a44699285eed7b" - integrity sha1-iJAqIF9oJ3OlF2EimaRGmShe7Xs= - dependencies: - "@types/d3-color" "^1" - -"@types/d3-path@^1": - version "1.0.9" - resolved "https://registry.npmmirror.com/@types/d3-path/download/@types/d3-path-1.0.9.tgz#73526b150d14cd96e701597cbf346cfd1fd4a58c" - integrity sha1-c1JrFQ0UzZbnAVl8vzRs/R/UpYw= - -"@types/d3-polygon@^1": - version "1.0.8" - resolved "https://registry.npmmirror.com/@types/d3-polygon/download/@types/d3-polygon-1.0.8.tgz#127ee83fccda5bf57384011da90f31367fea1530" - integrity sha1-En7oP8zaW/VzhAEdqQ8xNn/qFTA= - -"@types/d3-quadtree@^1": - version "1.0.9" - resolved "https://registry.npmmirror.com/@types/d3-quadtree/download/@types/d3-quadtree-1.0.9.tgz#c7c3b795b5af06e5b043d1d34e754a434b3bae59" - integrity sha1-x8O3lbWvBuWwQ9HTTnVKQ0s7rlk= - -"@types/d3-random@^1": - version "1.1.3" - resolved "https://registry.npmmirror.com/@types/d3-random/download/@types/d3-random-1.1.3.tgz#8f7fdc23f92d1561e0694eb49567e8ab50537a19" - integrity sha1-j3/cI/ktFWHgaU60lWfoq1BTehk= - -"@types/d3-scale-chromatic@^1": - version "1.5.1" - resolved "https://registry.npmmirror.com/@types/d3-scale-chromatic/download/@types/d3-scale-chromatic-1.5.1.tgz#e2b7c3401e5c13809f831911eb820e444f4fc67a" - integrity sha1-4rfDQB5cE4CfgxkR64IORE9Pxno= - -"@types/d3-scale@^2": - version "2.2.6" - resolved "https://registry.npmmirror.com/@types/d3-scale/download/@types/d3-scale-2.2.6.tgz#28540b4dfc99d978970e873e4138a6bea2ea6ab8" - integrity sha1-KFQLTfyZ2XiXDoc+QTimvqLqarg= - dependencies: - "@types/d3-time" "^1" - -"@types/d3-selection@^1": - version "1.4.3" - resolved "https://registry.npmmirror.com/@types/d3-selection/download/@types/d3-selection-1.4.3.tgz#36928bbe64eb8e0bbcbaa01fb05c21ff6c71fa93" - integrity sha1-NpKLvmTrjgu8uqAfsFwh/2xx+pM= - -"@types/d3-shape@^1": - version "1.3.8" - resolved "https://registry.npmmirror.com/@types/d3-shape/download/@types/d3-shape-1.3.8.tgz#c3c15ec7436b4ce24e38de517586850f1fea8e89" - integrity sha1-w8Fex0NrTOJOON5RdYaFDx/qjok= - dependencies: - "@types/d3-path" "^1" - -"@types/d3-time-format@^2": - version "2.3.1" - resolved "https://registry.npmmirror.com/@types/d3-time-format/download/@types/d3-time-format-2.3.1.tgz#87a30e4513b9d1d53b920327a361f87255bf3372" - integrity sha1-h6MORRO50dU7kgMno2H4clW/M3I= - -"@types/d3-time@^1": - version "1.1.1" - resolved "https://registry.npmmirror.com/@types/d3-time/download/@types/d3-time-1.1.1.tgz#6cf3a4242c3bbac00440dfb8ba7884f16bedfcbf" - integrity sha1-bPOkJCw7usAEQN+4uniE8Wvt/L8= - -"@types/d3-timer@^1": - version "1.0.10" - resolved "https://registry.npmmirror.com/@types/d3-timer/download/@types/d3-timer-1.0.10.tgz#329c51c2c931f44ed0acff78b8c84571acf0ed21" - integrity sha1-MpxRwskx9E7QrP94uMhFcazw7SE= - -"@types/d3-transition@^1": - version "1.3.2" - resolved "https://registry.npmmirror.com/@types/d3-transition/download/@types/d3-transition-1.3.2.tgz#ed59beca7b4d679cfa52f88a6a50e5bbeb7e0a3c" - integrity sha1-7Vm+yntNZ5z6UviKalDlu+t+Cjw= - dependencies: - "@types/d3-selection" "^1" - -"@types/d3-voronoi@*": - version "1.1.9" - resolved "https://registry.npmmirror.com/@types/d3-voronoi/download/@types/d3-voronoi-1.1.9.tgz#7bbc210818a3a5c5e0bafb051420df206617c9e5" - integrity sha1-e7whCBijpcXguvsFFCDfIGYXyeU= - -"@types/d3-zoom@^1": - version "1.8.3" - resolved "https://registry.npmmirror.com/@types/d3-zoom/download/@types/d3-zoom-1.8.3.tgz#00237900c6fdc2bb4fe82679ee4d74eb8fbe7b3c" - integrity sha1-ACN5AMb9wrtP6CZ57k1064++ezw= - dependencies: - "@types/d3-interpolate" "^1" - "@types/d3-selection" "^1" - -"@types/d3@^5.7.2": - version "5.16.4" - resolved "https://registry.npmmirror.com/@types/d3/download/@types/d3-5.16.4.tgz#a7dc24a3dc1c19922eee72ba16144fd5bcea987a" - integrity sha1-p9wko9wcGZIu7nK6FhRP1bzqmHo= - dependencies: - "@types/d3-array" "^1" - "@types/d3-axis" "^1" - "@types/d3-brush" "^1" - "@types/d3-chord" "^1" - "@types/d3-collection" "*" - "@types/d3-color" "^1" - "@types/d3-contour" "^1" - "@types/d3-dispatch" "^1" - "@types/d3-drag" "^1" - "@types/d3-dsv" "^1" - "@types/d3-ease" "^1" - "@types/d3-fetch" "^1" - "@types/d3-force" "^1" - "@types/d3-format" "^1" - "@types/d3-geo" "^1" - "@types/d3-hierarchy" "^1" - "@types/d3-interpolate" "^1" - "@types/d3-path" "^1" - "@types/d3-polygon" "^1" - "@types/d3-quadtree" "^1" - "@types/d3-random" "^1" - "@types/d3-scale" "^2" - "@types/d3-scale-chromatic" "^1" - "@types/d3-selection" "^1" - "@types/d3-shape" "^1" - "@types/d3-time" "^1" - "@types/d3-time-format" "^2" - "@types/d3-timer" "^1" - "@types/d3-transition" "^1" - "@types/d3-voronoi" "*" - "@types/d3-zoom" "^1" - -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@types/eslint-visitor-keys/download/@types/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha1-HuMNeVRMqE1o1LPNsK9PIFZj3S0= - -"@types/estree@*": - version "0.0.50" - resolved "https://registry.npmmirror.com/@types/estree/download/@types/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha1-Hgyqk2TT/M0pMcPtlv2+ql1MyoM= - -"@types/file-saver@^2.0.1": - version "2.0.5" - resolved "https://registry.npmmirror.com/@types/file-saver/download/@types/file-saver-2.0.5.tgz#9ee342a5d1314bb0928375424a2f162f97c310c7" - integrity sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ== - -"@types/geojson@*": - version "7946.0.8" - resolved "https://registry.npmmirror.com/@types/geojson/download/@types/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca" - integrity sha1-MHRK/bOF4pReIvOwM/iX92sfEso= - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.npmmirror.com/@types/glob/download/@types/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha1-vBtb86qS8lvV3TnzXFc2G9zlsus= - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/hoist-non-react-statics@^3.3.1": - version "3.3.1" - resolved "https://registry.npmmirror.com/@types/hoist-non-react-statics/download/@types/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha1-ESSq/lEYy1kZd66xzqrtEHDrA58= - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.4" - resolved "https://registry.npmmirror.com/@types/istanbul-lib-coverage/download/@types/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmmirror.com/@types/istanbul-lib-report/download/@types/istanbul-lib-report-3.0.0.tgz?cache=0&sync_timestamp=1637266271645&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fistanbul-lib-report%2Fdownload%2F%40types%2Fistanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha1-wUwk8Y6oGQwRjudWK3/5mjZVJoY= - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.npmmirror.com/@types/istanbul-reports/download/@types/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha1-6HXMaJ5HvOVJ7IHz315vbxHPrrI= - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/jest-diff@*": - version "24.3.0" - resolved "https://registry.npmmirror.com/@types/jest-diff/download/@types/jest-diff-24.3.0.tgz#29e237a3d954babfe6e23cc59b57ecd8ca8d858d" - integrity sha1-KeI3o9lUur/m4jzFm1fs2MqNhY0= - dependencies: - jest-diff "*" - -"@types/jest@24.0.15": - version "24.0.15" - resolved "https://registry.npmmirror.com/@types/jest/download/@types/jest-24.0.15.tgz#6c42d5af7fe3b44ffff7cc65de7bf741e8fa427f" - integrity sha1-bELVr3/jtE//98xl3nv3Qej6Qn8= - dependencies: - "@types/jest-diff" "*" - -"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": - version "7.0.9" - resolved "https://registry.npmmirror.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha1-l+3JA36gw4WFMgsolk3eOznkZg0= - -"@types/lodash-es@^4.17.3": - version "4.17.5" - resolved "https://registry.npmmirror.com/@types/lodash-es/download/@types/lodash-es-4.17.5.tgz#1c3fdd16849d84aea43890b1c60da379fb501353" - integrity sha1-HD/dFoSdhK6kOJCxxg2jeftQE1M= - dependencies: - "@types/lodash" "*" - -"@types/lodash@*": - version "4.14.178" - resolved "https://registry.npmmirror.com/@types/lodash/download/@types/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" - integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== - -"@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.npmmirror.com/@types/mdast/download/@types/mdast-3.0.10.tgz?cache=0&sync_timestamp=1637267171178&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fmdast%2Fdownload%2F%40types%2Fmdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha1-RyQkSoKkWYiEy76bz9c9/5J+6K8= - dependencies: - "@types/unist" "*" - -"@types/minimatch@*": - version "3.0.5" - resolved "https://registry.npmmirror.com/@types/minimatch/download/@types/minimatch-3.0.5.tgz?cache=0&sync_timestamp=1637267467935&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fminimatch%2Fdownload%2F%40types%2Fminimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha1-EAHMXmo3BLg8I2An538vWOoBD0A= - -"@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.npmmirror.com/@types/minimist/download/@types/minimist-1.2.2.tgz?cache=0&sync_timestamp=1637267478331&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fminimist%2Fdownload%2F%40types%2Fminimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha1-7nceK6Sz3Fs3KTXVSf2WF780W4w= - -"@types/node@*": - version "17.0.13" - resolved "https://registry.npmmirror.com/@types/node/download/@types/node-17.0.13.tgz#5ed7ed7c662948335fcad6c412bb42d99ea754e3" - integrity sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw== - -"@types/node@14.11.8": - version "14.11.8" - resolved "https://registry.npmmirror.com/@types/node/download/@types/node-14.11.8.tgz#fe2012f2355e4ce08bca44aeb3abbb21cf88d33f" - integrity sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.npmmirror.com/@types/normalize-package-data/download/@types/normalize-package-data-2.4.1.tgz?cache=0&sync_timestamp=1637268963320&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fnormalize-package-data%2Fdownload%2F%40types%2Fnormalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha1-0zV0eaD9/dWQf+Z+F+CoXJBuEwE= - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.npmmirror.com/@types/parse-json/download/@types/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA= - -"@types/prop-types@*": - version "15.7.4" - resolved "https://registry.npmmirror.com/@types/prop-types/download/@types/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha1-/PcgXCXf95Xuea8eMNosl5CAjxE= - -"@types/q@^1.5.1": - version "1.5.5" - resolved "https://registry.npmmirror.com/@types/q/download/@types/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" - integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== - -"@types/react-dom@16.9.8": - version "16.9.8" - resolved "https://registry.npmmirror.com/@types/react-dom/download/@types/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423" - integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== - dependencies: - "@types/react" "*" - -"@types/react-highlight-words@^0.16.1": - version "0.16.4" - resolved "https://registry.npmmirror.com/@types/react-highlight-words/download/@types/react-highlight-words-0.16.4.tgz#441b6f05c27ce6ab76833803a84bc385f0a1e8f2" - integrity sha512-KITBX3xzheQLu2s3bUgLmRE7ekmhc52zRjRTwkKayQARh30L4fjEGzGm7ULK9TuX2LgxWWavZqyQGDGjAHbL3w== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "17.0.38" - resolved "https://registry.npmmirror.com/@types/react/download/@types/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" - integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@16.9.52": - version "16.9.52" - resolved "https://registry.npmmirror.com/@types/react/download/@types/react-16.9.52.tgz#c46c72d1a1d8d9d666f4dd2066c0e22600ccfde1" - integrity sha512-EHRjmnxiNivwhGdMh9sz1Yw9AUxTSZFxKqdBWAAzyZx3sufWwx6ogqHYh/WB1m/I4ZpjkoZLExF5QTy2ekVi/Q== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.npmmirror.com/@types/scheduler/download/@types/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha1-GmL4lSVyPd4kuhsBsJK/XfitTTk= - -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.npmmirror.com/@types/stack-utils/download/@types/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha1-CoUdO9lkmPolwzq3J47TvWXwbD4= - -"@types/tern@*": - version "0.23.4" - resolved "https://registry.npmmirror.com/@types/tern/download/@types/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb" - integrity sha1-A5JusT2+rzrg05DK9wayZDoBJ/s= - dependencies: - "@types/estree" "*" - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": - version "2.0.6" - resolved "https://registry.npmmirror.com/@types/unist/download/@types/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= - -"@types/uuid@^8.3.0": - version "8.3.4" - resolved "https://registry.npmmirror.com/@types/uuid/download/@types/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - -"@types/validator@^13.1.0": - version "13.7.1" - resolved "https://registry.npmmirror.com/@types/validator/download/@types/validator-13.7.1.tgz#cdab1b4779f6b1718a08de89d92d2603b71950cb" - integrity sha512-I6OUIZ5cYRk5lp14xSOAiXjWrfVoMZVjDuevBYgQDYzZIjsf2CAISpEcXOkFAtpAHbmWIDLcZObejqny/9xq5Q== - -"@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.npmmirror.com/@types/yargs-parser/download/@types/yargs-parser-20.2.1.tgz?cache=0&sync_timestamp=1637271401361&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fyargs-parser%2Fdownload%2F%40types%2Fyargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha1-O5ziSJkZ2eT+pDm3aRarw0st8Sk= - -"@types/yargs@^13.0.0": - version "13.0.12" - resolved "https://registry.npmmirror.com/@types/yargs/download/@types/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" - integrity sha1-2JWojHA7eK8EZaneiKqSxhQwsJI= - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^2.10.0": - version "2.34.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/download/@typescript-eslint/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" - integrity sha1-b4zopGx96kpvHRcdK7j7rm2sK+k= - dependencies: - "@typescript-eslint/experimental-utils" "2.34.0" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@2.34.0": - version "2.34.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha1-01JLZEzbQO687KZ/jPPkzJyPmA8= - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@^2.10.0": - version "2.34.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/parser/download/@typescript-eslint/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" - integrity sha1-UCUmMMoxloVCDpo5ygX+GFola8g= - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.34.0" - "@typescript-eslint/typescript-estree" "2.34.0" - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha1-FK62NTs57wcyzH8bgoUpSTfPN9U= - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/ast/download/@webassemblyjs/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha1-UbHF/mV2o0lTv0slPfnw1JDZ41k= - dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha1-G6kmopI2E+3OSW/VsC6M6KX0lyE= - -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha1-xJ2tIvZFInxe22EL25aX8aq3Ifc= - -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha1-/qk+Qphj3V5DOFVfQikjhaZT8gQ= - -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.8.5.tgz?cache=0&sync_timestamp=1625473466896&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-code-frame%2Fdownload%2F%40webassemblyjs%2Fhelper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha1-mnQP9I4/qjAisd/1RCPfmqKTwl4= - dependencies: - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha1-ugt9Oz9+RzPaYFnJMyJ12GBwJFI= - -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha1-3vS5knsBAdyMu9jR7bW3ucguskU= - dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha1-U3p1Dt31weky83RCBlUckcG5PmE= - -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha1-dMpqa8vhnlCjtrRihH5pUD5r/L8= - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha1-cSMp2+8kDza/V70ve4+5v0FUQh4= - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha1-BE7es06mefPgTNT9mCTV41dnrhA= - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha1-qL87XY/+mGx8Hjc8y9wqCRXwztw= - -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha1-li2hKqWswcExyBxCMpkcgs5W4Bo= - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha1-VIQHZsLBAC62TtGr5yCt7XFPmLw= - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha1-sk2fa6UDlK8TSfUQr6j/y4pj0mQ= - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha1-IVdvDsiLkUJzV7hTY4NmjvfGa40= - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha1-4Q7s1ULQ5705T2gnxJ899tTu+4w= - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.npmmirror.com/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha1-EUu8SB/RDKDiOzVg+oEnSLC65bw= - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmmirror.com/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A= - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmmirror.com/@xtuc/long/download/@xtuc/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0= - -abab@^2.0.0: - version "2.0.5" - resolved "https://registry.npmmirror.com/abab/download/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha1-wLZ4+zLWD8EhnHhNaoJv44Wut5o= - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-globals@^4.1.0, acorn-globals@^4.3.0: - version "4.3.4" - resolved "https://registry.npmmirror.com/acorn-globals/download/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha1-n6GSat3BHJcwjE5m163Q1Awycuc= - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-jsx@^5.2.0: - version "5.3.2" - resolved "https://registry.npmmirror.com/acorn-jsx/download/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.npmmirror.com/acorn-walk/download/acorn-walk-6.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-walk%2Fdownload%2Facorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha1-Ejy487hMIXHx9/slJhWxx4prGow= - -acorn@^5.5.3: - version "5.7.4" - resolved "https://registry.npmmirror.com/acorn/download/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== - -acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: - version "6.4.2" - resolved "https://registry.npmmirror.com/acorn/download/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.npmmirror.com/acorn/download/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -address@1.1.2, address@^1.0.1: - version "1.1.2" - resolved "https://registry.npmmirror.com/address/download/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY= - -adjust-sourcemap-loader@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/adjust-sourcemap-loader/download/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4" - integrity sha1-ZHEUOvdewCM0shn1S8eXDFL7KaQ= - dependencies: - assert "1.4.1" - camelcase "5.0.0" - loader-utils "1.2.3" - object-path "0.11.4" - regex-parser "2.2.10" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/aggregate-error/download/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha1-kmcP9Q9TWb23o+DUDQ7DDFc3aHo= - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/ajv-errors/download/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha1-81mGrOuRr63sQQL72FAUlQzvpk0= - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmmirror.com/ajv-keywords/download/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha1-MfKdpatuANHC0yms97WSlhTVAU0= - -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.9.0" - resolved "https://registry.npmmirror.com/ajv/download/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" - integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/alphanum-sort/download/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.npmmirror.com/ansi-colors/download/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha1-46PaS/uubIapwoViXeEkojQCb78= - -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/ansi-escapes/download/ansi-escapes-3.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-escapes%2Fdownload%2Fansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s= - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.npmmirror.com/ansi-escapes/download/ansi-escapes-4.3.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-escapes%2Fdownload%2Fansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4= - dependencies: - type-fest "^0.21.3" - -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.npmmirror.com/ansi-html/download/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.npmmirror.com/ansi-regex/download/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/ansi-regex/download/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/ansi-regex/download/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= - -ansi-regex@^5.0.0, ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/download/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ= - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -antd@^4.18.5: - version "4.18.5" - resolved "https://registry.npmmirror.com/antd/download/antd-4.18.5.tgz#e5ffbe238fd6fdfcd1ed39ba96e4b1bd5f589757" - integrity sha512-5fN3C2lWAzonhOYYlNpzIw2OHl7vxFZ+4cJ7DK/XZrV+75OY61Y+OkanqMJwrFtDDamIez35OM7cAezGko9tew== - dependencies: - "@ant-design/colors" "^6.0.0" - "@ant-design/icons" "^4.7.0" - "@ant-design/react-slick" "~0.28.1" - "@babel/runtime" "^7.12.5" - "@ctrl/tinycolor" "^3.4.0" - classnames "^2.2.6" - copy-to-clipboard "^3.2.0" - lodash "^4.17.21" - memoize-one "^6.0.0" - moment "^2.25.3" - rc-cascader "~3.2.1" - rc-checkbox "~2.3.0" - rc-collapse "~3.1.0" - rc-dialog "~8.6.0" - rc-drawer "~4.4.2" - rc-dropdown "~3.2.0" - rc-field-form "~1.22.0-2" - rc-image "~5.2.5" - rc-input-number "~7.3.0" - rc-mentions "~1.6.1" - rc-menu "~9.2.1" - rc-motion "^2.4.4" - rc-notification "~4.5.7" - rc-pagination "~3.1.9" - rc-picker "~2.5.17" - rc-progress "~3.2.1" - rc-rate "~2.9.0" - rc-resize-observer "^1.2.0" - rc-select "~14.0.0-alpha.15" - rc-slider "~9.7.4" - rc-steps "~4.1.0" - rc-switch "~3.2.0" - rc-table "~7.22.2" - rc-tabs "~11.10.0" - rc-textarea "~0.3.0" - rc-tooltip "~5.1.1" - rc-tree "~5.4.3" - rc-tree-select "~5.1.1" - rc-trigger "^5.2.10" - rc-upload "~4.3.0" - rc-util "^5.14.0" - scroll-into-view-if-needed "^2.2.25" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/anymatch/download/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha1-vLJLTzeTTZqnrBe0ra+J58du8us= - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/anymatch/download/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha1-wFV8CWrzLxBhmPT04qODU343hxY= - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.npmmirror.com/aproba/download/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha1-aALmJk79GMeQobDVF/DyYnvyyUo= - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmmirror.com/argparse/download/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= - dependencies: - sprintf-js "~1.0.2" - -aria-query@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/aria-query/download/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" - integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - -arity-n@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/arity-n/download/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" - integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/arr-diff/download/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/arr-flatten/download/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/arr-union/download/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/array-equal/download/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.npmmirror.com/array-flatten/download/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk= - -array-includes@^3.0.3, array-includes@^3.1.1: - version "3.1.4" - resolved "https://registry.npmmirror.com/array-includes/download/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" - integrity sha1-9bSTFix2DzU5Yx8AW6K7Rqy0W6k= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - is-string "^1.0.7" - -array-tree-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/array-tree-filter/download/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" - integrity sha1-hzrAD+yDdJ8lWsjdCDgUtPYykZA= - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/array-union/download/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/array-union/download/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha1-t5hCCtvrHego2ErNii4j0+/oXo0= - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.npmmirror.com/array-uniq/download/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.npmmirror.com/array-unique/download/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -array.prototype.flat@^1.2.1: - version "1.2.5" - resolved "https://registry.npmmirror.com/array.prototype.flat/download/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" - integrity sha1-B+CXXYS7x8SM0YedYJ5oJZjTPhM= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/arrify/download/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -asap@~2.0.3, asap@~2.0.6: - version "2.0.6" - resolved "https://registry.npmmirror.com/asap/download/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.npmmirror.com/asn1.js/download/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.npmmirror.com/asn1/download/asn1-0.2.6.tgz?cache=0&sync_timestamp=1635986760581&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fasn1%2Fdownload%2Fasn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha1-DTp7tuZOAqkMAwOzHykoaOoJoI0= - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assert@1.4.1: - version "1.4.1" - resolved "https://registry.npmmirror.com/assert/download/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= - dependencies: - util "0.10.3" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.npmmirror.com/assert/download/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/assign-symbols/download/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -ast-types-flow@0.0.7, ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.npmmirror.com/ast-types-flow/download/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/astral-regex/download/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k= - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/astral-regex/download/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha1-SDFDxWeu7UeFdZwIZXhtx319LjE= - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.npmmirror.com/async-each/download/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8= - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/async-limiter/download/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha1-3TeelPDbgxCwgpH51kwyCXZmF/0= - -async-validator@^4.0.2: - version "4.0.7" - resolved "https://registry.npmmirror.com/async-validator/download/async-validator-4.0.7.tgz?cache=0&sync_timestamp=1634529502627&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fasync-validator%2Fdownload%2Fasync-validator-4.0.7.tgz#034a0fd2103a6b2ebf010da75183bec299247afe" - integrity sha1-A0oP0hA6ay6/AQ2nUYO+wpkkev4= - -async@^2.6.2: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmmirror.com/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/atob/download/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= - -autoprefixer@^9.6.1, autoprefixer@^9.8.6: - version "9.8.8" - resolved "https://registry.npmmirror.com/autoprefixer/download/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" - integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== - dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - picocolors "^0.2.1" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.npmmirror.com/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.npmmirror.com/aws4/download/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk= - -axios@^0.19.0: - version "0.19.2" - resolved "https://registry.npmmirror.com/axios/download/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" - integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== - dependencies: - follow-redirects "1.5.10" - -axobject-query@^2.0.2: - version "2.2.0" - resolved "https://registry.npmmirror.com/axobject-query/download/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" - integrity sha1-lD1H4QwLcEqkInXiDt83ImSJib4= - -babel-code-frame@^6.22.0: - version "6.26.0" - resolved "https://registry.npmmirror.com/babel-code-frame/download/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-eslint@10.1.0: - version "10.1.0" - resolved "https://registry.npmmirror.com/babel-eslint/download/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" - integrity sha1-aWjlaKkQt4+zd5zdi2rC9HmUMjI= - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" - -babel-extract-comments@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/babel-extract-comments/download/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" - integrity sha1-Cirt+BQX7TkbheGLRhTmk6A1GiE= - dependencies: - babylon "^6.18.0" - -babel-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/babel-jest/download/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" - integrity sha1-P8Mny4RnuJ0U17xw4xUQSng8zVQ= - dependencies: - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/babel__core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.9.0" - chalk "^2.4.2" - slash "^2.0.0" - -babel-loader@8.1.0: - version "8.1.0" - resolved "https://registry.npmmirror.com/babel-loader/download/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" - integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== - dependencies: - find-cache-dir "^2.1.0" - loader-utils "^1.4.0" - mkdirp "^0.5.3" - pify "^4.0.1" - schema-utils "^2.6.5" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha1-hP2hnJduxcbe/vV/lCez3vZuF6M= - dependencies: - object.assign "^4.1.0" - -babel-plugin-istanbul@^5.1.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/babel-plugin-istanbul/download/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" - integrity sha1-30reg9iXqS3wacTZolzyZxKTyFQ= - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - find-up "^3.0.0" - istanbul-lib-instrument "^3.3.0" - test-exclude "^5.2.3" - -babel-plugin-jest-hoist@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/babel-plugin-jest-hoist/download/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" - integrity sha1-T4NwketAfgFEfIhDy+xUbQAC11Y= - dependencies: - "@types/babel__traverse" "^7.0.6" - -babel-plugin-macros@2.8.0: - version "2.8.0" - resolved "https://registry.npmmirror.com/babel-plugin-macros/download/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha1-D5WKfMZVax5lNERl2ZERoeXhATg= - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - -babel-plugin-named-asset-import@^0.3.6: - version "0.3.8" - resolved "https://registry.npmmirror.com/babel-plugin-named-asset-import/download/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" - integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== - -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.1" - resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/download/babel-plugin-polyfill-corejs3-0.5.1.tgz#d66183bf10976ea677f4149a7fcc4d8df43d4060" - integrity sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.20.0" - -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.1" - resolved "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/download/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.npmmirror.com/babel-plugin-syntax-object-rest-spread/download/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.npmmirror.com/babel-plugin-transform-object-rest-spread/download/babel-plugin-transform-object-rest-spread-6.26.0.tgz?cache=0&sync_timestamp=1624608042865&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-plugin-transform-object-rest-spread%2Fdownload%2Fbabel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-react-remove-prop-types@0.4.24: - version "0.4.24" - resolved "https://registry.npmmirror.com/babel-plugin-transform-react-remove-prop-types/download/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" - integrity sha1-8u2vm0xqX75cHWeL+1MQeMFVXzo= - -babel-preset-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/babel-preset-jest/download/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" - integrity sha1-GStSHiIX+x0fZ89z9wwzZlCtPNw= - dependencies: - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.9.0" - -babel-preset-react-app@^9.1.2: - version "9.1.2" - resolved "https://registry.npmmirror.com/babel-preset-react-app/download/babel-preset-react-app-9.1.2.tgz#54775d976588a8a6d1a99201a702befecaf48030" - integrity sha1-VHddl2WIqKbRqZIBpwK+/sr0gDA= - dependencies: - "@babel/core" "7.9.0" - "@babel/plugin-proposal-class-properties" "7.8.3" - "@babel/plugin-proposal-decorators" "7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "7.8.3" - "@babel/plugin-proposal-numeric-separator" "7.8.3" - "@babel/plugin-proposal-optional-chaining" "7.9.0" - "@babel/plugin-transform-flow-strip-types" "7.9.0" - "@babel/plugin-transform-react-display-name" "7.8.3" - "@babel/plugin-transform-runtime" "7.9.0" - "@babel/preset-env" "7.9.0" - "@babel/preset-react" "7.9.1" - "@babel/preset-typescript" "7.9.0" - "@babel/runtime" "7.9.0" - babel-plugin-macros "2.8.0" - babel-plugin-transform-react-remove-prop-types "0.4.24" - -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.npmmirror.com/babel-runtime/download/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.npmmirror.com/babylon/download/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha1-ry87iPpvXB5MY00aD46sT1WzleM= - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.npmmirror.com/bail/download/bail-1.0.5.tgz?cache=0&sync_timestamp=1636274807479&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbail%2Fdownload%2Fbail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha1-tvoTNASjksvB+MS/Y/WVM1Hnp3Y= - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/balanced-match/download/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= - -balanced-match@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/balanced-match/download/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" - integrity sha1-3HD5INeNuLhYU1eVhnv0j4IGM9k= - -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/base16/download/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" - integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= - -base64-js@^1.0.2: - version "1.5.1" - resolved "https://registry.npmmirror.com/base64-js/download/base64-js-1.5.1.tgz?cache=0&sync_timestamp=1624607950711&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbase64-js%2Fdownload%2Fbase64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha1-GxtEAWClv3rUC2UPCVljSBkDkwo= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.npmmirror.com/base/download/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha1-e95c7RRbbVUakNuH+DxVi060io8= - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.npmmirror.com/batch/download/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmmirror.com/big.js/download/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg= - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.npmmirror.com/binary-extensions/download/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U= - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/binary-extensions/download/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0= - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.npmmirror.com/bindings/download/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha1-EDU8npRTNLwFEabZCzj7x8nFBN8= - dependencies: - file-uri-to-path "1.0.0" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.npmmirror.com/bluebird/download/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28= - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.npmmirror.com/bn.js/download/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha1-d1s/J477uXGO7HNh9IP7Nvu/6og= - -bn.js@^5.0.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/bn.js/download/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha1-NYhgZ0OWxpl3canQUfzBtX1K4AI= - -bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -body-parser@1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.npmmirror.com/bonjour/download/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/boolbase/download/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmmirror.com/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.npmmirror.com/braces/download/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha1-WXn9PxTNUxVl5fot8av/8d+u5yk= - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc= - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/brorand/download/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/browser-process-hrtime/download/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha1-PJtLfXgsgSHlbxAQbYTA0P/JRiY= - -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.npmmirror.com/browser-resolve/download/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha1-m3y7PQ9RDky4a9vXlhJNKLWJCvY= - dependencies: - resolve "1.1.7" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.npmmirror.com/browserify-aes/download/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha1-Mmc0ZC9APavDADIJhTu3CtQo70g= - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/browserify-cipher/download/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha1-jWR0wbhwv9q807z8wZNKEOlPFfA= - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/browserify-des/download/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw= - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/browserify-rsa/download/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha1-sv0Gtbda4pf3zi3GUfkY9b4VjI0= - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" - integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== - dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.4" - inherits "^2.0.4" - parse-asn1 "^5.1.6" - readable-stream "^3.6.2" - safe-buffer "^5.2.1" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/browserify-zlib/download/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha1-KGlFnZqjviRf6P4sofRuLn9U1z8= - dependencies: - pako "~1.0.5" - -browserslist@4.10.0: - version "4.10.0" - resolved "https://registry.npmmirror.com/browserslist/download/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" - integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== - dependencies: - caniuse-lite "^1.0.30001035" - electron-to-chromium "^1.3.378" - node-releases "^1.1.52" - pkg-up "^3.1.0" - -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.5, browserslist@^4.19.1, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.9.1: - version "4.19.1" - resolved "https://registry.npmmirror.com/browserslist/download/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" - integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== - dependencies: - caniuse-lite "^1.0.30001286" - electron-to-chromium "^1.4.17" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/bser/download/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha1-5nh9og7OnQeZhTPP2d5vXDj0vAU= - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.npmmirror.com/buffer-indexof/download/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow= - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/buffer-xor/download/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.npmmirror.com/buffer/download/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/bytes/download/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.npmmirror.com/cacache/download/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw= - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^13.0.1: - version "13.0.1" - resolved "https://registry.npmmirror.com/cacache/download/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" - integrity sha1-qAAMIWlwiQgvhSh6GuxuOCAkpxw= - dependencies: - chownr "^1.1.2" - figgy-pudding "^3.5.1" - fs-minipass "^2.0.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - minipass "^3.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - p-map "^3.0.0" - promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^7.0.0" - unique-filename "^1.1.1" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/cache-base/download/cache-base-1.0.1.tgz?cache=0&sync_timestamp=1636237308360&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcache-base%2Fdownload%2Fcache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha1-Cn9GQWgxyLZi7jb+TnxZ129marI= - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/call-bind/download/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw= - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/call-me-maybe/download/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/caller-callsite/download/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/caller-path/download/caller-path-2.0.0.tgz?cache=0&sync_timestamp=1633674944097&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcaller-path%2Fdownload%2Fcaller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/callsites/download/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/callsites/download/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M= - -camel-case@^4.1.1: - version "4.1.2" - resolved "https://registry.npmmirror.com/camel-case/download/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha1-lygHKpVPgFIoIlpt7qazhGHhvVo= - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.npmmirror.com/camelcase-keys/download/camelcase-keys-6.2.2.tgz?cache=0&sync_timestamp=1633332938539&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase-keys%2Fdownload%2Fcamelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha1-XnVda6UaoiPsfT1S8ld4IQ+dw8A= - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/camelcase/download/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" - integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== - -camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmmirror.com/camelcase/download/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/caniuse-api/download/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA= - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001286: - version "1.0.30001303" - resolved "https://registry.npmmirror.com/caniuse-lite/download/caniuse-lite-1.0.30001303.tgz#9b168e4f43ccfc372b86f4bc5a551d9b909c95c9" - integrity sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/capture-exit/download/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha1-+5U7+uvreB9iiYI52rtCbQilCaQ= - dependencies: - rsvp "^4.8.4" - -case-sensitive-paths-webpack-plugin@2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" - integrity sha1-I6xhPMmoVuT4j/i7c7u16YmCXPc= - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.npmmirror.com/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmmirror.com/chalk/download/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.npmmirror.com/chalk/download/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.npmmirror.com/character-entities-legacy/download/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha1-lLwYRdznClu50uzHSHJWYSk9j8E= - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.npmmirror.com/character-entities/download/character-entities-1.2.4.tgz?cache=0&sync_timestamp=1635868846406&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcharacter-entities%2Fdownload%2Fcharacter-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha1-4Sw5Obfq9OWxXnrUxeKOHUjFsWs= - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.npmmirror.com/character-reference-invalid/download/character-reference-invalid-1.1.4.tgz?cache=0&sync_timestamp=1636446259053&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcharacter-reference-invalid%2Fdownload%2Fcharacter-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha1-CDMpzaDq4nKrPbvzfpo4LBOvFWA= - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.npmmirror.com/chardet/download/chardet-0.7.0.tgz?cache=0&sync_timestamp=1634639163489&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fchardet%2Fdownload%2Fchardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= - -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.npmmirror.com/chokidar/download/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^3.3.0, chokidar@^3.4.1: - version "3.5.3" - resolved "https://registry.npmmirror.com/chokidar/download/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.1, chownr@^1.1.2: - version "1.1.4" - resolved "https://registry.npmmirror.com/chownr/download/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs= - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/chrome-trace-event/download/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw= - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/ci-info/download/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y= - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.npmmirror.com/cipher-base/download/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94= - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.npmmirror.com/class-utils/download/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha1-+TNprouafOAv1B+q0MqDAzGQxGM= - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -classnames@*, classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1: - version "2.3.1" - resolved "https://registry.npmmirror.com/classnames/download/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -clean-css@^4.2.3: - version "4.2.4" - resolved "https://registry.npmmirror.com/clean-css/download/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" - integrity sha1-czv0brpOYHxokepXwkqYk1aDEXg= - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/clean-stack/download/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha1-7oRy27Ep5yezHooQpCfe6d/kAIs= - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/cli-cursor/download/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha1-JkMFp65JDR0Dvwybp8kl0XU68wc= - dependencies: - restore-cursor "^3.1.0" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.npmmirror.com/cli-width/download/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha1-sEM9C06chH7xiGik7xb9X8gnHEg= - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/cli-width/download/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha1-ovSEN6LKqaIkNueUvwceyeYc7fY= - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/cliui/download/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha1-NIQi2+gtgAswIu709qwQvy5NG0k= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/cliui/download/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U= - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -clone-deep@^0.2.4: - version "0.2.4" - resolved "https://registry.npmmirror.com/clone-deep/download/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" - integrity sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY= - dependencies: - for-own "^0.1.3" - is-plain-object "^2.0.1" - kind-of "^3.0.2" - lazy-cache "^1.0.3" - shallow-clone "^0.1.2" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/clone-deep/download/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c= - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone-regexp@^2.1.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/clone-regexp/download/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" - integrity sha1-fWXgCIXNh5ZAXDWnN+eoa3Qp428= - dependencies: - is-regexp "^2.0.0" - -clone@^2.1.1: - version "2.1.2" - resolved "https://registry.npmmirror.com/clone/download/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.npmmirror.com/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/coa/download/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM= - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -codemirror@^5.55.0: - version "5.65.1" - resolved "https://registry.npmmirror.com/codemirror/download/codemirror-5.65.1.tgz#5988a812c974c467f964bcc1a00c944e373de502" - integrity sha512-s6aac+DD+4O2u1aBmdxhB7yz2XU7tG3snOyQ05Kxifahz7hoxnfxIRHxiCSEv3TUC38dIVH8G+lZH9UWSfGQxA== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/collection-visit/download/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0, color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.npmmirror.com/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/color-convert/download/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM= - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/color-name/download/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI= - -color-string@^1.6.0: - version "1.9.0" - resolved "https://registry.npmmirror.com/color-string/download/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" - integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.0.0: - version "3.2.1" - resolved "https://registry.npmmirror.com/color/download/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.npmmirror.com/combined-stream/download/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= - dependencies: - delayed-stream "~1.0.0" - -commander@^2.11.0, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmmirror.com/commander/download/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.1.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/commander/download/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -common-tags@^1.8.0: - version "1.8.2" - resolved "https://registry.npmmirror.com/common-tags/download/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/commondir/download/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.npmmirror.com/component-emitter/download/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= - -compose-function@3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/compose-function/download/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" - integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= - dependencies: - arity-n "^1.0.4" - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npmmirror.com/compressible/download/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o= - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmmirror.com/compression/download/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48= - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -compute-scroll-into-view@^1.0.17: - version "1.0.17" - resolved "https://registry.npmmirror.com/compute-scroll-into-view/download/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" - integrity sha1-aojxis2dQunPS6pr7H4FImB6t6s= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.npmmirror.com/concat-stream/download/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ= - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -confusing-browser-globals@^1.0.9: - version "1.0.11" - resolved "https://registry.npmmirror.com/confusing-browser-globals/download/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" - integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.npmmirror.com/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w= - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/console-browserify/download/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha1-ZwY871fOts9Jk6KrOlWECujEkzY= - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/constants-browserify/download/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/contains-path/download/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@1.7.0: - version "1.7.0" - resolved "https://registry.npmmirror.com/convert-source-map/download/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI= - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^0.3.3: - version "0.3.5" - resolved "https://registry.npmmirror.com/convert-source-map/download/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" - integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= - -convert-source-map@^1.4.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npmmirror.com/convert-source-map/download/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k= - dependencies: - safe-buffer "~5.1.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - -copy-anything@^2.0.1: - version "2.0.6" - resolved "https://registry.npmmirror.com/copy-anything/download/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" - integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== - dependencies: - is-what "^3.14.1" - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.npmmirror.com/copy-concurrently/download/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha1-kilzmMrjSTf8r9bsgTnBgFHwteA= - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.npmmirror.com/copy-descriptor/download/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -copy-to-clipboard@^3.2.0: - version "3.3.1" - resolved "https://registry.npmmirror.com/copy-to-clipboard/download/copy-to-clipboard-3.3.1.tgz?cache=0&sync_timestamp=1624607975240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcopy-to-clipboard%2Fdownload%2Fcopy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" - integrity sha1-EVqhqZmP+rYZb5MHatbaO5E2Yq4= - dependencies: - toggle-selection "^1.0.6" - -core-js-compat@^3.20.0, core-js-compat@^3.20.2, core-js-compat@^3.6.2: - version "3.20.3" - resolved "https://registry.npmmirror.com/core-js-compat/download/core-js-compat-3.20.3.tgz#d71f85f94eb5e4bea3407412e549daa083d23bd6" - integrity sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw== - dependencies: - browserslist "^4.19.1" - semver "7.0.0" - -core-js-pure@^3.20.2: - version "3.20.3" - resolved "https://registry.npmmirror.com/core-js-pure/download/core-js-pure-3.20.3.tgz#6cc4f36da06c61d95254efc54024fe4797fd5d02" - integrity sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA== - -core-js@^2.4.0: - version "2.6.12" - resolved "https://registry.npmmirror.com/core-js/download/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-js@^3.5.0: - version "3.20.3" - resolved "https://registry.npmmirror.com/core-js/download/core-js-3.20.3.tgz#c710d0a676e684522f3db4ee84e5e18a9d11d69a" - integrity sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmmirror.com/core-util-is/download/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U= - -cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: - version "5.2.1" - resolved "https://registry.npmmirror.com/cosmiconfig/download/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha1-BA9yaAnFked6F8CjYmykW08Wixo= - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/cosmiconfig/download/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha1-2k/uhTxS9rHmk19BwaL8UL1KmYI= - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.npmmirror.com/cosmiconfig/download/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha1-cU11ZSLKzoZ4Z8y0R0xdAbuuXW0= - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.npmmirror.com/create-ecdh/download/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha1-1uf0v/pmc2CFoHYv06YyaE2rzE4= - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/create-hash/download/create-hash-1.2.0.tgz?cache=0&sync_timestamp=1624607951398&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcreate-hash%2Fdownload%2Fcreate-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY= - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.npmmirror.com/create-hmac/download/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8= - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-fetch@^3.0.4: - version "3.1.5" - resolved "https://registry.npmmirror.com/cross-fetch/download/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -cross-spawn@7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/cross-spawn/download/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" - integrity sha1-CrVihuD3wk4VPQTMKqAn5DqaXRQ= - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.npmmirror.com/cross-spawn/download/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q= - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.npmmirror.com/crypto-browserify/download/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha1-OWz58xN/A+S45TLFj2mCVOAPgOw= - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-blank-pseudo@^0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/css-blank-pseudo/download/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" - integrity sha1-3979MlS/ioICeZNnTM81SDv8s8U= - dependencies: - postcss "^7.0.5" - -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.npmmirror.com/css-color-names/download/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/css-declaration-sorter/download/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha1-wZiUD2OnbX42wecQGLABchBUyyI= - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" - -css-has-pseudo@^0.10.0: - version "0.10.0" - resolved "https://registry.npmmirror.com/css-has-pseudo/download/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" - integrity sha1-PGQqs0yiQsWcQaEl35EFhB9pZu4= - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^5.0.0-rc.4" - -css-loader@3.4.2: - version "3.4.2" - resolved "https://registry.npmmirror.com/css-loader/download/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" - integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== - dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.23" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.1.1" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.0.2" - schema-utils "^2.6.0" - -css-prefers-color-scheme@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/css-prefers-color-scheme/download/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" - integrity sha1-b4MKJxQZnU8NDQu4onkW7WXP8fQ= - dependencies: - postcss "^7.0.5" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.npmmirror.com/css-select-base-adapter/download/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc= - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/css-select/download/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha1-ajRlM1ZjWTSoG6ymjQJVQyEF2+8= - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-select@^4.1.3: - version "4.2.1" - resolved "https://registry.npmmirror.com/css-select/download/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" - integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== - dependencies: - boolbase "^1.0.0" - css-what "^5.1.0" - domhandler "^4.3.0" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.npmmirror.com/css-tree/download/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha1-mL69YsTB2flg7DQM+fdSLjBwmiI= - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-tree@^1.1.2: - version "1.1.3" - resolved "https://registry.npmmirror.com/css-tree/download/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha1-60hw+2/XcHMn7JXC/yqwm16NuR0= - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.npmmirror.com/css-what/download/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" - integrity sha1-6nAm/LAXd+295SEk4h8yfnrpUOQ= - -css-what@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/css-what/download/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" - integrity sha1-P3tweq32M7r2LCzrhXm1RbtA9/4= - -css@^2.0.0: - version "2.2.4" - resolved "https://registry.npmmirror.com/css/download/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk= - dependencies: - inherits "^2.0.3" - source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - -cssdb@^4.4.0: - version "4.4.0" - resolved "https://registry.npmmirror.com/cssdb/download/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" - integrity sha1-O/LypowQ9cagir2SN4Mx7oA83bA= - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/cssesc/download/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha1-OxO9G7HLNuG8taTc0n9UxdyzVwM= - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/cssesc/download/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4= - -cssnano-preset-default@^4.0.8: - version "4.0.8" - resolved "https://registry.npmmirror.com/cssnano-preset-default/download/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" - integrity sha1-kgYisfwelaNOiDggPxOXpQTy0/8= - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.3" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/cssnano-util-get-arguments/download/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/cssnano-util-get-match/download/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/cssnano-util-raw-cache/download/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI= - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.npmmirror.com/cssnano-util-same-parent/download/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M= - -cssnano@^4.1.10: - version "4.1.11" - resolved "https://registry.npmmirror.com/cssnano/download/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" - integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.8" - is-resolvable "^1.0.0" - postcss "^7.0.0" - -csso@^4.0.2: - version "4.2.0" - resolved "https://registry.npmmirror.com/csso/download/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: - version "0.3.8" - resolved "https://registry.npmmirror.com/cssom/download/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha1-nxJ29bK0Y/IRTT8sdSUK+MGjb0o= - -cssstyle@^1.0.0, cssstyle@^1.1.1: - version "1.4.0" - resolved "https://registry.npmmirror.com/cssstyle/download/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha1-nTEyginTxWXGHlhrAgQaKPzNzPE= - dependencies: - cssom "0.3.x" - -csstype@^3.0.2: - version "3.0.10" - resolved "https://registry.npmmirror.com/csstype/download/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== - -customize-cra@^0.9.1: - version "0.9.1" - resolved "https://registry.npmmirror.com/customize-cra/download/customize-cra-0.9.1.tgz#76b42c4f537c16329eccc09cfefd804d04c81550" - integrity sha1-drQsT1N8FjKezMCc/v2ATQTIFVA= - dependencies: - lodash.flow "^3.5.0" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/cyclist/download/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/d/download/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -damerau-levenshtein@^1.0.4: - version "1.0.8" - resolved "https://registry.npmmirror.com/damerau-levenshtein/download/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.npmmirror.com/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -data-urls@^1.0.0, data-urls@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/data-urls/download/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha1-Fe4Fgrql4iu1nHcUDaj5x2lju/4= - dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - -date-fns@2.x: - version "2.28.0" - resolved "https://registry.npmmirror.com/date-fns/download/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" - integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== - -dayjs@1.x: - version "1.10.7" - resolved "https://registry.npmmirror.com/dayjs/download/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" - integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@=3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/debug/download/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@^3.1.1, debug@^3.2.5, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.3" - resolved "https://registry.npmmirror.com/debug/download/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/decamelize-keys/download/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -deep-equal@^1.0.1, deep-equal@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/deep-equal/download/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o= - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.npmmirror.com/deep-is/download/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE= - -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/default-gateway/download/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs= - dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/define-properties/download/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE= - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.npmmirror.com/define-property/download/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/define-property/download/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/define-property/download/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha1-1Flono1lS6d+AqgX+HENcCyxbp0= - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^4.1.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/del/download/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/des.js/download/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM= - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/detect-newline/download/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.npmmirror.com/detect-node/download/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha1-yccHdaScPQO8LAbZpzvlUPl4+LE= - -detect-port-alt@1.1.6: - version "1.1.6" - resolved "https://registry.npmmirror.com/detect-port-alt/download/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha1-JHB96r6TLUo89iEwICfCsmZWgnU= - dependencies: - address "^1.0.1" - debug "^2.6.0" - -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/diff-sequences/download/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha1-VxXWJE4qpl9Iu6C8ly2wsLEelbU= - -diff-sequences@^27.4.0: - version "27.4.0" - resolved "https://registry.npmmirror.com/diff-sequences/download/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5" - integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.npmmirror.com/diffie-hellman/download/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha1-QOjumPVaIUlgcUaSHGPhrl89KHU= - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/dir-glob/download/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha1-CyBdK2rvmCOMooZZioIE0p0KADQ= - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/dir-glob/download/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8= - dependencies: - path-type "^4.0.0" - -dnd-core@^11.1.3: - version "11.1.3" - resolved "https://registry.npmmirror.com/dnd-core/download/dnd-core-11.1.3.tgz#f92099ba7245e49729d2433157031a6267afcc98" - integrity sha1-+SCZunJF5Jcp0kMxVwMaYmevzJg= - dependencies: - "@react-dnd/asap" "^4.0.0" - "@react-dnd/invariant" "^2.0.0" - redux "^4.0.4" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/dns-equal/download/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.npmmirror.com/dns-packet/download/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha1-40VQZYJKJQe6iGxVqJljuxB97G8= - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/dns-txt/download/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= - dependencies: - buffer-indexof "^1.0.0" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.npmmirror.com/doctrine/download/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/doctrine/download/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha1-XNAfwQFiG0LEzX9dGmYkNxbT850= - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/doctrine/download/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha1-rd6+rXKmV023g2OdyHoSF3OXOWE= - dependencies: - esutils "^2.0.2" - -dom-align@^1.7.0: - version "1.12.2" - resolved "https://registry.npmmirror.com/dom-align/download/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" - integrity sha1-D4Fk69DJwhsMeQMQSTzYVYkqzUs= - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/dom-converter/download/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g= - dependencies: - utila "~0.4" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.npmmirror.com/dom-serializer/download/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E= - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.npmmirror.com/dom-serializer/download/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha1-YgZDfTLO767HFhgDIwx6ILwbTZE= - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.npmmirror.com/domain-browser/download/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto= - -domelementtype@1, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.npmmirror.com/domelementtype/download/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8= - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/domelementtype/download/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc= - -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/domexception/download/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha1-k3RCZEymoxJh7zbj7Gd/6AVYLJA= - dependencies: - webidl-conversions "^4.0.2" - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.npmmirror.com/domhandler/download/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha1-iAUJfpM9ZehVRvcm1g9euItE+AM= - dependencies: - domelementtype "1" - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/domhandler/download/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" - integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== - dependencies: - domelementtype "^2.2.0" - -domutils@^1.5.1, domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.npmmirror.com/domutils/download/domutils-1.7.0.tgz?cache=0&sync_timestamp=1630106606599&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.npmmirror.com/domutils/download/domutils-2.8.0.tgz?cache=0&sync_timestamp=1630106606599&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU= - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/dot-case/download/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha1-mytnDQCkMWZ6inW6Kc0bmICc51E= - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/dot-prop/download/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog= - dependencies: - is-obj "^2.0.0" - -dotenv-expand@5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/dotenv-expand/download/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" - integrity sha1-P7rwIL/XlIhAcuomsel5HUWmKfA= - -dotenv@8.2.0: - version "8.2.0" - resolved "https://registry.npmmirror.com/dotenv/download/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== - -duplexer@^0.1.1: - version "0.1.2" - resolved "https://registry.npmmirror.com/duplexer/download/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY= - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.npmmirror.com/duplexify/download/duplexify-3.7.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fduplexify%2Fdownload%2Fduplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk= - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.npmmirror.com/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.3.378, electron-to-chromium@^1.4.17: - version "1.4.56" - resolved "https://registry.npmmirror.com/electron-to-chromium/download/electron-to-chromium-1.4.56.tgz#f660fd2c6739b341d8922fe3a441a5a2804911a1" - integrity sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g== - -elliptic@^6.5.3, elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.npmmirror.com/elliptic/download/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha1-2jfOvTHnmhNn6UG1ku0fvr1Yq7s= - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^7.0.1, emoji-regex@^7.0.2: - version "7.0.3" - resolved "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc= - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/emojis-list/download/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/emojis-list/download/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha1-VXBmIEatKeLpFucariYKvf9Pang= - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmmirror.com/end-of-stream/download/end-of-stream-1.4.4.tgz?cache=0&sync_timestamp=1624607958717&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fend-of-stream%2Fdownload%2Fend-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha1-WuZKX0UFe682JuwU2gyl5LJDHrA= - dependencies: - once "^1.4.0" - -enhanced-resolve@^4.1.0: - version "4.5.0" - resolved "https://registry.npmmirror.com/enhanced-resolve/download/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha1-Lzz9hNvjtIfxjy2y7x4GSlccpew= - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.npmmirror.com/entities/download/entities-1.1.2.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha1-vfpzUplmTfr9NFKe1PhSKidf6lY= - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU= - -errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: - version "0.1.8" - resolved "https://registry.npmmirror.com/errno/download/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8= - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmmirror.com/error-ex/download/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: - version "1.19.1" - resolved "https://registry.npmmirror.com/es-abstract/download/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha1-1IhXlodpFpWd547aoN9FZicRXsM= - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/es-to-primitive/download/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo= - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@~0.10.14: - version "0.10.63" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.63.tgz#9c222a63b6a332ac80b1e373b426af723b895bd6" - integrity sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - esniff "^2.0.1" - next-tick "^1.1.0" - -es6-iterator@2.0.3, es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/es6-iterator/download/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.npmmirror.com/es6-symbol/download/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha1-utXTwbzawoJp9MszHkMceKxwXRg= - dependencies: - d "^1.0.1" - ext "^1.1.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/escalade/download/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA= - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/escape-string-regexp/download/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha1-owME6Z2qMuI7L9IPUbq9B8/8o0Q= - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escodegen@^1.11.0, escodegen@^1.9.1: - version "1.14.3" - resolved "https://registry.npmmirror.com/escodegen/download/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha1-TnuB+6YVgdyXWC7XjKt/Do1j9QM= - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-react-app@^5.2.1: - version "5.2.1" - resolved "https://registry.npmmirror.com/eslint-config-react-app/download/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df" - integrity sha1-aYv3ru4n8M6gE56u8mHHv33WI98= - dependencies: - confusing-browser-globals "^1.0.9" - -eslint-import-resolver-node@^0.3.2: - version "0.3.6" - resolved "https://registry.npmmirror.com/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha1-QEi5WDldqJZoJSAB29nsprg7rL0= - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-loader@3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/eslint-loader/download/eslint-loader-3.0.3.tgz#e018e3d2722381d982b1201adb56819c73b480ca" - integrity sha1-4Bjj0nIjgdmCsSAa21aBnHO0gMo= - dependencies: - fs-extra "^8.1.0" - loader-fs-cache "^1.0.2" - loader-utils "^1.2.3" - object-hash "^2.0.1" - schema-utils "^2.6.1" - -eslint-module-utils@^2.4.1: - version "2.7.3" - resolved "https://registry.npmmirror.com/eslint-module-utils/download/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== - dependencies: - debug "^3.2.7" - find-up "^2.1.0" - -eslint-plugin-flowtype@4.6.0: - version "4.6.0" - resolved "https://registry.npmmirror.com/eslint-plugin-flowtype/download/eslint-plugin-flowtype-4.6.0.tgz#82b2bd6f21770e0e5deede0228e456cb35308451" - integrity sha1-grK9byF3Dg5d7t4CKORWyzUwhFE= - dependencies: - lodash "^4.17.15" - -eslint-plugin-import@2.20.1: - version "2.20.1" - resolved "https://registry.npmmirror.com/eslint-plugin-import/download/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3" - integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw== - dependencies: - array-includes "^3.0.3" - array.prototype.flat "^1.2.1" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.1" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.0" - read-pkg-up "^2.0.0" - resolve "^1.12.0" - -eslint-plugin-jsx-a11y@6.2.3: - version "6.2.3" - resolved "https://registry.npmmirror.com/eslint-plugin-jsx-a11y/download/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" - integrity sha1-uHKgnV3lGvcKl9se6n3JMwQ3CKo= - dependencies: - "@babel/runtime" "^7.4.5" - aria-query "^3.0.0" - array-includes "^3.0.3" - ast-types-flow "^0.0.7" - axobject-query "^2.0.2" - damerau-levenshtein "^1.0.4" - emoji-regex "^7.0.2" - has "^1.0.3" - jsx-ast-utils "^2.2.1" - -eslint-plugin-react-hooks@^1.6.1: - version "1.7.0" - resolved "https://registry.npmmirror.com/eslint-plugin-react-hooks/download/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04" - integrity sha1-YhC21aNyBfC5KFj4laToJwIKfQQ= - -eslint-plugin-react@7.19.0: - version "7.19.0" - resolved "https://registry.npmmirror.com/eslint-plugin-react/download/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666" - integrity sha1-bQj5ZzYoqmnFVZ0zSJ6FXYNVFmY= - dependencies: - array-includes "^3.1.1" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.2.3" - object.entries "^1.1.1" - object.fromentries "^2.0.2" - object.values "^1.1.1" - prop-types "^15.7.2" - resolve "^1.15.1" - semver "^6.3.0" - string.prototype.matchall "^4.0.2" - xregexp "^4.3.0" - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.npmmirror.com/eslint-scope/download/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha1-ygODMxD2iJoyZHgaqC5j65z+eEg= - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^5.0.0: - version "5.1.1" - resolved "https://registry.npmmirror.com/eslint-scope/download/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw= - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.npmmirror.com/eslint-utils/download/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha1-dP7HxU0Hdrb2fgJRBAtYBlZOmB8= - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/eslint-utils/download/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc= - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha1-MOvR73wv3/AcOk8VEESvJfqwUj4= - -eslint@^6.6.0: - version "6.8.0" - resolved "https://registry.npmmirror.com/eslint/download/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -esniff@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" - integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== - dependencies: - d "^1.0.1" - es5-ext "^0.10.62" - event-emitter "^0.3.5" - type "^2.7.2" - -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.npmmirror.com/espree/download/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o= - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/esprima/download/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= - -esquery@^1.0.1: - version "1.4.0" - resolved "https://registry.npmmirror.com/esquery/download/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha1-IUj/w4uC6McFff7UhCWz5h8PJKU= - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.1.0, esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/esrecurse/download/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha1-eteWTWeauyi+5yzsY3WLHF0smSE= - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/estraverse/download/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/estraverse/download/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha1-LupSkHAvJquP5TcDcP+GyWXSESM= - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmmirror.com/esutils/download/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q= - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== - dependencies: - d "1" - es5-ext "~0.10.14" - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.npmmirror.com/eventemitter3/download/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/events/download/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA= - -eventsource@^1.0.7: - version "1.1.0" - resolved "https://registry.npmmirror.com/eventsource/download/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" - integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== - dependencies: - original "^1.0.0" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI= - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.npmmirror.com/exec-sh/download/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha1-/yZPnjJVGaYMteJzaSlDSDzKY7w= - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/execa/download/execa-1.0.0.tgz?cache=0&sync_timestamp=1637147199964&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fexeca%2Fdownload%2Fexeca-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg= - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execall@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/execall/download/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" - integrity sha1-FqBrX+UJnffQC+XZwG7s3tFmO0U= - dependencies: - clone-regexp "^2.1.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.npmmirror.com/exit/download/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.npmmirror.com/expand-brackets/download/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/expect/download/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" - integrity sha1-t1FltIFwdPpKFXeU9G/p8boVtso= - dependencies: - "@jest/types" "^24.9.0" - ansi-styles "^3.2.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.9.0" - -express@^4.17.1: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.2" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.6.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.npmmirror.com/ext/download/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha1-OHHVBkHodMwXLitT+RmELRnbTFI= - dependencies: - type "^2.5.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/extend-shallow/download/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/extend-shallow/download/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0, extend@~3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.npmmirror.com/external-editor/download/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha1-ywP3QL764D6k0oPK7SdBqD8zVJU= - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/extglob/download/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM= - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/extsprintf/download/extsprintf-1.3.0.tgz?cache=0&sync_timestamp=1635889863507&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fextsprintf%2Fdownload%2Fextsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.npmmirror.com/extsprintf/download/extsprintf-1.4.1.tgz?cache=0&sync_timestamp=1635889863507&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fextsprintf%2Fdownload%2Fextsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha1-jRcsBkhn8jXAyEpZaAbSeb9LzAc= - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.npmmirror.com/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU= - -fast-glob@^2.0.2: - version "2.2.7" - resolved "https://registry.npmmirror.com/fast-glob/download/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha1-aVOFfDr6R1//ku5gFdUtpwpM050= - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-glob@^3.2.5, fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.npmmirror.com/fast-glob/download/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.npmmirror.com/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.npmmirror.com/fastest-levenshtein/download/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha1-mZD306iMxan/0fF0V0UlFwDUl+I= - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.npmmirror.com/fastq/download/fastq-1.13.0.tgz?cache=0&sync_timestamp=1631609698424&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffastq%2Fdownload%2Ffastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha1-YWdg+Ip1Jr38WWt8q4wYk4w2uYw= - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.npmmirror.com/faye-websocket/download/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@~0.11.1: - version "0.11.4" - resolved "https://registry.npmmirror.com/faye-websocket/download/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha1-fw2Sdc/dhqHJY9yLZfzEUe3Lsdo= - dependencies: - websocket-driver ">=0.5.1" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/fb-watchman/download/fb-watchman-2.0.1.tgz?cache=0&sync_timestamp=1624607942135&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffb-watchman%2Fdownload%2Ffb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha1-/IT7OdJwnPP/bXQ3BhV7tXCKioU= - dependencies: - bser "2.1.1" - -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/fbemitter/download/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" - integrity sha1-ALKhr1QRJUqrQWzXX55iib7kv/M= - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/fbjs-css-vars/download/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha1-IWVRE2rgL+JVkyw+yHdfGOLAeLg= - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.2" - resolved "https://registry.npmmirror.com/fbjs/download/fbjs-3.0.2.tgz#dfae08a85c66a58372993ce2caf30863f569ff94" - integrity sha512-qv+boqYndjElAJHNN3NoM8XuwQZ1j2m3kEvTgdle8IDjr6oUbkEpvABWtj/rQl3vq4ew7dnElBxL4YJAwTVqQQ== - dependencies: - cross-fetch "^3.0.4" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.30" - -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.npmmirror.com/figgy-pudding/download/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4= - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/figures/download/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8= - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/file-entry-cache/download/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w= - dependencies: - flat-cache "^2.0.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/file-entry-cache/download/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha1-IRst2WWcsDlLBz5zI6w8kz1SICc= - dependencies: - flat-cache "^3.0.4" - -file-loader@4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/file-loader/download/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" - integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== - dependencies: - loader-utils "^1.2.3" - schema-utils "^2.5.0" - -file-saver@^2.0.2: - version "2.0.5" - resolved "https://registry.npmmirror.com/file-saver/download/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" - integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90= - -filesize@6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/filesize/download/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" - integrity sha1-+FC1CZCcfIb35FDqGQBsMcLtPS8= - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/fill-range/download/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha1-GRmmp8df44ssfHflGYU12prN2kA= - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.npmmirror.com/find-cache-dir/download/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/find-cache-dir/download/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc= - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-cache-dir@^3.2.0: - version "3.3.2" - resolved "https://registry.npmmirror.com/find-cache-dir/download/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha1-swxbbv8HMHMa6pu9nb7L2AJW1ks= - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/find-up/download/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.npmmirror.com/find-up/download/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/find-up/download/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/find-up/download/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha1-SRafHXmTQwZG2mHsxa41XCHJe3M= - dependencies: - locate-path "^3.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/flat-cache/download/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA= - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/flat-cache/download/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE= - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.npmmirror.com/flatted/download/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha1-RXWyHivO50NKqb5mL0t7X5wrUTg= - -flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.npmmirror.com/flatted/download/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/flatten/download/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha1-wSg6yfJ7Noq8HjbR/3sEUBowNWs= - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.npmmirror.com/flush-write-stream/download/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug= - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -flux@^4.0.1: - version "4.0.3" - resolved "https://registry.npmmirror.com/flux/download/flux-4.0.3.tgz#573b504a24982c4768fdfb59d8d2ea5637d72ee7" - integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" - -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.npmmirror.com/follow-redirects/download/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio= - dependencies: - debug "=3.1.0" - -follow-redirects@^1.0.0: - version "1.14.7" - resolved "https://registry.npmmirror.com/follow-redirects/download/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" - integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmmirror.com/for-each/download/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha1-abRH6IoKXTLD5whPPxcQA0shN24= - dependencies: - is-callable "^1.1.3" - -for-in@^0.1.3: - version "0.1.8" - resolved "https://registry.npmmirror.com/for-in/download/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" - integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/for-in/download/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^0.1.3: - version "0.1.5" - resolved "https://registry.npmmirror.com/for-own/download/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.npmmirror.com/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -fork-ts-checker-webpack-plugin@3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/fork-ts-checker-webpack-plugin/download/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" - integrity sha1-oWQsDT5l9QwswXQunAqA9EH4axk= - dependencies: - babel-code-frame "^6.22.0" - chalk "^2.4.1" - chokidar "^3.3.0" - micromatch "^3.1.10" - minimatch "^3.0.4" - semver "^5.6.0" - tapable "^1.0.0" - worker-rpc "^0.1.0" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.npmmirror.com/form-data/download/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.npmmirror.com/fragment-cache/download/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -framer-motion@^2.1.2: - version "2.9.5" - resolved "https://registry.npmmirror.com/framer-motion/download/framer-motion-2.9.5.tgz#bbb185325d531c57f494cf3f6cf7719fc2c225c7" - integrity sha1-u7GFMl1THFf0lM8/bPdxn8LCJcc= - dependencies: - framesync "^4.1.0" - hey-listen "^1.0.8" - popmotion "9.0.0-rc.20" - style-value-types "^3.1.9" - tslib "^1.10.0" - optionalDependencies: - "@emotion/is-prop-valid" "^0.8.2" - -framesync@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/framesync/download/framesync-4.1.0.tgz#69a8db3ca432dc70d6a76ba882684a1497ef068a" - integrity sha1-aajbPKQy3HDWp2uogmhKFJfvBoo= - dependencies: - hey-listen "^1.0.5" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/from2/download/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-extra@^4.0.2: - version "4.0.3" - resolved "https://registry.npmmirror.com/fs-extra/download/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^7.0.0: - version "7.0.1" - resolved "https://registry.npmmirror.com/fs-extra/download/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha1-TxicRKoSO4lfcigE9V6iPq3DSOk= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.npmmirror.com/fs-extra/download/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA= - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/fs-minipass/download/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs= - dependencies: - minipass "^3.0.0" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.npmmirror.com/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/fsevents/download/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha1-TAofs0vGjlQ7S4Kp7Dkr+9qECAU= - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.npmmirror.com/fsevents/download/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg= - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmmirror.com/fsevents/download/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro= - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmmirror.com/gensync/download/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA= - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.npmmirror.com/get-caller-file/download/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o= - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.npmmirror.com/get-caller-file/download/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= - -get-intrinsic@^1.0.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y= - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.npmmirror.com/get-own-enumerable-property-symbols/download/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" - integrity sha1-tf3nfyLL4185C04ImSLFC85u9mQ= - -get-stdin@^8.0.0: - version "8.0.0" - resolved "https://registry.npmmirror.com/get-stdin/download/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" - integrity sha1-y61qc/63X27rIrqeAfiaooqpelM= - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/get-stream/download/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha1-wbJVV189wh1Zv8ec09K0axw6VLU= - dependencies: - pump "^3.0.0" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/get-symbol-description/download/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha1-f9uByQAQH71WTdXxowr1qtweWNY= - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.npmmirror.com/get-value/download/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.npmmirror.com/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/glob-parent/download/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ= - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.0" - resolved "https://registry.npmmirror.com/glob/download/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - 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" - -global-modules@2.0.0, global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/global-modules/download/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha1-mXYFrSNF8n9RU5vqJldEISFcd4A= - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/global-prefix/download/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha1-/IX3MGTfafUEIfR/iD/luRO6m5c= - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmmirror.com/globals/download/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4= - -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.npmmirror.com/globals/download/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha1-oYgTV2pBsAokqX5/gVkYwuGZJfg= - dependencies: - type-fest "^0.8.1" - -globby@8.0.2: - version "8.0.2" - resolved "https://registry.npmmirror.com/globby/download/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" - integrity sha1-VpdhnM2VxSdduy1vqkIIfBqUHY0= - dependencies: - array-union "^1.0.1" - dir-glob "2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -globby@^11.0.3: - version "11.1.0" - resolved "https://registry.npmmirror.com/globby/download/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/globby/download/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globjoin@^0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/globjoin/download/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" - integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= - -gonzales-pe@^4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/gonzales-pe/download/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" - integrity sha1-/p3sXzxVfurQn/hoxlgmvlTQZ7M= - dependencies: - minimist "^1.2.5" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.9" - resolved "https://registry.npmmirror.com/graceful-fs/download/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/growly/download/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/gud/download/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - integrity sha1-pIlYGxfmpwvsqavjrlfeekmYUsA= - -gzip-size@5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/gzip-size/download/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" - integrity sha1-y5vuaS+HwGErIyhAqHOQTkwTUnQ= - dependencies: - duplexer "^0.1.1" - pify "^4.0.1" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/handle-thing/download/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha1-hX95zjWVgMNA1DCBzGSJcNC7I04= - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.npmmirror.com/har-validator/download/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha1-HwgDufjLIMD6E4It8ezds2veHv0= - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/hard-rejection/download/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha1-HG7aXBaFxjlCdm15u0Cudzzs2IM= - -harmony-reflect@^1.4.6: - version "1.6.2" - resolved "https://registry.npmmirror.com/harmony-reflect/download/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" - integrity sha1-Mey9MuZIo00DDYattn1NR1R/5xA= - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/has-ansi/download/has-ansi-2.0.0.tgz?cache=0&sync_timestamp=1631558652943&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-ansi%2Fdownload%2Fhas-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/has-bigints/download/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM= - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/has-flag/download/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= - -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/has-symbols/download/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM= - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU= - dependencies: - has-symbols "^1.0.2" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.npmmirror.com/has-value/download/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/has-value/download/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/has-values/download/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/has-values/download/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.0, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/hash-base/download/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha1-VcOB2eBuHSmXqIO0o/3f5/DTrzM= - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.npmmirror.com/hash.js/download/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I= - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/he/download/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha1-hK5l+n6vsWX922FWauFLrwVmTw8= - -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/hex-color-regex/download/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4= - -hey-listen@^1.0.5, hey-listen@^1.0.8: - version "1.0.8" - resolved "https://registry.npmmirror.com/hey-listen/download/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" - integrity sha1-jllWH/ckkI3hqpJO1uzISlapqmg= - -highlight-words-core@^1.2.0: - version "1.2.2" - resolved "https://registry.npmmirror.com/highlight-words-core/download/highlight-words-core-1.2.2.tgz#1eff6d7d9f0a22f155042a00791237791b1eeaaa" - integrity sha1-Hv9tfZ8KIvFVBCoAeRI3eRse6qo= - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/hmac-drbg/download/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.3.0: - version "3.3.2" - resolved "https://registry.npmmirror.com/hoist-non-react-statics/download/hoist-non-react-statics-3.3.2.tgz?cache=0&sync_timestamp=1627566706387&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhoist-non-react-statics%2Fdownload%2Fhoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha1-7OCsr3HWLClpwuxZ/v9CpLGoW0U= - dependencies: - react-is "^16.7.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.npmmirror.com/hosted-git-info/download/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k= - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.npmmirror.com/hosted-git-info/download/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmmirror.com/hpack.js/download/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/hsl-regex/download/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/hsla-regex/download/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/html-encoding-sniffer/download/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg= - dependencies: - whatwg-encoding "^1.0.1" - -html-entities@^1.2.1: - version "1.4.0" - resolved "https://registry.npmmirror.com/html-entities/download/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha1-z70bAdKvr5rcobEK59/6uYxx0tw= - -html-escaper@^2.0.0, html-escaper@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/html-escaper/download/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha1-39YAJ9o2o238viNiYsAKWCJoFFM= - -html-minifier-terser@^5.0.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/html-minifier-terser/download/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" - integrity sha1-ki6W8fO7YIMsJjS3mIQJY4mx8FQ= - dependencies: - camel-case "^4.1.1" - clean-css "^4.2.3" - commander "^4.1.1" - he "^1.2.0" - param-case "^3.0.3" - relateurl "^0.2.7" - terser "^4.6.3" - -html-parse-stringify@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/html-parse-stringify/download/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" - integrity sha1-38EBc0fOn3fIFBpQfyMwQMWcVdI= - dependencies: - void-elements "3.1.0" - -html-tags@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/html-tags/download/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" - integrity sha1-e15vfmZen7QfMAB+2eDUHpf7IUA= - -html-webpack-plugin@4.0.0-beta.11: - version "4.0.0-beta.11" - resolved "https://registry.npmmirror.com/html-webpack-plugin/download/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715" - integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg== - dependencies: - html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" - lodash "^4.17.15" - pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" - -htmlparser2@^3.10.0: - version "3.10.1" - resolved "https://registry.npmmirror.com/htmlparser2/download/htmlparser2-3.10.1.tgz?cache=0&sync_timestamp=1636640945377&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha1-vWedw/WYl7ajS7EHSchVu1OpOS8= - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/htmlparser2/download/htmlparser2-6.1.0.tgz?cache=0&sync_timestamp=1636640945377&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha1-xNditsM3GgXb5l6UrkOp+EX7j7c= - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.npmmirror.com/http-deceiver/download/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmmirror.com/http-errors/download/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.5" - resolved "https://registry.npmmirror.com/http-parser-js/download/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" - integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== - -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.npmmirror.com/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== - dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" - -http-proxy@^1.17.0: - version "1.18.1" - resolved "https://registry.npmmirror.com/http-proxy/download/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk= - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/http-signature/download/http-signature-1.2.0.tgz?cache=0&sync_timestamp=1637178703812&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/https-browserify/download/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -i18next@^19.5.3: - version "19.9.2" - resolved "https://registry.npmmirror.com/i18next/download/i18next-19.9.2.tgz#ea5a124416e3c5ab85fddca2c8e3c3669a8da397" - integrity sha1-6loSRBbjxauF/dyiyOPDZpqNo5c= - dependencies: - "@babel/runtime" "^7.12.0" - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.npmmirror.com/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/icss-utils/download/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha1-IRcLU3ie4nRHwvR91oMIFAP5pGc= - dependencies: - postcss "^7.0.14" - -identity-obj-proxy@3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/identity-obj-proxy/download/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" - integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= - dependencies: - harmony-reflect "^1.4.6" - -ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.npmmirror.com/ieee754/download/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I= - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.npmmirror.com/iferr/download/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.npmmirror.com/ignore/download/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.npmmirror.com/ignore/download/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.8, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/ignore/download/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.npmmirror.com/image-size/download/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= - -immer@1.10.0: - version "1.10.0" - resolved "https://registry.npmmirror.com/immer/download/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" - integrity sha1-utZ2BbqcgQJ12R4cKkfUWC6YKG0= - -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/import-cwd/download/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= - dependencies: - import-from "^2.1.0" - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/import-fresh/download/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmmirror.com/import-fresh/download/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha1-NxYsJfy566oublPVtNiM4X2eDCs= - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/import-from/download/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= - dependencies: - resolve-from "^3.0.0" - -import-lazy@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/import-lazy/download/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" - integrity sha1-6OtidIOgpD2jwD8+NVSL5csMwVM= - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/import-local/download/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha1-VQcL44pZk88Y72236WH1vuXFoJ0= - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/imurmurhash/download/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/indent-string/download/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE= - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/indexes-of/download/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -infer-owner@^1.0.3, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/infer-owner/download/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha1-xM78qo5RBRwqQLos6KPScpWvlGc= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmmirror.com/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmmirror.com/inherits/download/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/inherits/download/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.5: - version "1.3.8" - resolved "https://registry.npmmirror.com/ini/download/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw= - -inquirer@7.0.4: - version "7.0.4" - resolved "https://registry.npmmirror.com/inquirer/download/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" - integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.npmmirror.com/inquirer/download/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/internal-ip/download/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc= - dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/internal-slot/download/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha1-c0fjB97uovqsKsYgXUvH00ln9Zw= - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.npmmirror.com/invariant/download/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY= - dependencies: - loose-envify "^1.0.0" - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/invert-kv/download/invert-kv-2.0.0.tgz?cache=0&sync_timestamp=1630996775723&other_urls=https%3A%2F%2Fregistry.nlark.com%2Finvert-kv%2Fdownload%2Finvert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI= - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/ip-regex/download/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -ip@^1.1.0, ip@^1.1.5: - version "1.1.9" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396" - integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ== - -ipaddr.js@1.9.1, ipaddr.js@^1.9.0: - version "1.9.1" - resolved "https://registry.npmmirror.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha1-v/OFQ+64mEglB5/zoqjmy9RngbM= - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-absolute-url/download/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/is-absolute-url/download/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg= - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.npmmirror.com/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= - dependencies: - kind-of "^6.0.0" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-alphabetical/download/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha1-nn1rlJFr4iFTdF0YTCmMv5hqaG0= - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-alphanumerical/download/is-alphanumerical-1.0.4.tgz?cache=0&sync_timestamp=1636009291782&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-alphanumerical%2Fdownload%2Fis-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha1-frmiQx+FX2se8aeOMm31FWlsTb8= - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.npmmirror.com/is-arguments/download/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps= - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmmirror.com/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.npmmirror.com/is-arrayish/download/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha1-RXSirlb3qyBolvtDHq7tBm/fjwM= - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-bigint/download/is-bigint-1.0.4.tgz?cache=0&sync_timestamp=1628747500062&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-bigint%2Fdownload%2Fis-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM= - dependencies: - has-bigints "^1.0.1" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/is-binary-path/download/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-binary-path/download/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk= - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmmirror.com/is-boolean-object/download/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk= - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.0.2, is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.npmmirror.com/is-buffer/download/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha1-76ouqdqg16suoTqXsritUf776L4= - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.npmmirror.com/is-buffer/download/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha1-68JS5ADSL/jXf6CYiIIaJKZYwZE= - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.npmmirror.com/is-callable/download/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU= - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/is-ci/download/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha1-a8YzQYGBDgS1wis9WJ/cpVAmQEw= - dependencies: - ci-info "^2.0.0" - -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/is-color-stop/download/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - -is-core-module@^2.5.0, is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.npmmirror.com/is-core-module/download/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc= - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.npmmirror.com/is-date-object/download/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8= - dependencies: - has-tostringtag "^1.0.0" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-decimal/download/is-decimal-1.0.4.tgz?cache=0&sync_timestamp=1636008960795&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-decimal%2Fdownload%2Fis-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha1-ZaOllYocW2OnBuGzM9fNn2MNP6U= - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.npmmirror.com/is-descriptor/download/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/is-descriptor/download/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.npmmirror.com/is-directory/download/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.npmmirror.com/is-docker/download/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao= - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.npmmirror.com/is-extendable/download/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/is-extendable/download/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ= - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0= - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-generator-fn/download/is-generator-fn-2.1.0.tgz?cache=0&sync_timestamp=1628686122487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-generator-fn%2Fdownload%2Fis-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha1-fRQK3DiarzARqPKipM+m+q3/sRg= - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/is-glob/download/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmmirror.com/is-glob/download/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ= - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-hexadecimal/download/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha1-zDXJdYjaS9Saju3WvECC1E3LI6c= - -is-negative-zero@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/is-negative-zero/download/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.npmmirror.com/is-number-object/download/is-number-object-1.0.6.tgz?cache=0&sync_timestamp=1628221744591&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-number-object%2Fdownload%2Fis-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha1-anqvg4x/BoalC0VT9+VKlklOifA= - dependencies: - has-tostringtag "^1.0.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-number/download/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/is-obj/download/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/is-obj/download/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI= - -is-path-cwd@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/is-path-cwd/download/is-path-cwd-2.2.0.tgz?cache=0&sync_timestamp=1628686723402&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-cwd%2Fdownload%2Fis-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s= - -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-path-in-cwd/download/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha1-v+Lcomxp85cmWkAJljYCk1oFOss= - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-path-inside/download/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha1-fJgQWH1lmkDSe8201WFuqwWUlLI= - dependencies: - path-is-inside "^1.0.2" - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/is-plain-obj/download/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-plain-obj/download/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha1-ReQuN/zPH0Dajl927iFRWEDAkoc= - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/is-plain-object/download/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= - dependencies: - isobject "^3.0.1" - -is-regex@^1.0.4, is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/is-regex/download/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg= - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-regexp/download/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= - -is-regexp@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-regexp/download/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" - integrity sha1-zXNKVoZOI7lWv058ZsOWpMCyLC0= - -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/is-resolvable/download/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg= - -is-root@2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-root/download/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha1-gJ4YEpzxEpZEMCpPhUQDXVGYSpw= - -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/is-shared-array-buffer/download/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha1-l7DIX72stZycRG/mU7gs8rW3z+Y= - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/is-stream/download/is-stream-1.1.0.tgz?cache=0&sync_timestamp=1628592752355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-stream%2Fdownload%2Fis-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmmirror.com/is-string/download/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0= - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-symbol/download/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha1-ptrJO2NbBjymhyI23oiRClevE5w= - dependencies: - has-symbols "^1.0.2" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/is-unicode-supported/download/is-unicode-supported-0.1.0.tgz?cache=0&sync_timestamp=1625294654260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-unicode-supported%2Fdownload%2Fis-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc= - -is-weakref@^1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/is-weakref/download/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-what@^3.14.1: - version "3.14.1" - resolved "https://registry.npmmirror.com/is-what/download/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" - integrity sha1-4SIvRt3ahd6tD9HJ3xMXYOd3VcE= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/is-windows/download/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/is-wsl/download/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -is-wsl@^2.1.1: - version "2.2.0" - resolved "https://registry.npmmirror.com/is-wsl/download/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE= - dependencies: - is-docker "^2.0.0" - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/isobject/download/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/isobject/download/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.npmmirror.com/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.npmmirror.com/istanbul-lib-coverage/download/istanbul-lib-coverage-2.0.5.tgz?cache=0&sync_timestamp=1634527209200&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fistanbul-lib-coverage%2Fdownload%2Fistanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha1-Z18KtpUD+tSx2En3NrqsqAM0T0k= - -istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/istanbul-lib-instrument/download/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha1-pfY9kfC7wMPkee9MXeAnM17G1jA= - dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" - -istanbul-lib-report@^2.0.4: - version "2.0.8" - resolved "https://registry.npmmirror.com/istanbul-lib-report/download/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - integrity sha1-WoETzXRtQ8SInro2qxDn1QybTzM= - dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" - -istanbul-lib-source-maps@^3.0.1: - version "3.0.6" - resolved "https://registry.npmmirror.com/istanbul-lib-source-maps/download/istanbul-lib-source-maps-3.0.6.tgz?cache=0&sync_timestamp=1634004113980&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fistanbul-lib-source-maps%2Fdownload%2Fistanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha1-KEmXxIIRdS7EhiU9qX44ed77qMg= - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" - source-map "^0.6.1" - -istanbul-reports@^2.2.6: - version "2.2.7" - resolved "https://registry.npmmirror.com/istanbul-reports/download/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" - integrity sha1-XZOfYjfXtIOTzAlZ6rQM1P0FaTE= - dependencies: - html-escaper "^2.0.0" - -jest-changed-files@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-changed-files/download/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" - integrity sha1-CNjBXreaf6P8mCabwUtFHugvgDk= - dependencies: - "@jest/types" "^24.9.0" - execa "^1.0.0" - throat "^4.0.0" - -jest-cli@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-cli/download/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" - integrity sha1-rS3mLQdHLUGcarwwH8QyuYsQ0q8= - dependencies: - "@jest/core" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - exit "^0.1.2" - import-local "^2.0.0" - is-ci "^2.0.0" - jest-config "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - prompts "^2.0.1" - realpath-native "^1.1.0" - yargs "^13.3.0" - -jest-config@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-config/download/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" - integrity sha1-+xu8YMc6Rq8DWQcZ76SCXm5N0bU= - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.9.0" - "@jest/types" "^24.9.0" - babel-jest "^24.9.0" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^24.9.0" - jest-environment-node "^24.9.0" - jest-get-type "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - micromatch "^3.1.10" - pretty-format "^24.9.0" - realpath-native "^1.1.0" - -jest-diff@*: - version "27.4.6" - resolved "https://registry.npmmirror.com/jest-diff/download/jest-diff-27.4.6.tgz#93815774d2012a2cbb6cf23f84d48c7a2618f98d" - integrity sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.4.0" - jest-get-type "^27.4.0" - pretty-format "^27.4.6" - -jest-diff@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-diff/download/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha1-kxt9DVd4obr3RSy4FuMl43JAVdo= - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-docblock@^24.3.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-docblock/download/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" - integrity sha1-eXAgGAK6Vg4cQJLMJcvt9a9ajOI= - dependencies: - detect-newline "^2.1.0" - -jest-each@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-each/download/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" - integrity sha1-6y2mAuKmEImNvF8fbfO6hrVfiwU= - dependencies: - "@jest/types" "^24.9.0" - chalk "^2.0.1" - jest-get-type "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - -jest-environment-jsdom-fourteen@1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/jest-environment-jsdom-fourteen/download/jest-environment-jsdom-fourteen-1.0.1.tgz#4cd0042f58b4ab666950d96532ecb2fc188f96fb" - integrity sha1-TNAEL1i0q2ZpUNllMuyy/BiPlvs= - dependencies: - "@jest/environment" "^24.3.0" - "@jest/fake-timers" "^24.3.0" - "@jest/types" "^24.3.0" - jest-mock "^24.0.0" - jest-util "^24.0.0" - jsdom "^14.1.0" - -jest-environment-jsdom@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-environment-jsdom/download/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" - integrity sha1-SwgGx/yU+V7bNpppzCd47sK3N1s= - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - jsdom "^11.5.1" - -jest-environment-node@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-environment-node/download/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" - integrity sha1-Mz0tJ5b5aH8q7r8HQrUZ8zwcv9M= - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-get-type/download/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha1-FoSgyKUPLkkBtmRK6GH1ee7S7w4= - -jest-get-type@^27.4.0: - version "27.4.0" - resolved "https://registry.npmmirror.com/jest-get-type/download/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5" - integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== - -jest-haste-map@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-haste-map/download/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" - integrity sha1-s4pdZCdJNOIfpBeump++t3zqrH0= - dependencies: - "@jest/types" "^24.9.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.9.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - -jest-jasmine2@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-jasmine2/download/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" - integrity sha1-H3sb0yQsF3TmKsq7NkbZavw75qA= - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^24.9.0" - is-generator-fn "^2.0.0" - jest-each "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - throat "^4.0.0" - -jest-leak-detector@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-leak-detector/download/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" - integrity sha1-tmXep8dxAMXE99/LFTtlzwfc+Wo= - dependencies: - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-matcher-utils@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-matcher-utils/download/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha1-9bNmHV5ijf/m3WUlHf2uDofDoHM= - dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-message-util/download/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha1-Un9UoeOA9eICqNEUmw7IcvQxGeM= - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-mock@^24.0.0, jest-mock@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-mock/download/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" - integrity sha1-wig1VB7jebkIZzrVEIeiGFwT8cY= - dependencies: - "@jest/types" "^24.9.0" - -jest-pnp-resolver@^1.2.1: - version "1.2.2" - resolved "https://registry.npmmirror.com/jest-pnp-resolver/download/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha1-twSsCuAoqJEIpNBAs/kZ393I4zw= - -jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-regex-util/download/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" - integrity sha1-wT+zOAveIr9ldUMsST6o/jeWVjY= - -jest-resolve-dependencies@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-resolve-dependencies/download/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" - integrity sha1-rQVRmJWcTPuopPBmxnOj8HhlB6s= - dependencies: - "@jest/types" "^24.9.0" - jest-regex-util "^24.3.0" - jest-snapshot "^24.9.0" - -jest-resolve@24.9.0, jest-resolve@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-resolve/download/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" - integrity sha1-3/BMdoevNMTdflJIktnPd+XRcyE= - dependencies: - "@jest/types" "^24.9.0" - browser-resolve "^1.11.3" - chalk "^2.0.1" - jest-pnp-resolver "^1.2.1" - realpath-native "^1.1.0" - -jest-runner@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-runner/download/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" - integrity sha1-V0+v29VEVcKzS0vfQ2WiOFf830I= - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.4.2" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-docblock "^24.3.0" - jest-haste-map "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-leak-detector "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - source-map-support "^0.5.6" - throat "^4.0.0" - -jest-runtime@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-runtime/download/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" - integrity sha1-nxRYOvak9zFKap2fAibhp4HI5Kw= - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - realpath-native "^1.1.0" - slash "^2.0.0" - strip-bom "^3.0.0" - yargs "^13.3.0" - -jest-serializer@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-serializer/download/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" - integrity sha1-5tfX75bTHouQeacUdUxdXFgojnM= - -jest-snapshot@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-snapshot/download/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" - integrity sha1-7I6cpPLsDFyHro+SXPl0l7DpUbo= - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - expect "^24.9.0" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^24.9.0" - semver "^6.2.0" - -jest-util@^24.0.0, jest-util@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-util/download/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" - integrity sha1-c5aBTkhTbS6Fo33j5MQx18sUAWI= - dependencies: - "@jest/console" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/source-map" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - -jest-validate@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-validate/download/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" - integrity sha1-B3XFU2DRc82FTkAYB1bU/1Le+Ks= - dependencies: - "@jest/types" "^24.9.0" - camelcase "^5.3.1" - chalk "^2.0.1" - jest-get-type "^24.9.0" - leven "^3.1.0" - pretty-format "^24.9.0" - -jest-watch-typeahead@0.4.2: - version "0.4.2" - resolved "https://registry.npmmirror.com/jest-watch-typeahead/download/jest-watch-typeahead-0.4.2.tgz#e5be959698a7fa2302229a5082c488c3c8780a4a" - integrity sha1-5b6Vlpin+iMCIppQgsSIw8h4Cko= - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.1" - jest-regex-util "^24.9.0" - jest-watcher "^24.3.0" - slash "^3.0.0" - string-length "^3.1.0" - strip-ansi "^5.0.0" - -jest-watcher@^24.3.0, jest-watcher@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-watcher/download/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" - integrity sha1-S1bl0c7/AF9biOUo3Jr8jdTtKzs= - dependencies: - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - jest-util "^24.9.0" - string-length "^2.0.0" - -jest-worker@^24.6.0, jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest-worker/download/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha1-Xb/bWy0yLphWeJgjipaXvM5ns+U= - dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" - -jest-worker@^25.1.0: - version "25.5.0" - resolved "https://registry.npmmirror.com/jest-worker/download/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" - integrity sha1-JhHQcbec6g9D7lej0RhZOsFUfbE= - dependencies: - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest@24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/jest/download/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" - integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== - dependencies: - import-local "^2.0.0" - jest-cli "^24.9.0" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/js-tokens/download/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk= - -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/js-tokens/download/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmmirror.com/js-yaml/download/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.npmmirror.com/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^11.5.1: - version "11.12.0" - resolved "https://registry.npmmirror.com/jsdom/download/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== - dependencies: - abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" - domexception "^1.0.1" - escodegen "^1.9.1" - html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.4" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" - xml-name-validator "^3.0.0" - -jsdom@^14.1.0: - version "14.1.0" - resolved "https://registry.npmmirror.com/jsdom/download/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b" - integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== - dependencies: - abab "^2.0.0" - acorn "^6.0.4" - acorn-globals "^4.3.0" - array-equal "^1.0.0" - cssom "^0.3.4" - cssstyle "^1.1.1" - data-urls "^1.1.0" - domexception "^1.0.1" - escodegen "^1.11.0" - html-encoding-sniffer "^1.0.2" - nwsapi "^2.1.3" - parse5 "5.1.0" - pn "^1.1.0" - request "^2.88.0" - request-promise-native "^1.0.5" - saxes "^3.1.9" - symbol-tree "^3.2.2" - tough-cookie "^2.5.0" - w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.1.2" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^7.0.0" - ws "^6.1.2" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmmirror.com/jsesc/download/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q= - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.npmmirror.com/jsesc/download/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk= - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.npmmirror.com/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0= - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/json-schema-traverse/download/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha1-rnvLNlard6c7pcSb9lTzjmtoYOI= - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.npmmirror.com/json-schema/download/json-schema-0.4.0.tgz?cache=0&sync_timestamp=1636423476647&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjson-schema%2Fdownload%2Fjson-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json2mq@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/json2mq/download/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" - integrity sha1-tje9O6nqvhIsg+lyBIOusQ0skEo= - dependencies: - string-convert "^0.2.0" - -json3@^3.3.2: - version "3.3.3" - resolved "https://registry.npmmirror.com/json3/download/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E= - -json5@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.npmmirror.com/json5/download/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/jsonfile/download/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.npmmirror.com/jsonify/download/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.npmmirror.com/jsprim/download/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: - version "2.4.1" - resolved "https://registry.npmmirror.com/jsx-ast-utils/download/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" - integrity sha1-ERSkwSCUgdsGxpDCtPSIzGZfZX4= - dependencies: - array-includes "^3.1.1" - object.assign "^4.1.0" - -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/killable/download/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI= - -kind-of@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/kind-of/download/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" - integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= - dependencies: - is-buffer "^1.0.2" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.npmmirror.com/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/kind-of/download/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/kind-of/download/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha1-cpyR4thXt6QZofmqZWhcTDP1hF0= - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.npmmirror.com/kind-of/download/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/kleur/download/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha1-p5yezIbuHOP6YgbRIWxQHxR/wH4= - -known-css-properties@^0.21.0: - version "0.21.0" - resolved "https://registry.npmmirror.com/known-css-properties/download/known-css-properties-0.21.0.tgz#15fbd0bbb83447f3ce09d8af247ed47c68ede80d" - integrity sha1-FfvQu7g0R/POCdivJH7UfGjt6A0= - -last-call-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/last-call-webpack-plugin/download/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" - integrity sha1-l0LfDhDjz0blwDgcLekNOnotdVU= - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.0" - -lazy-cache@^0.2.3: - version "0.2.7" - resolved "https://registry.npmmirror.com/lazy-cache/download/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" - integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.npmmirror.com/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/lcid/download/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha1-bvXS32DlL4LrIopMNz6NHzlyU88= - dependencies: - invert-kv "^2.0.0" - -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/left-pad/download/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha1-W4o6d2Xf4AEmHd6RVYnngvjJTR4= - -less-loader@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/less-loader/download/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466" - integrity sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg== - dependencies: - clone "^2.1.1" - loader-utils "^1.1.0" - pify "^4.0.1" - -less@^3.11.3: - version "3.13.1" - resolved "https://registry.npmmirror.com/less/download/less-3.13.1.tgz#0ebc91d2a0e9c0c6735b83d496b0ab0583077909" - integrity sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw== - dependencies: - copy-anything "^2.0.1" - tslib "^1.10.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - native-request "^1.0.5" - source-map "~0.6.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/leven/download/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I= - -levenary@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/levenary/download/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" - integrity sha1-hCqe6Y0gdap/ru2+MmeekgX0b3c= - dependencies: - leven "^3.1.0" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/levn/download/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmmirror.com/lines-and-columns/download/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/load-json-file/download/load-json-file-2.0.0.tgz?cache=0&sync_timestamp=1631508607226&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fload-json-file%2Fdownload%2Fload-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/load-json-file/download/load-json-file-4.0.0.tgz?cache=0&sync_timestamp=1631508607226&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fload-json-file%2Fdownload%2Fload-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -loader-fs-cache@^1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/loader-fs-cache/download/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" - integrity sha1-8IZXZG1gcHi+LwoDL4vWndbyd9k= - dependencies: - find-cache-dir "^0.1.1" - mkdirp "^0.5.1" - -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.npmmirror.com/loader-runner/download/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c= - -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.npmmirror.com/loader-utils/download/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc= - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/loader-utils/download/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha1-xXm140yzSxp07cbB+za/o3HVphM= - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/locate-path/download/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/locate-path/download/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4= - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/locate-path/download/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= - dependencies: - p-locate "^4.1.0" - -lodash-es@^4.17.15: - version "4.17.21" - resolved "https://registry.npmmirror.com/lodash-es/download/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/lodash.curry/download/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" - integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmmirror.com/lodash.debounce/download/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash.flow@^3.3.0, lodash.flow@^3.5.0: - version "3.5.0" - resolved "https://registry.npmmirror.com/lodash.flow/download/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" - integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.npmmirror.com/lodash.memoize/download/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.npmmirror.com/lodash.sortby/download/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - -lodash.template@^4.4.0: - version "4.5.0" - resolved "https://registry.npmmirror.com/lodash.template/download/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha1-+XYZXPPzR9DV9SSDVp/oAxzM6Ks= - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/lodash.templatesettings/download/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha1-5IExDwSdPPbUfpEq0JMTsVTw+zM= - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.npmmirror.com/lodash.truncate/download/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.npmmirror.com/lodash.uniq/download/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5: - version "4.17.21" - resolved "https://registry.npmmirror.com/lodash/download/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/log-symbols/download/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha1-P727lbRoOsn8eFER55LlWNSr1QM= - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -loglevel@^1.6.6: - version "1.8.0" - resolved "https://registry.npmmirror.com/loglevel/download/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" - integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== - -longest-streak@^2.0.0: - version "2.0.4" - resolved "https://registry.npmmirror.com/longest-streak/download/longest-streak-2.0.4.tgz?cache=0&sync_timestamp=1636446222992&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flongest-streak%2Fdownload%2Flongest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" - integrity sha1-uFmZV9pbXatk3uP+MW+ndFl9kOQ= - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/loose-envify/download/loose-envify-1.4.0.tgz?cache=0&sync_timestamp=1627566748051&other_urls=https%3A%2F%2Fregistry.nlark.com%2Floose-envify%2Fdownload%2Floose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8= - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/lower-case/download/lower-case-2.0.2.tgz?cache=0&sync_timestamp=1624607698082&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flower-case%2Fdownload%2Flower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha1-b6I3xj29xKgsoP2ILkci3F5jTig= - dependencies: - tslib "^2.0.3" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/lru-cache/download/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA= - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/lru-cache/download/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ= - dependencies: - yallist "^4.0.0" - -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/make-dir/download/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU= - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.npmmirror.com/make-dir/download/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8= - dependencies: - semver "^6.0.0" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.npmmirror.com/makeerror/download/makeerror-1.0.12.tgz?cache=0&sync_timestamp=1635238315869&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmakeerror%2Fdownload%2Fmakeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha1-Pl3SB5qC6BLpg8xmEMSiyw6qgBo= - dependencies: - tmpl "1.0.5" - -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.npmmirror.com/mamacro/download/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha1-rSyVdhl8nxq/MI0Hh4Zb2XWj8+Q= - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.npmmirror.com/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo= - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.npmmirror.com/map-cache/download/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/map-obj/download/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha1-kwT5Buk/qucIgNoQKp8d8OqLsFo= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/map-visit/download/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -mathml-tag-names@^2.1.3: - version "2.1.3" - resolved "https://registry.npmmirror.com/mathml-tag-names/download/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" - integrity sha1-TdrdZzCOeAzxakdoWHjuJ7c2oKM= - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.npmmirror.com/md5.js/download/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdast-util-from-markdown@^0.8.0: - version "0.8.5" - resolved "https://registry.npmmirror.com/mdast-util-from-markdown/download/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" - integrity sha1-0e8spCvDd+ywRjqYeRDa6JvZoow= - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string "^2.0.0" - micromark "~2.11.0" - parse-entities "^2.0.0" - unist-util-stringify-position "^2.0.0" - -mdast-util-to-markdown@^0.6.0: - version "0.6.5" - resolved "https://registry.npmmirror.com/mdast-util-to-markdown/download/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" - integrity sha1-sz9nyoINaebMUnqT1AOSSbUEvr4= - dependencies: - "@types/unist" "^2.0.0" - longest-streak "^2.0.0" - mdast-util-to-string "^2.0.0" - parse-entities "^2.0.0" - repeat-string "^1.0.0" - zwitch "^1.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/mdast-util-to-string/download/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha1-uM/mpxPhCRy1tyj8SIhaR2f4uXs= - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.npmmirror.com/mdn-data/download/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA= - -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/mdn-data/download/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs= - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/mem/download/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha1-Rhr0l7xK4JYIzbLmDu+2m/90QXg= - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memoize-one@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/memoize-one/download/memoize-one-4.1.0.tgz#a2387c58c03fff27ca390c31b764a79addf3f906" - integrity sha1-ojh8WMA//yfKOQwxt2Snmt3z+QY= - -memoize-one@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/memoize-one/download/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" - integrity sha1-slkbhx7YKUiu5HJ9xqvO7qyMEEU= - -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/memory-fs/download/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.npmmirror.com/memory-fs/download/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.npmmirror.com/meow/download/meow-9.0.0.tgz?cache=0&sync_timestamp=1637477490247&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmeow%2Fdownload%2Fmeow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" - integrity sha1-zZUQvFysne59A8c+4fmtlZ9Oo2Q= - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-deep@^3.0.2: - version "3.0.3" - resolved "https://registry.npmmirror.com/merge-deep/download/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" - integrity sha1-Gisq6SbaiyrpOgrBXZDNGSJ2YAM= - dependencies: - arr-union "^3.1.0" - clone-deep "^0.2.4" - kind-of "^3.0.2" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/merge-stream/download/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A= - -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmmirror.com/merge2/download/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4= - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -microevent.ts@~0.1.1: - version "0.1.1" - resolved "https://registry.npmmirror.com/microevent.ts/download/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" - integrity sha1-cLCbg/Q99RctAgWmMCW84Pc1f6A= - -micromark@~2.11.0: - version "2.11.4" - resolved "https://registry.npmmirror.com/micromark/download/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" - integrity sha1-0TQ2E47qgmOD6CJEnJpcUO5EZlo= - dependencies: - debug "^4.0.0" - parse-entities "^2.0.0" - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.npmmirror.com/micromatch/download/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha1-cIWbyVyYQJUvNZoGij/En57PrCM= - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.npmmirror.com/micromatch/download/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k= - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.npmmirror.com/miller-rabin/download/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha1-8IA1HIZbDcViqEYpZtqlNUPHik0= - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": - version "1.51.0" - resolved "https://registry.npmmirror.com/mime-db/download/mime-db-1.51.0.tgz?cache=0&sync_timestamp=1636426033377&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmime-db%2Fdownload%2Fmime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19: - version "2.1.34" - resolved "https://registry.npmmirror.com/mime-types/download/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - -mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0, mime@^1.4.1: - version "1.6.0" - resolved "https://registry.npmmirror.com/mime/download/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= - -mime@^2.4.4: - version "2.6.0" - resolved "https://registry.npmmirror.com/mime/download/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha1-oqaCqVzU0MsdYlfij4PafjWAA2c= - -mimic-fn@^2.0.0, mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/mimic-fn/download/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/min-indent/download/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha1-pj9oFnOzBXH76LwlaGrnRu76mGk= - -mini-css-extract-plugin@0.9.0: - version "0.9.0" - resolved "https://registry.npmmirror.com/mini-css-extract-plugin/download/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" - integrity sha1-R/LPB6oWWrNXM7H8l9TEbAVkM54= - dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc= - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= - dependencies: - brace-expansion "^1.1.7" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/minimist-options/download/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha1-wGVXE8U6ii69d/+iR9NCxA8BBhk= - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/minipass-collect/download/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc= - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/minipass-flush/download/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M= - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.npmmirror.com/minipass-pipeline/download/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha1-aEcveXEcCEZXwGfFxq2Tzd6oIUw= - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.6" - resolved "https://registry.npmmirror.com/minipass/download/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== - dependencies: - yallist "^4.0.0" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/mississippi/download/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha1-6goykfl+C16HdrNj1fChLZTGcCI= - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.npmmirror.com/mixin-deep/download/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY= - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mixin-object@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/mixin-object/download/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" - integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= - dependencies: - for-in "^0.1.3" - is-extendable "^0.1.1" - -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.npmmirror.com/mkdirp/download/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8= - dependencies: - minimist "^1.2.5" - -mobx-react-lite@^2.2.0: - version "2.2.2" - resolved "https://registry.npmmirror.com/mobx-react-lite/download/mobx-react-lite-2.2.2.tgz#87c217dc72b4e47b22493daf155daf3759f868a6" - integrity sha1-h8IX3HK05HsiST2vFV2vN1n4aKY= - -mobx-react@^6.2.2: - version "6.3.1" - resolved "https://registry.npmmirror.com/mobx-react/download/mobx-react-6.3.1.tgz#204f9756e42e19d91cb6598837063b7e7de87c52" - integrity sha1-IE+XVuQuGdkctlmINwY7fn3ofFI= - dependencies: - mobx-react-lite "^2.2.0" - -mobx@^5.13.0: - version "5.15.7" - resolved "https://registry.npmmirror.com/mobx/download/mobx-5.15.7.tgz#b9a5f2b6251f5d96980d13c78e9b5d8d4ce22665" - integrity sha1-uaXytiUfXZaYDRPHjptdjUziJmU= - -moment@^2.24.0, moment@^2.25.3: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/move-concurrently/download/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk= - -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.npmmirror.com/ms/download/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha1-V0yBOM4dK1hh8LRFedut1gxmFbI= - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.npmmirror.com/multicast-dns/download/multicast-dns-6.2.3.tgz?cache=0&sync_timestamp=1633354996608&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmulticast-dns%2Fdownload%2Fmulticast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha1-oOx72QVcQoL3kMPIL04o2zsxsik= - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.npmmirror.com/mute-stream/download/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha1-FjDEKyJR/4HiooPelqVJfqkuXg0= - -nan@^2.12.1: - version "2.15.0" - resolved "https://registry.npmmirror.com/nan/download/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha1-PzSkc/8Y4VwbVia2KQO1rW5mX+4= - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.npmmirror.com/nanomatch/download/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk= - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -native-request@^1.0.5: - version "1.1.0" - resolved "https://registry.npmmirror.com/native-request/download/native-request-1.1.0.tgz#acdb30fe2eefa3e1bc8c54b3a6852e9c5c0d3cb0" - integrity sha1-rNsw/i7vo+G8jFSzpoUunFwNPLA= - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/natural-compare/download/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.2" - resolved "https://registry.npmmirror.com/neo-async/download/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8= - -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.npmmirror.com/nice-try/download/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y= - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/no-case/download/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0= - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.npmmirror.com/node-fetch/download/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.npmmirror.com/node-forge/download/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M= - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.npmmirror.com/node-int64/download/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.npmmirror.com/node-libs-browser/download/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU= - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-notifier@^5.4.2: - version "5.4.5" - resolved "https://registry.npmmirror.com/node-notifier/download/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef" - integrity sha1-DLwaKw9lhJO0Ald1oTrZOOlgke8= - dependencies: - growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" - shellwords "^0.1.1" - which "^1.3.0" - -node-releases@^1.1.52: - version "1.1.77" - resolved "https://registry.npmmirror.com/node-releases/download/node-releases-1.1.77.tgz?cache=0&sync_timestamp=1634807933091&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" - integrity sha1-ULDP7ehV3TdOdYW/Io/zTlfBwy4= - -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/node-releases/download/node-releases-2.0.1.tgz?cache=0&sync_timestamp=1634807933091&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-releases%2Fdownload%2Fnode-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha1-PR05XyBPHy8ppUNYuftnh2WtL8U= - -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.npmmirror.com/normalize-package-data/download/normalize-package-data-2.5.0.tgz?cache=0&sync_timestamp=1629301872905&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.npmmirror.com/normalize-package-data/download/normalize-package-data-3.0.3.tgz?cache=0&sync_timestamp=1629301872905&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha1-28w+LaWVCaCYNCKITNFy7v36Ul4= - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/normalize-path/download/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmmirror.com/normalize-range/download/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-selector@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/normalize-selector/download/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" - integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= - -normalize-url@1.9.1: - version "1.9.1" - resolved "https://registry.npmmirror.com/normalize-url/download/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/normalize-url/download/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha1-suHE3E98bVd0PfczpPWXjRhlBVk= - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.npmmirror.com/npm-run-path/download/npm-run-path-2.0.2.tgz?cache=0&sync_timestamp=1633420566316&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnpm-run-path%2Fdownload%2Fnpm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/nth-check/download/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw= - dependencies: - boolbase "~1.0.0" - -nth-check@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/nth-check/download/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" - integrity sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I= - dependencies: - boolbase "^1.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.npmmirror.com/num2fraction/download/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nwsapi@^2.0.7, nwsapi@^2.1.3: - version "2.2.0" - resolved "https://registry.npmmirror.com/nwsapi/download/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha1-IEh5qePQaP8qVROcLHcngGgaOLc= - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.npmmirror.com/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/object-copy/download/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-hash@^2.0.1: - version "2.2.0" - resolved "https://registry.npmmirror.com/object-hash/download/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" - integrity sha1-WtUYWB7vxEO9djRyuP8unCwNVKU= - -object-inspect@^1.11.0: - version "1.12.0" - resolved "https://registry.npmmirror.com/object-inspect/download/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== - -object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.npmmirror.com/object-is/download/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha1-ud7qpfx/GEag+uzc7sE45XePU6w= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/object-keys/download/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha1-HEfyct8nfzsdrwYWd9nILiMixg4= - -object-path@0.11.4: - version "0.11.4" - resolved "https://registry.npmmirror.com/object-path/download/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" - integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/object-visit/download/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.npmmirror.com/object.assign/download/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA= - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.entries@^1.1.0, object.entries@^1.1.1: - version "1.1.5" - resolved "https://registry.npmmirror.com/object.entries/download/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha1-4azdF8TeLNltWghIfPuduE2IGGE= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.fromentries@^2.0.2: - version "2.0.5" - resolved "https://registry.npmmirror.com/object.fromentries/download/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha1-ezeyBRCcIedB5gVyf+iwrV+gglE= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0, object.getownpropertydescriptors@^2.1.1: - version "2.1.3" - resolved "https://registry.npmmirror.com/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.1.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fobject.getownpropertydescriptors%2Fdownload%2Fobject.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" - integrity sha1-siPPOOF/77l6Y8EMkd9yzLOG354= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/object.pick/download/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.0, object.values@^1.1.1: - version "1.1.5" - resolved "https://registry.npmmirror.com/object.values/download/object.values-1.1.5.tgz?cache=0&sync_timestamp=1633327208193&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fobject.values%2Fdownload%2Fobject.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha1-lZ9j486e8QhyAzMIITHkpFm3Fqw= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/obuf/download/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4= - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/on-headers/download/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8= - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.npmmirror.com/onetime/download/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4= - dependencies: - mimic-fn "^2.1.0" - -open@^7.0.2: - version "7.4.2" - resolved "https://registry.npmmirror.com/open/download/open-7.4.2.tgz?cache=0&sync_timestamp=1635049636729&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fopen%2Fdownload%2Fopen-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha1-uBR+Jtzz5CYxbHMAif1x7dKcIyE= - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.npmmirror.com/opn/download/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w= - dependencies: - is-wsl "^1.1.0" - -optimize-css-assets-webpack-plugin@5.0.3: - version "5.0.3" - resolved "https://registry.npmmirror.com/optimize-css-assets-webpack-plugin/download/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" - integrity sha1-4vHU2UrYwK+JZ+vXzxONyx7xRXI= - dependencies: - cssnano "^4.1.10" - last-call-webpack-plugin "^3.0.0" - -optionator@^0.8.1, optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.npmmirror.com/optionator/download/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU= - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -original@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/original/download/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8= - dependencies: - url-parse "^1.4.3" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/os-browserify/download/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/os-locale/download/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo= - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/p-defer/download/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-each-series@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/p-each-series/download/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" - integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= - dependencies: - p-reduce "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/p-finally/download/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/p-is-promise/download/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/p-limit/download/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg= - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: - version "2.3.0" - resolved "https://registry.npmmirror.com/p-limit/download/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/p-locate/download/p-locate-2.0.0.tgz?cache=0&sync_timestamp=1629892708584&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/p-locate/download/p-locate-3.0.0.tgz?cache=0&sync_timestamp=1629892708584&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ= - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/p-locate/download/p-locate-4.1.0.tgz?cache=0&sync_timestamp=1629892708584&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha1-o0KLtwiLOmApL2aRkni3wpetTwc= - dependencies: - p-limit "^2.2.0" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/p-map/download/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha1-MQko/u+cnsxltosXaTAYpmXOoXU= - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/p-map/download/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha1-1wTZr4orpoTiYA2aIVmD1BQal50= - dependencies: - aggregate-error "^3.0.0" - -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/p-reduce/download/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= - -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/p-retry/download/p-retry-3.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-retry%2Fdownload%2Fp-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha1-MWtMiJPiyNwc+okfQGxLQivr8yg= - dependencies: - retry "^0.12.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/p-try/download/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/p-try/download/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.npmmirror.com/pako/download/pako-1.0.11.tgz?cache=0&sync_timestamp=1627560187062&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpako%2Fdownload%2Fpako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8= - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/parallel-transform/download/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw= - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -param-case@^3.0.3: - version "3.0.4" - resolved "https://registry.npmmirror.com/param-case/download/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU= - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/parent-module/download/parent-module-1.0.1.tgz?cache=0&sync_timestamp=1633337488003&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fparent-module%2Fdownload%2Fparent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI= - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.6: - version "5.1.6" - resolved "https://registry.npmmirror.com/parse-asn1/download/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha1-OFCAo+wTy2KmLTlAnLPoiETNrtQ= - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/parse-entities/download/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha1-U8brW5MUofTsmfoP33zgHs2gy+g= - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/parse-json/download/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/parse-json/download/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80= - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/parse5/download/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha1-bXhlbj2o14tOwLkG98CO8d/j9gg= - -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/parse5/download/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha1-xZNByXI/QUxFKXVWTHwApo1YrNI= - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/pascal-case/download/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs= - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.npmmirror.com/pascalcase/download/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/path-browserify/download/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha1-5sTd1+06onxoogzE5Q4aTug7vEo= - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/path-dirname/download/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/path-exists/download/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/path-exists/download/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/path-exists/download/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/path-is-inside/download/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/path-key/download/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/path-key/download/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= - -path-parse@^1.0.6, path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmmirror.com/path-parse/download/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU= - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/path-type/download/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/path-type/download/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha1-zvMdyOCho7sNEFwM2Xzzv0f0428= - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/path-type/download/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs= - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.npmmirror.com/pbkdf2/download/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha1-3YIqoIh1gOUvGgOdw+2hCO+uMHU= - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8= - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/picocolors/download/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw= - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.1" - resolved "https://registry.npmmirror.com/picomatch/download/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/pify/download/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/pify/download/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE= - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/pinkie-promise/download/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.npmmirror.com/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pirates@^4.0.1: - version "4.0.5" - resolved "https://registry.npmmirror.com/pirates/download/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-1.0.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= - dependencies: - find-up "^1.0.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-3.0.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM= - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM= - dependencies: - find-up "^4.0.0" - -pkg-up@3.1.0, pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/pkg-up/download/pkg-up-3.1.0.tgz?cache=0&sync_timestamp=1636035118070&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-up%2Fdownload%2Fpkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha1-EA7CNcwVDk/UJRlBJZaihRKg3vU= - dependencies: - find-up "^3.0.0" - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/pn/download/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha1-4vTO8OIZ9GPBeas3Rj5OHs3Muvs= - -pnp-webpack-plugin@1.6.4: - version "1.6.4" - resolved "https://registry.npmmirror.com/pnp-webpack-plugin/download/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha1-yXEaxNxIpoXauvyG+Lbdn434QUk= - dependencies: - ts-pnp "^1.1.6" - -popmotion@9.0.0-rc.20: - version "9.0.0-rc.20" - resolved "https://registry.npmmirror.com/popmotion/download/popmotion-9.0.0-rc.20.tgz#f3550042ae31957b5416793ae8723200951ad39d" - integrity sha1-81UAQq4xlXtUFnk66HIyAJUa050= - dependencies: - framesync "^4.1.0" - hey-listen "^1.0.8" - style-value-types "^3.1.9" - tslib "^1.10.0" - -popper.js@^1.14.4: - version "1.16.1" - resolved "https://registry.npmmirror.com/popper.js/download/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - -portfinder@^1.0.25: - version "1.0.28" - resolved "https://registry.npmmirror.com/portfinder/download/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g= - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.npmmirror.com/posix-character-classes/download/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-attribute-case-insensitive@^4.0.1: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-attribute-case-insensitive/download/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" - integrity sha1-2T5GtQRYnpSscnewRjImxoBBqIA= - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^6.0.2" - -postcss-browser-comments@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postcss-browser-comments/download/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" - integrity sha1-EkjS2TX7cgU8jh9hqEpXKS2fZek= - dependencies: - postcss "^7" - -postcss-calc@^7.0.1: - version "7.0.5" - resolved "https://registry.npmmirror.com/postcss-calc/download/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" - integrity sha1-+KbpnxLmGcLrwjz2xIb9wVhgkz4= - dependencies: - postcss "^7.0.27" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" - -postcss-color-functional-notation@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/postcss-color-functional-notation/download/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" - integrity sha1-Xv03qI+6vrAKKWbR5T2Yztk/dOA= - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-gray@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/postcss-color-gray/download/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" - integrity sha1-Uyox65CfjaiYzv/ilv3B+GS+hUc= - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-color-hex-alpha@^5.0.3: - version "5.0.3" - resolved "https://registry.npmmirror.com/postcss-color-hex-alpha/download/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" - integrity sha1-qNnKTDnUl8lmHjdLnFGJnvD4c4g= - dependencies: - postcss "^7.0.14" - postcss-values-parser "^2.0.1" - -postcss-color-mod-function@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/postcss-color-mod-function/download/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" - integrity sha1-gWuhRawRzDy2uqkFp1pJ+QPk0x0= - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-rebeccapurple@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-color-rebeccapurple/download/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" - integrity sha1-x6ib6HK7dORbHjAiv+V0iCPm3nc= - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.npmmirror.com/postcss-colormin/download/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha1-rgYLzpPteUrHEmTwgTLVUJVr04E= - dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8= - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-custom-media@^7.0.8: - version "7.0.8" - resolved "https://registry.npmmirror.com/postcss-custom-media/download/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" - integrity sha1-//0T/+/61zYhvl84cHaiiwApTgw= - dependencies: - postcss "^7.0.14" - -postcss-custom-properties@^8.0.11: - version "8.0.11" - resolved "https://registry.npmmirror.com/postcss-custom-properties/download/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" - integrity sha1-LWF3LW6S8i9eDVJgLfj65G+jDZc= - dependencies: - postcss "^7.0.17" - postcss-values-parser "^2.0.1" - -postcss-custom-selectors@^5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/postcss-custom-selectors/download/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" - integrity sha1-ZIWMbrLs/y+0HQsoyd17PbTef7o= - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-dir-pseudo-class@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/postcss-dir-pseudo-class/download/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" - integrity sha1-bjpBd9Dts6vMhf22+7HCbauuq6I= - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha1-H7q9LCRr/2qq15l7KwkY9NevQDM= - dependencies: - postcss "^7.0.0" - -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha1-P+EzzTyCKC5VD8myORdqkge3hOs= - dependencies: - postcss "^7.0.0" - -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha1-yMlR6fc+2UKAGUWERKAq2Qu592U= - dependencies: - postcss "^7.0.0" - -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha1-ZSrvipZybwKfXj4AFG7npOdV/1c= - dependencies: - postcss "^7.0.0" - -postcss-double-position-gradients@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/postcss-double-position-gradients/download/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" - integrity sha1-/JJ9Uv3ciWyzooEuvF3xR+EQUi4= - dependencies: - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-env-function@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/postcss-env-function/download/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" - integrity sha1-Dz49PFfwlKksK69LYkHwsNpTZdc= - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-flexbugs-fixes@4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/postcss-flexbugs-fixes/download/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20" - integrity sha1-4JSp3xeD4iALexn4ddytOzr/iyA= - dependencies: - postcss "^7.0.0" - -postcss-focus-visible@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/postcss-focus-visible/download/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" - integrity sha1-R30QcROt5gJLFBKDF63ivR4XBG4= - dependencies: - postcss "^7.0.2" - -postcss-focus-within@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postcss-focus-within/download/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" - integrity sha1-djuHiFls7puHTJmSAc3egGWe9oA= - dependencies: - postcss "^7.0.2" - -postcss-font-variant@^4.0.0: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-font-variant/download/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" - integrity sha1-QtTAqzCJT2D5ixdWHrXAMh9QJkE= - dependencies: - postcss "^7.0.2" - -postcss-gap-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/postcss-gap-properties/download/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" - integrity sha1-QxwZKrPtlqPD0J8v9hWWD5AsFxU= - dependencies: - postcss "^7.0.2" - -postcss-html@^0.36.0: - version "0.36.0" - resolved "https://registry.npmmirror.com/postcss-html/download/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204" - integrity sha1-tAkT+U6qzCRT/TChMnrW7h+IsgQ= - dependencies: - htmlparser2 "^3.10.0" - -postcss-image-set-function@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/postcss-image-set-function/download/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" - integrity sha1-KJIKLymUW+1MMZjX32SW1BDT8og= - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-initial@^3.0.0: - version "3.0.4" - resolved "https://registry.npmmirror.com/postcss-initial/download/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" - integrity sha1-nTIGmhBTH+Lsr6C2rHUO4Lx+/FM= - dependencies: - postcss "^7.0.2" - -postcss-lab-function@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/postcss-lab-function/download/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" - integrity sha1-u1GmhWzRIomrSuINseOCHvE9fS4= - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-less@^3.1.4: - version "3.1.4" - resolved "https://registry.npmmirror.com/postcss-less/download/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" - integrity sha1-Np9YZCtZKO+Jj/vBpuk8lYMExa0= - dependencies: - postcss "^7.0.14" - -postcss-load-config@^2.0.0: - version "2.1.2" - resolved "https://registry.npmmirror.com/postcss-load-config/download/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" - integrity sha1-xepQTyxK7zPHNZo03jVzdyrXUCo= - dependencies: - cosmiconfig "^5.0.0" - import-cwd "^2.0.0" - -postcss-loader@3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postcss-loader/download/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0= - dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" - -postcss-logical@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postcss-logical/download/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" - integrity sha1-JJXQ+LgunyYnJfdflAGzTntF1bU= - dependencies: - postcss "^7.0.2" - -postcss-media-minmax@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/postcss-media-minmax/download/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" - integrity sha1-t1u2y8IXyKxJQz4S8iBIgUpPXtU= - dependencies: - postcss "^7.0.2" - -postcss-media-query-parser@^0.2.3: - version "0.2.3" - resolved "https://registry.npmmirror.com/postcss-media-query-parser/download/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" - integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= - -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.npmmirror.com/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ= - dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" - -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.npmmirror.com/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha1-NivqT/Wh+Y5AdacTxsslrv75plA= - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" - -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY= - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE= - dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ= - dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" - -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g= - dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/postcss-modules-extract-imports/download/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha1-gYcZoa4doyX5gyRGsBE27rSTzX4= - dependencies: - postcss "^7.0.5" - -postcss-modules-local-by-default@^3.0.2: - version "3.0.3" - resolved "https://registry.npmmirror.com/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha1-uxTgzHgnnVBNvcv9fgyiiZP/u7A= - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^2.1.1: - version "2.2.0" - resolved "https://registry.npmmirror.com/postcss-modules-scope/download/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha1-OFyuATzHdD9afXYC0Qc6iequYu4= - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postcss-modules-values/download/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha1-W1AA1uuuKbQlUwG0o6VFdEI+fxA= - dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" - -postcss-nesting@^7.0.0: - version "7.0.1" - resolved "https://registry.npmmirror.com/postcss-nesting/download/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" - integrity sha1-tQrXt/AXPlteOIDDUBNEcD4EwFI= - dependencies: - postcss "^7.0.2" - -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha1-izWt067oOhNrBHHg1ZvlilAoXdQ= - dependencies: - postcss "^7.0.0" - -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha1-Db4EpM6QY9RmftK+R2u4MMglk1o= - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-normalize-positions/download/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8= - dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw= - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-normalize-string/download/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw= - dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha1-jgCcoqOUnNr4rSPmtquZy159KNk= - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-normalize-unicode/download/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs= - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE= - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI= - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize@8.0.1: - version "8.0.1" - resolved "https://registry.npmmirror.com/postcss-normalize/download/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" - integrity sha1-kOgKd2PX/fLaby8Pgr6DLOT2Z3Y= - dependencies: - "@csstools/normalize.css" "^10.1.0" - browserslist "^4.6.2" - postcss "^7.0.17" - postcss-browser-comments "^3.0.0" - sanitize.css "^10.0.0" - -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.npmmirror.com/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4= - dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-overflow-shorthand@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/postcss-overflow-shorthand/download/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" - integrity sha1-MezzUOnG9t3CUKePDD4RHzLdTDA= - dependencies: - postcss "^7.0.2" - -postcss-page-break@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/postcss-page-break/download/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" - integrity sha1-rdUtDgpSjKvmr+6LRuKrsnffRr8= - dependencies: - postcss "^7.0.2" - -postcss-place@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-place/download/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" - integrity sha1-6fOdM9LcWE5G7h20Wtt3yp0dzGI= - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-preset-env@6.7.0: - version "6.7.0" - resolved "https://registry.npmmirror.com/postcss-preset-env/download/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" - integrity sha1-w03az4+QI4OzWtHgMPF49M3xGKU= - dependencies: - autoprefixer "^9.6.1" - browserslist "^4.6.4" - caniuse-lite "^1.0.30000981" - css-blank-pseudo "^0.1.4" - css-has-pseudo "^0.10.0" - css-prefers-color-scheme "^3.1.1" - cssdb "^4.4.0" - postcss "^7.0.17" - postcss-attribute-case-insensitive "^4.0.1" - postcss-color-functional-notation "^2.0.1" - postcss-color-gray "^5.0.0" - postcss-color-hex-alpha "^5.0.3" - postcss-color-mod-function "^3.0.3" - postcss-color-rebeccapurple "^4.0.1" - postcss-custom-media "^7.0.8" - postcss-custom-properties "^8.0.11" - postcss-custom-selectors "^5.1.2" - postcss-dir-pseudo-class "^5.0.0" - postcss-double-position-gradients "^1.0.0" - postcss-env-function "^2.0.2" - postcss-focus-visible "^4.0.0" - postcss-focus-within "^3.0.0" - postcss-font-variant "^4.0.0" - postcss-gap-properties "^2.0.0" - postcss-image-set-function "^3.0.1" - postcss-initial "^3.0.0" - postcss-lab-function "^2.0.1" - postcss-logical "^3.0.0" - postcss-media-minmax "^4.0.0" - postcss-nesting "^7.0.0" - postcss-overflow-shorthand "^2.0.0" - postcss-page-break "^2.0.0" - postcss-place "^4.0.1" - postcss-pseudo-class-any-link "^6.0.0" - postcss-replace-overflow-wrap "^3.0.0" - postcss-selector-matches "^4.0.0" - postcss-selector-not "^4.0.0" - -postcss-pseudo-class-any-link@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/postcss-pseudo-class-any-link/download/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" - integrity sha1-LtPu05OzcCh53sSocDKyENrrBNE= - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.npmmirror.com/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha1-f9QuvqXpyBRgljniwuhK4nC6SN8= - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha1-F++kBerMbge+NBSlyi0QdGgdTik= - dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-replace-overflow-wrap@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postcss-replace-overflow-wrap/download/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" - integrity sha1-YbNg/9rtyoTHyRjSsPDQ6lWasBw= - dependencies: - postcss "^7.0.2" - -postcss-resolve-nested-selector@^0.1.1: - version "0.1.1" - resolved "https://registry.npmmirror.com/postcss-resolve-nested-selector/download/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" - integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= - -postcss-safe-parser@4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-safe-parser/download/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea" - integrity sha1-h1bZ5MNv3OLHKwkbvIyhdqsfzeo= - dependencies: - postcss "^7.0.0" - -postcss-safe-parser@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-safe-parser/download/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" - integrity sha1-ptTkjw832ffBGypYG/APi6SHC5Y= - dependencies: - postcss "^7.0.26" - -postcss-sass@^0.4.4: - version "0.4.4" - resolved "https://registry.npmmirror.com/postcss-sass/download/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3" - integrity sha1-kfDzRHtFzjcyJ6mLYfjY8HhShaM= - dependencies: - gonzales-pe "^4.3.0" - postcss "^7.0.21" - -postcss-scss@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/postcss-scss/download/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383" - integrity sha1-7Dp1+imlXgFrkL8yaQJsU8HSs4M= - dependencies: - postcss "^7.0.6" - -postcss-selector-matches@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/postcss-selector-matches/download/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" - integrity sha1-ccgkj5F7osyTA3yWN+4JxkQ2/P8= - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-not@^4.0.0: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-selector-not/download/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" - integrity sha1-JjAW7vHPIZ4K3pqRN4D8H0ggTL8= - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-parser@^3.0.0: - version "3.1.2" - resolved "https://registry.npmmirror.com/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" - integrity sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA= - dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.npmmirror.com/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha1-JJBENWaXsztk8aj3yAki3d7nGVw= - dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.5: - version "6.0.9" - resolved "https://registry.npmmirror.com/postcss-selector-parser/download/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" - integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-svgo@^4.0.3: - version "4.0.3" - resolved "https://registry.npmmirror.com/postcss-svgo/download/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" - integrity sha1-NDos26yVBdQWJD1Jb3JPOIlMlB4= - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" - -postcss-syntax@^0.36.2: - version "0.36.2" - resolved "https://registry.npmmirror.com/postcss-syntax/download/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c" - integrity sha1-8IV4x9lYNFdOVZOoLfv6ivrjtRw= - -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w= - dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.0: - version "3.3.1" - resolved "https://registry.npmmirror.com/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha1-n/giVH4okyE88cMO+lGsX9G6goE= - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/postcss-value-parser/download/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/postcss-values-parser/download/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" - integrity sha1-2otHLZAdoeIFtHvcmGN7np5VDl8= - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss@7.0.21: - version "7.0.21" - resolved "https://registry.npmmirror.com/postcss/download/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" - integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.39" - resolved "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/prelude-ls/download/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/prepend-http/download/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -prettier@^2.0.5: - version "2.5.1" - resolved "https://registry.npmmirror.com/prettier/download/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" - integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== - -pretty-bytes@^5.1.0: - version "5.6.0" - resolved "https://registry.npmmirror.com/pretty-bytes/download/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" - integrity sha1-NWJW9kOAR3PIL2RyP+eMksYr6us= - -pretty-error@^2.1.1: - version "2.1.2" - resolved "https://registry.npmmirror.com/pretty-error/download/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" - integrity sha1-von4LYGxyG7I/fvDhQRYgnJ/k7Y= - dependencies: - lodash "^4.17.20" - renderkid "^2.0.4" - -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.npmmirror.com/pretty-format/download/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha1-EvrDGzcBmk7qPBGqmpWet2KKp8k= - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -pretty-format@^27.4.6: - version "27.4.6" - resolved "https://registry.npmmirror.com/pretty-format/download/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7" - integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/process-nextick-args/download/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I= - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.npmmirror.com/process/download/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.npmmirror.com/progress/download/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/promise-inflight/download/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.npmmirror.com/promise/download/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078= - dependencies: - asap "~2.0.3" - -promise@^8.0.3: - version "8.1.0" - resolved "https://registry.npmmirror.com/promise/download/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" - integrity sha1-aXwlw9/nQ13Xn81Yw4oTWIjq8F4= - dependencies: - asap "~2.0.6" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.npmmirror.com/prompts/download/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha1-e1fnOzpIAprRDr1E90sBcipMsGk= - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.8.1" - resolved "https://registry.npmmirror.com/prop-types/download/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/prr/download/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.npmmirror.com/psl/download/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ= - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.npmmirror.com/public-encrypt/download/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA= - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/pump/download/pump-2.0.1.tgz?cache=0&sync_timestamp=1624607960506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpump%2Fdownload%2Fpump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk= - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/pump/download/pump-3.0.0.tgz?cache=0&sync_timestamp=1624607960506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpump%2Fdownload%2Fpump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ= - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.npmmirror.com/pumpify/download/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4= - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.npmmirror.com/punycode/download/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.npmmirror.com/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/punycode/download/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= - -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/pure-color/download/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" - integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.npmmirror.com/q/download/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.npmmirror.com/qs/download/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.npmmirror.com/query-string/download/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q== - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.npmmirror.com/querystring-es3/download/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/querystring/download/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.npmmirror.com/querystringify/download/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y= - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmmirror.com/queue-microtask/download/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha1-SSkii7xyTfrEPg77BYyve2z7YkM= - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/quick-lru/download/quick-lru-4.0.1.tgz?cache=0&sync_timestamp=1637478663596&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fquick-lru%2Fdownload%2Fquick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha1-W4h48ROlgheEjGSCAmxz4bpXcn8= - -raf@^3.4.1: - version "3.4.1" - resolved "https://registry.npmmirror.com/raf/download/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" - integrity sha1-B0LpmkplUvRF1z4+4DKK8P8e3jk= - dependencies: - performance-now "^2.1.0" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/randombytes/download/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.npmmirror.com/randomfill/download/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha1-ySGW/IarQr6YPxvzF3giSTHWFFg= - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc-align@^4.0.0: - version "4.0.11" - resolved "https://registry.npmmirror.com/rc-align/download/rc-align-4.0.11.tgz?cache=0&sync_timestamp=1628678366435&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frc-align%2Fdownload%2Frc-align-4.0.11.tgz#8198c62db266bc1b8ef05e56c13275bf72628a5e" - integrity sha1-gZjGLbJmvBuO8F5WwTJ1v3Jiil4= - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - dom-align "^1.7.0" - lodash "^4.17.21" - rc-util "^5.3.0" - resize-observer-polyfill "^1.5.1" - -rc-cascader@~3.2.1: - version "3.2.1" - resolved "https://registry.npmmirror.com/rc-cascader/download/rc-cascader-3.2.1.tgz#fc928d67d96c3d9f358263e4a9127bcf4257cc6b" - integrity sha512-Raxam9tFzBL4TCgHoyVcf7+Q2KSFneUk3FZXi9w1tfxEihLlezSH0oCNMjHJN8hxWwwx9ZbI9UzWTfFImjXc0Q== - dependencies: - "@babel/runtime" "^7.12.5" - array-tree-filter "^2.1.0" - classnames "^2.3.1" - rc-select "~14.0.0-alpha.23" - rc-tree "~5.4.3" - rc-util "^5.6.1" - -rc-checkbox@~2.3.0: - version "2.3.2" - resolved "https://registry.npmmirror.com/rc-checkbox/download/rc-checkbox-2.3.2.tgz#f91b3678c7edb2baa8121c9483c664fa6f0aefc1" - integrity sha1-+Rs2eMftsrqoEhyUg8Zk+m8K78E= - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - -rc-collapse@~3.1.0: - version "3.1.2" - resolved "https://registry.npmmirror.com/rc-collapse/download/rc-collapse-3.1.2.tgz#76028a811b845d03d9460ccc409c7ea8ad09db14" - integrity sha1-dgKKgRuEXQPZRgzMQJx+qK0J2xQ= - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.3.4" - rc-util "^5.2.1" - shallowequal "^1.1.0" - -rc-dialog@~8.6.0: - version "8.6.0" - resolved "https://registry.npmmirror.com/rc-dialog/download/rc-dialog-8.6.0.tgz?cache=0&sync_timestamp=1627272166293&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frc-dialog%2Fdownload%2Frc-dialog-8.6.0.tgz#3b228dac085de5eed8c6237f31162104687442e7" - integrity sha1-OyKNrAhd5e7YxiN/MRYhBGh0Quc= - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-motion "^2.3.0" - rc-util "^5.6.1" - -rc-drawer@~4.4.2: - version "4.4.3" - resolved "https://registry.npmmirror.com/rc-drawer/download/rc-drawer-4.4.3.tgz?cache=0&sync_timestamp=1637134392366&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Frc-drawer%2Fdownload%2Frc-drawer-4.4.3.tgz#2094937a844e55dc9644236a2d9fba79c344e321" - integrity sha512-FYztwRs3uXnFOIf1hLvFxIQP9MiZJA+0w+Os8dfDh/90X7z/HqP/Yg+noLCIeHEbKln1Tqelv8ymCAN24zPcfQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-util "^5.7.0" - -rc-dropdown@^3.2.0, rc-dropdown@~3.2.0: - version "3.2.2" - resolved "https://registry.npmmirror.com/rc-dropdown/download/rc-dropdown-3.2.2.tgz#0fee9a66f100d686ddaa8d09717d090f72e1ce29" - integrity sha512-oA9VYYg+jQaPRdFoYFfBn5EAQk2NlL6H0vR2v6JG/8i4HEfUq8p1TTt6HyQ/dGxLe8lpnK+nM7WCjgZT/cpSRQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-trigger "^5.0.4" - -rc-field-form@~1.22.0-2: - version "1.22.1" - resolved "https://registry.npmmirror.com/rc-field-form/download/rc-field-form-1.22.1.tgz#0bd2f4e730ff2f071529d00bef28e062362890f5" - integrity sha512-LweU7nBeqmC5r3HDUjRprcOXXobHXp/TGIxD7ppBq5FX6Iptt3ibdpRVg4RSyNulBNGHOuknHlRcguuIpvVMVg== - dependencies: - "@babel/runtime" "^7.8.4" - async-validator "^4.0.2" - rc-util "^5.8.0" - -rc-image@~5.2.5: - version "5.2.5" - resolved "https://registry.npmmirror.com/rc-image/download/rc-image-5.2.5.tgz#44e6ffc842626827960e7ab72e1c0d6f3a8ce440" - integrity sha1-ROb/yEJiaCeWDnq3LhwNbzqM5EA= - dependencies: - "@babel/runtime" "^7.11.2" - classnames "^2.2.6" - rc-dialog "~8.6.0" - rc-util "^5.0.6" - -rc-input-number@~7.3.0: - version "7.3.4" - resolved "https://registry.npmmirror.com/rc-input-number/download/rc-input-number-7.3.4.tgz#674aea98260250287d36e330a7e065b174486e9d" - integrity sha512-W9uqSzuvJUnz8H8vsVY4kx+yK51SsAxNTwr8SNH4G3XqQNocLVmKIibKFRjocnYX1RDHMND9FFbgj2h7E7nvGA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.9.8" - -rc-mentions@~1.6.1: - version "1.6.1" - resolved "https://registry.npmmirror.com/rc-mentions/download/rc-mentions-1.6.1.tgz#46035027d64aa33ef840ba0fbd411871e34617ae" - integrity sha1-RgNQJ9ZKoz74QLoPvUEYceNGF64= - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-menu "^9.0.0" - rc-textarea "^0.3.0" - rc-trigger "^5.0.4" - rc-util "^5.0.1" - -rc-menu@^9.0.0: - version "9.3.1" - resolved "https://registry.npmmirror.com/rc-menu/download/rc-menu-9.3.1.tgz#a0e502938d2b7467ea8d343ae00c4af6019ba412" - integrity sha512-D9ZHlwtTpch0v15LXt7PRbAl+FCxXNEllly9fl1GhLzz52iTL2NVqzofecV5Yv3ekLUOojg+gkykv4elLNBKWg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.4.3" - rc-overflow "^1.2.0" - rc-trigger "^5.1.2" - rc-util "^5.12.0" - shallowequal "^1.1.0" - -rc-menu@~9.2.1: - version "9.2.1" - resolved "https://registry.npmmirror.com/rc-menu/download/rc-menu-9.2.1.tgz#6fbe47f4846363bb81a5a21f0960026c3ada497a" - integrity sha512-UbEtn3rflJ8zS+etYGTVQuzy7Fm+yWXR5c0Rl6ecNTS/dPknRyWAyhJcbeR0Hu1+RdQT+0VCqrUPrgKnm4iY+w== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.4.3" - rc-overflow "^1.2.0" - rc-trigger "^5.1.2" - rc-util "^5.12.0" - shallowequal "^1.1.0" - -rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4: - version "2.4.4" - resolved "https://registry.npmmirror.com/rc-motion/download/rc-motion-2.4.4.tgz#e995d5fa24fc93065c24f714857cf2677d655bb0" - integrity sha1-6ZXV+iT8kwZcJPcUhXzyZ31lW7A= - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-util "^5.2.1" - -rc-notification@~4.5.7: - version "4.5.7" - resolved "https://registry.npmmirror.com/rc-notification/download/rc-notification-4.5.7.tgz#265e6e6a0c1a0fac63d6abd4d832eb8ff31522f1" - integrity sha1-Jl5uagwaD6xj1qvU2DLrj/MVIvE= - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.2.0" - rc-util "^5.0.1" - -rc-overflow@^1.0.0, rc-overflow@^1.2.0: - version "1.2.2" - resolved "https://registry.npmmirror.com/rc-overflow/download/rc-overflow-1.2.2.tgz#95b0222016c0cdbdc0db85f569c262e7706a5f22" - integrity sha1-lbAiIBbAzb3A24X1acJi53BqXyI= - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-resize-observer "^1.0.0" - rc-util "^5.5.1" - -rc-pagination@~3.1.9: - version "3.1.15" - resolved "https://registry.npmmirror.com/rc-pagination/download/rc-pagination-3.1.15.tgz#e05eddf4c15717a5858290bed0857e27e2f957ff" - integrity sha512-4L3fot8g4E+PjWEgoVGX0noFCg+8ZFZmeLH4vsnZpB3O2T2zThtakjNxG+YvSaYtyMVT4B+GLayjKrKbXQpdAg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - -rc-picker@~2.5.17: - version "2.5.19" - resolved "https://registry.npmmirror.com/rc-picker/download/rc-picker-2.5.19.tgz#73d07546fac3992f0bfabf2789654acada39e46f" - integrity sha1-c9B1RvrDmS8L+r8niWVKyto55G8= - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - date-fns "2.x" - dayjs "1.x" - moment "^2.24.0" - rc-trigger "^5.0.4" - rc-util "^5.4.0" - shallowequal "^1.1.0" - -rc-progress@~3.2.1: - version "3.2.4" - resolved "https://registry.npmmirror.com/rc-progress/download/rc-progress-3.2.4.tgz#4036acdae2566438545bc4df2203248babaf7549" - integrity sha512-M9WWutRaoVkPUPIrTpRIDpX0SPSrVHzxHdCRCbeoBFrd9UFWTYNWRlHsruJM5FH1AZI+BwB4wOJUNNylg/uFSw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-util "^5.16.1" - -rc-rate@~2.9.0: - version "2.9.1" - resolved "https://registry.npmmirror.com/rc-rate/download/rc-rate-2.9.1.tgz#e43cb95c4eb90a2c1e0b16ec6614d8c43530a731" - integrity sha1-5Dy5XE65CiweCxbsZhTYxDUwpzE= - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.0.1" - -rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/rc-resize-observer/download/rc-resize-observer-1.2.0.tgz#9f46052f81cdf03498be35144cb7c53fd282c4c7" - integrity sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-util "^5.15.0" - resize-observer-polyfill "^1.5.1" - -rc-select@~14.0.0-alpha.15, rc-select@~14.0.0-alpha.23, rc-select@~14.0.0-alpha.8: - version "14.0.0-alpha.25" - resolved "https://registry.npmmirror.com/rc-select/download/rc-select-14.0.0-alpha.25.tgz#9e6ca83b090e020a730fdfdab07c1050549426e4" - integrity sha512-U9AMzXsOCCdtn96YIZdUrYbxk+5u6uWUCaYH2129X3FTjQITqAjEPYHfPcxU/G7+lwiD0pIaU95W0NMkg+26qw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.0.1" - rc-overflow "^1.0.0" - rc-trigger "^5.0.4" - rc-util "^5.16.1" - rc-virtual-list "^3.2.0" - -rc-slider@~9.7.4: - version "9.7.5" - resolved "https://registry.npmmirror.com/rc-slider/download/rc-slider-9.7.5.tgz#193141c68e99b1dc3b746daeb6bf852946f5b7f4" - integrity sha512-LV/MWcXFjco1epPbdw1JlLXlTgmWpB9/Y/P2yinf8Pg3wElHxA9uajN21lJiWtZjf5SCUekfSP6QMJfDo4t1hg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-tooltip "^5.0.1" - rc-util "^5.16.1" - shallowequal "^1.1.0" - -rc-steps@~4.1.0: - version "4.1.4" - resolved "https://registry.npmmirror.com/rc-steps/download/rc-steps-4.1.4.tgz#0ba82db202d59ca52d0693dc9880dd145b19dc23" - integrity sha1-C6gtsgLVnKUtBpPcmIDdFFsZ3CM= - dependencies: - "@babel/runtime" "^7.10.2" - classnames "^2.2.3" - rc-util "^5.0.1" - -rc-switch@~3.2.0: - version "3.2.2" - resolved "https://registry.npmmirror.com/rc-switch/download/rc-switch-3.2.2.tgz#d001f77f12664d52595b4f6fb425dd9e66fba8e8" - integrity sha1-0AH3fxJmTVJZW09vtCXdnmb7qOg= - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-util "^5.0.1" - -rc-table@~7.22.2: - version "7.22.2" - resolved "https://registry.npmmirror.com/rc-table/download/rc-table-7.22.2.tgz#218f3f53bc91660560a344c8290a91a841a60b0a" - integrity sha512-Ng2gNkGi6ybl6dzneRn2H4Gp8XhIbRa5rXQ7ZhZcgWVmfVMok70UHGPXcf68tXW6O0/qckTf/eOVsoviSvK4sw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-resize-observer "^1.1.0" - rc-util "^5.14.0" - shallowequal "^1.1.0" - -rc-tabs@~11.10.0: - version "11.10.5" - resolved "https://registry.npmmirror.com/rc-tabs/download/rc-tabs-11.10.5.tgz#53bbb642d04b307f8ce86e318ab99d519507b29b" - integrity sha512-DDuUdV6b9zGRYLtjI5hyejWLKoz1QiLWNgMeBzc3aMeQylZFhTYnFGdDc6HRqj5IYearNTsFPVSA+6VIT8g5cg== - dependencies: - "@babel/runtime" "^7.11.2" - classnames "2.x" - rc-dropdown "^3.2.0" - rc-menu "^9.0.0" - rc-resize-observer "^1.0.0" - rc-util "^5.5.0" - -rc-textarea@^0.3.0, rc-textarea@~0.3.0: - version "0.3.7" - resolved "https://registry.npmmirror.com/rc-textarea/download/rc-textarea-0.3.7.tgz#987142891efdedb774883c07e2f51b318fde5a11" - integrity sha512-yCdZ6binKmAQB13hc/oehh0E/QRwoPP1pjF21aHBxlgXO3RzPF6dUu4LG2R4FZ1zx/fQd2L1faktulrXOM/2rw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-resize-observer "^1.0.0" - rc-util "^5.7.0" - shallowequal "^1.1.0" - -rc-tooltip@^5.0.1, rc-tooltip@~5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/rc-tooltip/download/rc-tooltip-5.1.1.tgz#94178ed162d0252bc4993b725f5dc2ac0fccf154" - integrity sha1-lBeO0WLQJSvEmTtyX13CrA/M8VQ= - dependencies: - "@babel/runtime" "^7.11.2" - rc-trigger "^5.0.0" - -rc-tree-select@~5.1.1: - version "5.1.2" - resolved "https://registry.npmmirror.com/rc-tree-select/download/rc-tree-select-5.1.2.tgz#0dfe12f01b9b0dc9ce658b96501692d4421b8366" - integrity sha512-sTulyQZB1SgF2HzAR49i4vjMNvV/tfPxCTc+qNuWOwaAtSm2bwGH6/wfi3k3Dw2/5PPOGpRRpgCMltoP9aG0+w== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-select "~14.0.0-alpha.8" - rc-tree "~5.4.3" - rc-util "^5.16.1" - -rc-tree@~5.4.3: - version "5.4.3" - resolved "https://registry.npmmirror.com/rc-tree/download/rc-tree-5.4.3.tgz#8674644964e17e5ab9b111c5aa18676f673e7bd0" - integrity sha512-WAHV8FkBerulj9J/+61+Qn0TD/Zo37PrDG8/45WomzGTYavxFMur9YguKjQj/J+NxjVJzrJL3lvdSZsumfdbiA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.0.1" - rc-util "^5.16.1" - rc-virtual-list "^3.4.1" - -rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.10: - version "5.2.10" - resolved "https://registry.npmmirror.com/rc-trigger/download/rc-trigger-5.2.10.tgz#8a0057a940b1b9027eaa33beec8a6ecd85cce2b1" - integrity sha1-igBXqUCxuQJ+qjO+7IpuzYXM4rE= - dependencies: - "@babel/runtime" "^7.11.2" - classnames "^2.2.6" - rc-align "^4.0.0" - rc-motion "^2.0.0" - rc-util "^5.5.0" - -rc-upload@~4.3.0: - version "4.3.3" - resolved "https://registry.npmmirror.com/rc-upload/download/rc-upload-4.3.3.tgz#e237aa525e5313fa16f4d04d27f53c2f0e157bb8" - integrity sha512-YoJ0phCRenMj1nzwalXzciKZ9/FAaCrFu84dS5pphwucTC8GUWClcDID/WWNGsLFcM97NqIboDqrV82rVRhW/w== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.2.0" - -rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.0.7, rc-util@^5.12.0, rc-util@^5.14.0, rc-util@^5.15.0, rc-util@^5.16.1, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.5.0, rc-util@^5.5.1, rc-util@^5.6.1, rc-util@^5.7.0, rc-util@^5.8.0, rc-util@^5.9.4, rc-util@^5.9.8: - version "5.17.0" - resolved "https://registry.npmmirror.com/rc-util/download/rc-util-5.17.0.tgz#6b0788038075c3d5c215541539573a4a03827070" - integrity sha512-HWuTIKzBeZQQ7IBqdokE0wMp/xx39/KfUJ0gcquBigoldDCrf3YBcWFHrrQlJG7sI82Wg8mwp1uAKV3zMGfAgg== - dependencies: - "@babel/runtime" "^7.12.5" - react-is "^16.12.0" - shallowequal "^1.1.0" - -rc-virtual-list@^3.2.0, rc-virtual-list@^3.4.1: - version "3.4.2" - resolved "https://registry.npmmirror.com/rc-virtual-list/download/rc-virtual-list-3.4.2.tgz#1078327aa7230b5e456d679ed2ce99f3c036ebd1" - integrity sha1-EHgyeqcjC15FbWee0s6Z88A269E= - dependencies: - classnames "^2.2.6" - rc-resize-observer "^1.0.0" - rc-util "^5.0.7" - -react-app-polyfill@^1.0.6: - version "1.0.6" - resolved "https://registry.npmmirror.com/react-app-polyfill/download/react-app-polyfill-1.0.6.tgz#890f8d7f2842ce6073f030b117de9130a5f385f0" - integrity sha1-iQ+NfyhCzmBz8DCxF96RMKXzhfA= - dependencies: - core-js "^3.5.0" - object-assign "^4.1.1" - promise "^8.0.3" - raf "^3.4.1" - regenerator-runtime "^0.13.3" - whatwg-fetch "^3.0.0" - -react-app-rewired@^2.1.6: - version "2.1.11" - resolved "https://registry.npmmirror.com/react-app-rewired/download/react-app-rewired-2.1.11.tgz#ad5781e3ef5e506be935898bb7642f7f9d50b61a" - integrity sha512-zRIqJUPsCoPnfYtea3xgPbKR42vx0NoH5oo8R8FELXqzkjJHa39V6zD8CAdkLJoYL8V3JScWHAfKMZOzi1Ydmw== - dependencies: - semver "^5.6.0" - -react-base16-styling@^0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/react-base16-styling/download/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" - integrity sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw= - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - -react-dev-utils@^10.2.1: - version "10.2.1" - resolved "https://registry.npmmirror.com/react-dev-utils/download/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" - integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== - dependencies: - "@babel/code-frame" "7.8.3" - address "1.1.2" - browserslist "4.10.0" - chalk "2.4.2" - cross-spawn "7.0.1" - detect-port-alt "1.1.6" - escape-string-regexp "2.0.0" - filesize "6.0.1" - find-up "4.1.0" - fork-ts-checker-webpack-plugin "3.1.1" - global-modules "2.0.0" - globby "8.0.2" - gzip-size "5.1.1" - immer "1.10.0" - inquirer "7.0.4" - is-root "2.1.0" - loader-utils "1.2.3" - open "^7.0.2" - pkg-up "3.1.0" - react-error-overlay "^6.0.7" - recursive-readdir "2.2.2" - shell-quote "1.7.2" - strip-ansi "6.0.0" - text-table "0.2.0" - -react-dnd-html5-backend@^11.1.3: - version "11.1.3" - resolved "https://registry.npmmirror.com/react-dnd-html5-backend/download/react-dnd-html5-backend-11.1.3.tgz#2749f04f416ec230ea193f5c1fbea2de7dffb8f7" - integrity sha1-J0nwT0FuwjDqGT9cH76i3n3/uPc= - dependencies: - dnd-core "^11.1.3" - -react-dnd@^11.1.3: - version "11.1.3" - resolved "https://registry.npmmirror.com/react-dnd/download/react-dnd-11.1.3.tgz#f9844f5699ccc55dfc81462c2c19f726e670c1af" - integrity sha1-+YRPVpnMxV38gUYsLBn3JuZwwa8= - dependencies: - "@react-dnd/shallowequal" "^2.0.0" - "@types/hoist-non-react-statics" "^3.3.1" - dnd-core "^11.1.3" - hoist-non-react-statics "^3.3.0" - -react-dom@^16.13.1: - version "16.14.0" - resolved "https://registry.npmmirror.com/react-dom/download/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" - integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" - -react-error-overlay@^6.0.7: - version "6.0.10" - resolved "https://registry.npmmirror.com/react-error-overlay/download/react-error-overlay-6.0.10.tgz#0fe26db4fa85d9dbb8624729580e90e7159a59a6" - integrity sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA== - -react-highlight-words@^0.16.0: - version "0.16.0" - resolved "https://registry.npmmirror.com/react-highlight-words/download/react-highlight-words-0.16.0.tgz#4b4b9824e3d2b98789d3e3b3aedb5e961ae1b7cf" - integrity sha1-S0uYJOPSuYeJ0+Ozrttelhrht88= - dependencies: - highlight-words-core "^1.2.0" - memoize-one "^4.0.0" - prop-types "^15.5.8" - -react-i18next@^11.7.3: - version "11.15.3" - resolved "https://registry.npmmirror.com/react-i18next/download/react-i18next-11.15.3.tgz#7608fb3cacc02ac75a62fc2d68b579f140b198dd" - integrity sha512-RSUEM4So3Tu2JHV0JsZ5Yje+4nz66YViMfPZoywxOy0xyn3L7tE2CHvJ7Y9LUsrTU7vGmZ5bwb8PpjnkatdIxg== - dependencies: - "@babel/runtime" "^7.14.5" - html-escaper "^2.0.2" - html-parse-stringify "^3.0.1" - -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.4: - version "16.13.1" - resolved "https://registry.npmmirror.com/react-is/download/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha1-eJcppNw23imZ3BVt1sHZwYzqVqQ= - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.npmmirror.com/react-is/download/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha1-5pHUqOnHiTZWVVOas3J2Kw77VPA= - -react-json-view@^1.19.1: - version "1.21.3" - resolved "https://registry.npmmirror.com/react-json-view/download/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" - integrity sha1-8YQgnujxvzdPsMQbCBPP9UVJxHU= - dependencies: - flux "^4.0.1" - react-base16-styling "^0.6.0" - react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^8.3.2" - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/react-lifecycles-compat/download/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha1-TxonOv38jzSIqMUWv9p4+HI1I2I= - -react-popper-tooltip@^2.11.1: - version "2.11.1" - resolved "https://registry.npmmirror.com/react-popper-tooltip/download/react-popper-tooltip-2.11.1.tgz#3c4bdfd8bc10d1c2b9a162e859bab8958f5b2644" - integrity sha1-PEvf2LwQ0cK5oWLoWbq4lY9bJkQ= - dependencies: - "@babel/runtime" "^7.9.2" - react-popper "^1.3.7" - -react-popper@^1.3.7: - version "1.3.11" - resolved "https://registry.npmmirror.com/react-popper/download/react-popper-1.3.11.tgz#a2cc3f0a67b75b66cfa62d2c409f9dd1fcc71ffd" - integrity sha1-osw/Cme3W2bPpi0sQJ+d0fzHH/0= - dependencies: - "@babel/runtime" "^7.1.2" - "@hypnosphi/create-react-context" "^0.3.1" - deep-equal "^1.1.1" - popper.js "^1.14.4" - prop-types "^15.6.1" - typed-styles "^0.0.7" - warning "^4.0.2" - -react-scripts@3.4.1: - version "3.4.1" - resolved "https://registry.npmmirror.com/react-scripts/download/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a" - integrity sha1-9VEpi1xxmFzEkbms88jowK462go= - dependencies: - "@babel/core" "7.9.0" - "@svgr/webpack" "4.3.3" - "@typescript-eslint/eslint-plugin" "^2.10.0" - "@typescript-eslint/parser" "^2.10.0" - babel-eslint "10.1.0" - babel-jest "^24.9.0" - babel-loader "8.1.0" - babel-plugin-named-asset-import "^0.3.6" - babel-preset-react-app "^9.1.2" - camelcase "^5.3.1" - case-sensitive-paths-webpack-plugin "2.3.0" - css-loader "3.4.2" - dotenv "8.2.0" - dotenv-expand "5.1.0" - eslint "^6.6.0" - eslint-config-react-app "^5.2.1" - eslint-loader "3.0.3" - eslint-plugin-flowtype "4.6.0" - eslint-plugin-import "2.20.1" - eslint-plugin-jsx-a11y "6.2.3" - eslint-plugin-react "7.19.0" - eslint-plugin-react-hooks "^1.6.1" - file-loader "4.3.0" - fs-extra "^8.1.0" - html-webpack-plugin "4.0.0-beta.11" - identity-obj-proxy "3.0.0" - jest "24.9.0" - jest-environment-jsdom-fourteen "1.0.1" - jest-resolve "24.9.0" - jest-watch-typeahead "0.4.2" - mini-css-extract-plugin "0.9.0" - optimize-css-assets-webpack-plugin "5.0.3" - pnp-webpack-plugin "1.6.4" - postcss-flexbugs-fixes "4.1.0" - postcss-loader "3.0.0" - postcss-normalize "8.0.1" - postcss-preset-env "6.7.0" - postcss-safe-parser "4.0.1" - react-app-polyfill "^1.0.6" - react-dev-utils "^10.2.1" - resolve "1.15.0" - resolve-url-loader "3.1.1" - sass-loader "8.0.2" - semver "6.3.0" - style-loader "0.23.1" - terser-webpack-plugin "2.3.5" - ts-pnp "1.1.6" - url-loader "2.3.0" - webpack "4.42.0" - webpack-dev-server "3.10.3" - webpack-manifest-plugin "2.2.0" - workbox-webpack-plugin "4.3.1" - optionalDependencies: - fsevents "2.1.2" - -react-textarea-autosize@^8.3.2: - version "8.3.3" - resolved "https://registry.npmmirror.com/react-textarea-autosize/download/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8" - integrity sha1-9wkTlFNp2kU/1VTBaPa6rNH6BNg= - dependencies: - "@babel/runtime" "^7.10.2" - use-composed-ref "^1.0.0" - use-latest "^1.0.0" - -react@^16.13.1: - version "16.14.0" - resolved "https://registry.npmmirror.com/react/download/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/read-pkg-up/download/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/read-pkg-up/download/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - integrity sha1-GyIcYIi6d5lgHICPkRYcZuWPiXg= - dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/read-pkg-up/download/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha1-86YTV1hFlzOuK5VjgFbhhU5+9Qc= - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/read-pkg/download/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/read-pkg/download/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/read-pkg/download/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w= - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.npmmirror.com/readable-stream/download/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.npmmirror.com/readable-stream/download/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha1-M3u9o63AcGvT4CRCaihtS0sskZg= - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.npmmirror.com/readdirp/download/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha1-DodiKjMlqjPokihcr4tOhGUppSU= - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmmirror.com/readdirp/download/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc= - dependencies: - picomatch "^2.2.1" - -realpath-native@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/realpath-native/download/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" - integrity sha1-IAMpT+oj+wZy8kduviL89Jii1lw= - dependencies: - util.promisify "^1.0.0" - -recursive-readdir@2.2.2: - version "2.2.2" - resolved "https://registry.npmmirror.com/recursive-readdir/download/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" - integrity sha1-mUb7MnThYo3m42svZxSVO0hFCU8= - dependencies: - minimatch "3.0.4" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/redent/download/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha1-5Ve3mYMWu1PJ8fVvpiY1LGljBZ8= - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -redux@^4.0.4: - version "4.1.2" - resolved "https://registry.npmmirror.com/redux/download/redux-4.1.2.tgz#140f35426d99bb4729af760afcf79eaaac407104" - integrity sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw== - dependencies: - "@babel/runtime" "^7.9.2" - -regenerate-unicode-properties@^9.0.0: - version "9.0.0" - resolved "https://registry.npmmirror.com/regenerate-unicode-properties/download/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" - integrity sha1-VNCccRXh9T3CMUqXSzLBw0Tv4yY= - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npmmirror.com/regenerate/download/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo= - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.npmmirror.com/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.npmmirror.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.npmmirror.com/regenerator-transform/download/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ= - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/regex-not/download/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regex-parser@2.2.10: - version "2.2.10" - resolved "https://registry.npmmirror.com/regex-parser/download/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" - integrity sha1-nmao9z2JoQdhbmOznU3t3+6RKzc= - -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: - version "1.4.1" - resolved "https://registry.npmmirror.com/regexp.prototype.flags/download/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" - integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/regexpp/download/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha1-jRnTHPYySCtYkEn4KB+T28uk0H8= - -regexpp@^3.0.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/regexpp/download/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha1-BCWido2PI7rXDKS5BGH6LxIT4bI= - -regexpu-core@^4.7.1: - version "4.8.0" - resolved "https://registry.npmmirror.com/regexpu-core/download/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" - integrity sha1-5WBbo2G2excYR4UBMnUC9EeamPA= - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^9.0.0" - regjsgen "^0.5.2" - regjsparser "^0.7.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regjsgen@^0.5.2: - version "0.5.2" - resolved "https://registry.npmmirror.com/regjsgen/download/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM= - -regjsparser@^0.7.0: - version "0.7.0" - resolved "https://registry.npmmirror.com/regjsparser/download/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" - integrity sha1-prZntUyIXhi1JVTLSWDvcRh+mWg= - dependencies: - jsesc "~0.5.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.npmmirror.com/relateurl/download/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= - -remark-parse@^9.0.0: - version "9.0.0" - resolved "https://registry.npmmirror.com/remark-parse/download/remark-parse-9.0.0.tgz?cache=0&sync_timestamp=1637259966298&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fremark-parse%2Fdownload%2Fremark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" - integrity sha1-TSCimWZYgOT0r12Qt8e4qTWFNkA= - dependencies: - mdast-util-from-markdown "^0.8.0" - -remark-stringify@^9.0.0: - version "9.0.1" - resolved "https://registry.npmmirror.com/remark-stringify/download/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" - integrity sha1-V20G6RBUiwpxkacfJ7M/EhiGKJQ= - dependencies: - mdast-util-to-markdown "^0.6.0" - -remark@^13.0.0: - version "13.0.0" - resolved "https://registry.npmmirror.com/remark/download/remark-13.0.0.tgz?cache=0&sync_timestamp=1637260202521&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fremark%2Fdownload%2Fremark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425" - integrity sha1-0V2b9xpAL0Aofr42Bntm1Uho5CU= - dependencies: - remark-parse "^9.0.0" - remark-stringify "^9.0.0" - unified "^9.1.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.npmmirror.com/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -renderkid@^2.0.4: - version "2.0.7" - resolved "https://registry.npmmirror.com/renderkid/download/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" - integrity sha1-Rk8namvc7mBvShWZP5sp/HTKhgk= - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^3.0.1" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.npmmirror.com/repeat-element/download/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek= - -repeat-string@^1.0.0, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.npmmirror.com/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/request-promise-core/download/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha1-Pu3UIjII1BmGe3jOgVFn0QWToi8= - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.5: - version "1.0.9" - resolved "https://registry.npmmirror.com/request-promise-native/download/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha1-5AcSBSal79yaObKKVnm/R7nZ3Cg= - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.87.0, request@^2.88.0: - version "2.88.2" - resolved "https://registry.npmmirror.com/request/download/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/require-directory/download/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/require-from-string/download/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk= - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/require-main-filename/download/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/require-main-filename/download/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs= - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.npmmirror.com/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ= - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/resolve-cwd/download/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/resolve-from/download/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/resolve-from/download/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY= - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/resolve-from/download/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha1-w1IlhD3493bfIcV1V7wIfp39/Gk= - -resolve-url-loader@3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/resolve-url-loader/download/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" - integrity sha1-KJMYlfoeq5vgZH07KVjBAK48C/A= - dependencies: - adjust-sourcemap-loader "2.0.0" - camelcase "5.3.1" - compose-function "3.0.3" - convert-source-map "1.7.0" - es6-iterator "2.0.3" - loader-utils "1.2.3" - postcss "7.0.21" - rework "1.0.1" - rework-visit "1.0.0" - source-map "0.6.1" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.npmmirror.com/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.npmmirror.com/resolve/download/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -resolve@1.15.0: - version "1.15.0" - resolved "https://registry.npmmirror.com/resolve/download/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" - integrity sha1-G3ypYHPrtS50H/15n2s56kYsZ/U= - dependencies: - path-parse "^1.0.6" - -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: - version "1.22.0" - resolved "https://registry.npmmirror.com/resolve/download/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/restore-cursor/download/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha1-OfZ8VLOnpYzqUjbZXPADQjljH34= - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.npmmirror.com/ret/download/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.npmmirror.com/retry/download/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/reusify/download/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY= - -rework-visit@1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/rework-visit/download/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" - integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= - -rework@1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/rework/download/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" - integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= - dependencies: - convert-source-map "^0.3.3" - css "^2.0.0" - -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/rgb-regex/download/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/rgba-regex/download/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.npmmirror.com/rimraf/download/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha1-stEE/g2Psnz54KHNqCYt04M8bKs= - dependencies: - glob "^7.1.3" - -rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: - version "2.7.1" - resolved "https://registry.npmmirror.com/rimraf/download/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w= - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/rimraf/download/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho= - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/ripemd160/download/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw= - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.npmmirror.com/rsvp/download/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha1-yPFVMR0Wf2jyHhaN9x7FsIMRNzQ= - -run-async@^2.2.0, run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.npmmirror.com/run-async/download/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU= - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmmirror.com/run-parallel/download/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4= - dependencies: - queue-microtask "^1.2.2" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/run-queue/download/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -rxjs@^6.5.3, rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.npmmirror.com/rxjs/download/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmmirror.com/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/safe-regex/download/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.npmmirror.com/sane/download/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha1-7Ygf2SJzOmxGG8GJ3CtsAG8//e0= - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sanitize.css@^10.0.0: - version "10.0.0" - resolved "https://registry.npmmirror.com/sanitize.css/download/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" - integrity sha1-tcslR+lthimmCUdURmUkOx3DZXo= - -sass-loader@8.0.2: - version "8.0.2" - resolved "https://registry.npmmirror.com/sass-loader/download/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" - integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== - dependencies: - clone-deep "^4.0.1" - loader-utils "^1.2.3" - neo-async "^2.6.1" - schema-utils "^2.6.1" - semver "^6.3.0" - -sax@^1.2.4, sax@~1.2.4: - version "1.2.4" - resolved "https://registry.npmmirror.com/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk= - -saxes@^3.1.9: - version "3.1.11" - resolved "https://registry.npmmirror.com/saxes/download/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" - integrity sha1-1Z0f0zLskq2YouCy7mRHAjhLHFs= - dependencies: - xmlchars "^2.1.1" - -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.npmmirror.com/scheduler/download/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha1-Tz4u0sGn1laB9MhU+oxaHMtA8ZY= - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/schema-utils/download/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A= - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.npmmirror.com/schema-utils/download/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc= - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -scroll-into-view-if-needed@^2.2.25: - version "2.2.28" - resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/download/scroll-into-view-if-needed-2.2.28.tgz#5a15b2f58a52642c88c8eca584644e01703d645a" - integrity sha1-WhWy9YpSZCyIyOylhGROAXA9ZFo= - dependencies: - compute-scroll-into-view "^1.0.17" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/select-hose/download/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= - -selfsigned@^1.10.7: - version "1.10.14" - resolved "https://registry.npmmirror.com/selfsigned/download/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" - integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== - dependencies: - node-forge "^0.10.0" - -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.2, semver@^7.3.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/serialize-javascript/download/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" - integrity sha1-7OxTsOAxe9yV73arcHS3OEeF+mE= - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/serialize-javascript/download/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao= - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.npmmirror.com/serve-index/download/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/set-value/download/set-value-2.0.1.tgz?cache=0&sync_timestamp=1631437838608&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fset-value%2Fdownload%2Fset-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha1-oY1AUw5vB95CKMfe/kInr4ytAFs= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4, setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/setimmediate/download/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/setprototypeof/download/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY= - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.npmmirror.com/sha.js/download/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc= - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallow-clone@^0.1.2: - version "0.1.2" - resolved "https://registry.npmmirror.com/shallow-clone/download/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" - integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= - dependencies: - is-extendable "^0.1.1" - kind-of "^2.0.1" - lazy-cache "^0.2.3" - mixin-object "^2.0.1" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/shallow-clone/download/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha1-jymBrZJTH1UDWwH7IwdppA4C76M= - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/shallowequal/download/shallowequal-1.1.0.tgz?cache=0&sync_timestamp=1624608058307&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshallowequal%2Fdownload%2Fshallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha1-GI1SHelbkIdAT9TctosT3wrk5/g= - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/shebang-command/download/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/shebang-regex/download/shebang-regex-1.0.0.tgz?cache=0&sync_timestamp=1628896660639&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/shebang-regex/download/shebang-regex-3.0.0.tgz?cache=0&sync_timestamp=1628896660639&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= - -shell-quote@1.7.2: - version "1.7.2" - resolved "https://registry.npmmirror.com/shell-quote/download/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha1-Z6fQLHbJ2iT5nSCAj8re0ODgS+I= - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.npmmirror.com/shellwords/download/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha1-1rkYHBpI05cyTISHHvvPxz/AZUs= - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.6" - resolved "https://registry.npmmirror.com/signal-exit/download/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" - integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.npmmirror.com/simple-swizzle/download/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/sisteransi/download/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha1-E01oEpd1ZDfMBcoBNw06elcQde0= - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/slash/download/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/slash/download/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q= - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/slash/download/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ= - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/slice-ansi/download/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY= - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/slice-ansi/download/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms= - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/snapdragon-node/download/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/snapdragon-util/download/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI= - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.npmmirror.com/snapdragon/download/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0= - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sockjs-client@1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/sockjs-client/download/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha1-yfJWjhnI/YFztJl+o0IOC7MGx9U= - dependencies: - debug "^3.2.5" - eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" - -sockjs@0.3.19: - version "0.3.19" - resolved "https://registry.npmmirror.com/sockjs/download/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== - dependencies: - faye-websocket "^0.10.0" - uuid "^3.0.1" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.npmmirror.com/sort-keys/download/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/source-list-map/download/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ= - -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: - version "0.5.3" - resolved "https://registry.npmmirror.com/source-map-resolve/download/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha1-GQhmvs51U+H48mei7oLGBrVQmho= - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.6, source-map-support@~0.5.12: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.npmmirror.com/source-map-url/download/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha1-CvZmBadFpaL5HPG7+KevvCg97FY= - -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmmirror.com/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.npmmirror.com/source-map/download/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/spdx-correct/download/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha1-3s6BrJweZxPl99G28X1Gj6U9iak= - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0= - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha1-z3D1BILu/cmOPOCmgz5KU87rpnk= - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.npmmirror.com/spdx-license-ids/download/spdx-license-ids-3.0.11.tgz?cache=0&sync_timestamp=1636978442514&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/spdy-transport/download/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha1-ANSGOmQArXXfkzYaFghgXl3NzzE= - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.1: - version "4.0.2" - resolved "https://registry.npmmirror.com/spdy/download/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha1-t09GYgOj7aRSwCSSuR+56EonZ3s= - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -specificity@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/specificity/download/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" - integrity sha1-qrXmRQEtsIuhguFRFlc40AiHsBk= - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.npmmirror.com/split-string/download/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.npmmirror.com/sshpk/download/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.npmmirror.com/ssri/download/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha1-FXk5E08gRk5zAd26PpD/qPdyisU= - dependencies: - figgy-pudding "^3.5.1" - -ssri@^7.0.0: - version "7.1.1" - resolved "https://registry.npmmirror.com/ssri/download/ssri-7.1.1.tgz#33e44f896a967158e3c63468e47ec46613b95b5f" - integrity sha1-M+RPiWqWcVjjxjRo5H7EZhO5W18= - dependencies: - figgy-pudding "^3.5.1" - minipass "^3.1.1" - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmmirror.com/stable/download/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88= - -stack-utils@^1.0.1: - version "1.0.5" - resolved "https://registry.npmmirror.com/stack-utils/download/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" - integrity sha1-oZsLAZR+ACnI5FHV1hpJj1uxRxs= - dependencies: - escape-string-regexp "^2.0.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.npmmirror.com/static-extend/download/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmmirror.com/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/stealthy-require/download/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/stream-browserify/download/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs= - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.npmmirror.com/stream-each/download/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha1-6+J6DDibBPvMIzZClS4Qcxr6m64= - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.npmmirror.com/stream-http/download/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw= - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/stream-shift/download/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha1-1wiCgVWasneEJCebCHfaPDktWj0= - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -string-convert@^0.2.0: - version "0.2.1" - resolved "https://registry.npmmirror.com/string-convert/download/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" - integrity sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c= - -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/string-length/download/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.0" - -string-length@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/string-length/download/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" - integrity sha1-EH74wjRW4Yeoq9SmEWL/SsbiWDc= - dependencies: - astral-regex "^1.0.0" - strip-ansi "^5.2.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/string-width/download/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/string-width/download/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha1-InZ74htirxCBV0MG9prFG2IgOWE= - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA= - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.matchall@^4.0.2: - version "4.0.6" - resolved "https://registry.npmmirror.com/string.prototype.matchall/download/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" - integrity sha1-Wrtdq8lMew6iOA9lumELOlRLFfo= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.3.1" - side-channel "^1.0.4" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha1-51rpDClCxjUEaGwYsoe0oLGkX4A= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmmirror.com/string_decoder/download/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4= - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/stringify-object/download/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha1-cDBlrvyhkwDTzoivT1s5VtdVZik= - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI= - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk= - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/strip-bom/download/strip-bom-3.0.0.tgz?cache=0&sync_timestamp=1624608094529&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-bom%2Fdownload%2Fstrip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-comments@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/strip-comments/download/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" - integrity sha1-grnEXn8FhzvuU/NxaK+TCqNoZ50= - dependencies: - babel-extract-comments "^1.0.0" - babel-plugin-transform-object-rest-spread "^6.26.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/strip-eof/download/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/strip-indent/download/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha1-wy4c7pQLazQyx3G8LFS8znPNMAE= - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.0.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/strip-json-comments/download/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY= - -style-loader@0.23.1: - version "0.23.1" - resolved "https://registry.npmmirror.com/style-loader/download/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" - integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== - dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" - -style-search@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/style-search/download/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" - integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= - -style-value-types@^3.1.9: - version "3.2.0" - resolved "https://registry.npmmirror.com/style-value-types/download/style-value-types-3.2.0.tgz#eb89cab1340823fa7876f3e289d29d99c92111bb" - integrity sha1-64nKsTQII/p4dvPiidKdmckhEbs= - dependencies: - hey-listen "^1.0.8" - tslib "^1.10.0" - -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.npmmirror.com/stylehacks/download/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU= - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -stylelint-config-recommended@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/stylelint-config-recommended/download/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657" - integrity sha1-4OVHQ0AWxVOf4mUK/VgEmi/R1lc= - -stylelint-config-standard@^20.0.0: - version "20.0.0" - resolved "https://registry.npmmirror.com/stylelint-config-standard/download/stylelint-config-standard-20.0.0.tgz?cache=0&sync_timestamp=1636911768470&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstylelint-config-standard%2Fdownload%2Fstylelint-config-standard-20.0.0.tgz#06135090c9e064befee3d594289f50e295b5e20d" - integrity sha1-BhNQkMngZL7+49WUKJ9Q4pW14g0= - dependencies: - stylelint-config-recommended "^3.0.0" - -stylelint@^13.6.1: - version "13.13.1" - resolved "https://registry.npmmirror.com/stylelint/download/stylelint-13.13.1.tgz#fca9c9f5de7990ab26a00f167b8978f083a18f3c" - integrity sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ== - dependencies: - "@stylelint/postcss-css-in-js" "^0.37.2" - "@stylelint/postcss-markdown" "^0.36.2" - autoprefixer "^9.8.6" - balanced-match "^2.0.0" - chalk "^4.1.1" - cosmiconfig "^7.0.0" - debug "^4.3.1" - execall "^2.0.0" - fast-glob "^3.2.5" - fastest-levenshtein "^1.0.12" - file-entry-cache "^6.0.1" - get-stdin "^8.0.0" - global-modules "^2.0.0" - globby "^11.0.3" - globjoin "^0.1.4" - html-tags "^3.1.0" - ignore "^5.1.8" - import-lazy "^4.0.0" - imurmurhash "^0.1.4" - known-css-properties "^0.21.0" - lodash "^4.17.21" - log-symbols "^4.1.0" - mathml-tag-names "^2.1.3" - meow "^9.0.0" - micromatch "^4.0.4" - normalize-selector "^0.2.0" - postcss "^7.0.35" - postcss-html "^0.36.0" - postcss-less "^3.1.4" - postcss-media-query-parser "^0.2.3" - postcss-resolve-nested-selector "^0.1.1" - postcss-safe-parser "^4.0.2" - postcss-sass "^0.4.4" - postcss-scss "^2.1.1" - postcss-selector-parser "^6.0.5" - postcss-syntax "^0.36.2" - postcss-value-parser "^4.1.0" - resolve-from "^5.0.0" - slash "^3.0.0" - specificity "^0.4.1" - string-width "^4.2.2" - strip-ansi "^6.0.0" - style-search "^0.1.0" - sugarss "^2.0.0" - svg-tags "^1.0.0" - table "^6.6.0" - v8-compile-cache "^2.3.0" - write-file-atomic "^3.0.3" - -sugarss@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/sugarss/download/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d" - integrity sha1-3dduASSyl9QL88yjHIsi7LQ7xh0= - dependencies: - postcss "^7.0.2" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/supports-color/download/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmmirror.com/supports-color/download/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/supports-color/download/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha1-B2Srxpxj1ayELdSGfo0CXogN+PM= - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha1-G33NyzK4E4gBs+R4umpRyqiWSNo= - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/download/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-parser@^2.0.0: - version "2.0.4" - resolved "https://registry.npmmirror.com/svg-parser/download/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" - integrity sha1-/cLinhOVFzYUC3bLEiyO5mMOtrU= - -svg-tags@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/svg-tags/download/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" - integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= - -svgo@^1.0.0, svgo@^1.2.2: - version "1.3.2" - resolved "https://registry.npmmirror.com/svgo/download/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -symbol-tree@^3.2.2: - version "3.2.4" - resolved "https://registry.npmmirror.com/symbol-tree/download/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha1-QwY30ki6d+B4iDlR+5qg7tfGP6I= - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.npmmirror.com/table/download/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha1-EpLRlQDOP4YFOwXw6Ofko7shB54= - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -table@^6.6.0: - version "6.8.0" - resolved "https://registry.npmmirror.com/table/download/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/tapable/download/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -terser-webpack-plugin@2.3.5: - version "2.3.5" - resolved "https://registry.npmmirror.com/terser-webpack-plugin/download/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81" - integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w== - dependencies: - cacache "^13.0.1" - find-cache-dir "^3.2.0" - jest-worker "^25.1.0" - p-limit "^2.2.2" - schema-utils "^2.6.4" - serialize-javascript "^2.1.2" - source-map "^0.6.1" - terser "^4.4.3" - webpack-sources "^1.4.3" - -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.npmmirror.com/terser-webpack-plugin/download/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2, terser@^4.4.3, terser@^4.6.3: - version "4.8.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" - integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.npmmirror.com/test-exclude/download/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - integrity sha1-w9Ph4xHrfuQF4JLawQrv0JCR6sA= - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" - -text-table@0.2.0, text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/text-table/download/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/throat/download/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.npmmirror.com/through2/download/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0= - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.npmmirror.com/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.npmmirror.com/thunky/download/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30= - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.npmmirror.com/timers-browserify/download/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha1-RKRcEfv0B/NPl7zNFXfGUjYbAO4= - dependencies: - setimmediate "^1.0.4" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/timsort/download/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.npmmirror.com/tmp/download/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/tmpl/download/tmpl-1.0.5.tgz?cache=0&sync_timestamp=1630997304688&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftmpl%2Fdownload%2Ftmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha1-hoPguQK7nCDE9ybjwLafNlGMB8w= - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/to-object-path/download/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.npmmirror.com/to-regex-range/download/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/to-regex/download/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.npmmirror.com/toggle-selection/download/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" - integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.npmmirror.com/tough-cookie/download/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha1-zZ+yoKodWhK0c72fuW+j3P9lreI= - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/tr46/download/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmmirror.com/tr46/download/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/trim-newlines/download/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha1-Jgpdli2LdSQlsy86fbDcrNF2wUQ= - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.npmmirror.com/trough/download/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha1-uLY5zvrX0LsqvTfUM/+Ck++l9AY= - -ts-pnp@1.1.6: - version "1.1.6" - resolved "https://registry.npmmirror.com/ts-pnp/download/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" - integrity sha1-OJokOW1CWg0xYultK0Y4kA/cKJo= - -ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.npmmirror.com/ts-pnp/download/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" - integrity sha1-pQCtCEsHmPHDBxrzkeZZEshrypI= - -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.npmmirror.com/tslib/download/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.3: - version "2.3.1" - resolved "https://registry.npmmirror.com/tslib/download/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tsutils@^3.17.1: - version "3.21.0" - resolved "https://registry.npmmirror.com/tsutils/download/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM= - dependencies: - tslib "^1.8.1" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.npmmirror.com/tty-browserify/download/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.npmmirror.com/tweetnacl/download/tweetnacl-0.14.5.tgz?cache=0&sync_timestamp=1624607953624&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftweetnacl%2Fdownload%2Ftweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.npmmirror.com/type-check/download/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha1-20vBUaSiz07r+a3V23VQjbbMhB8= - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc= - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha1-jSojcNPfiG61yQraHFv2GIrPg4s= - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha1-CeJJ696FHTseSNJ8EFREZn8XuD0= - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.npmmirror.com/type/download/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.5.0" - resolved "https://registry.npmmirror.com/type/download/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" - integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== - -type@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== - -typed-styles@^0.0.7: - version "0.0.7" - resolved "https://registry.npmmirror.com/typed-styles/download/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" - integrity sha1-kzkqAIeUxFlRGf9i3eaAnbxAo9k= - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmmirror.com/typedarray-to-buffer/download/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha1-qX7nqf9CaRufeD/xvFES/j/KkIA= - dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.npmmirror.com/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@^3.9.6: - version "3.9.10" - resolved "https://registry.npmmirror.com/typescript/download/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" - integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== - -ua-parser-js@^0.7.30: - version "0.7.33" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" - integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/unbox-primitive/download/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha1-CF4hViXsMWJXTciFmr7nilmxRHE= - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631615391251&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-canonical-property-names-ecmascript%2Fdownload%2Funicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha1-MBrNxSVjFnDTn2FG4Od/9rvevdw= - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631618607567&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-match-property-ecmascript%2Fdownload%2Funicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha1-VP0W4OyxZ88Ezx91a9zJLrp5dsM= - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631618158421&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-match-property-value-ecmascript%2Fdownload%2Funicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha1-GgGqVyR8FMVouJd1pUk4eIGJpxQ= - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-property-aliases-ecmascript%2Fdownload%2Funicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha1-CjbLmlhcT2q9Ua0d7dsoXBZSl8g= - -unified@^9.1.0: - version "9.2.2" - resolved "https://registry.npmmirror.com/unified/download/unified-9.2.2.tgz?cache=0&sync_timestamp=1637256363650&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Funified%2Fdownload%2Funified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha1-Z2SaGr/Dq4XSlpUCkCd16wMUaXU= - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/union-value/download/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc= - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/uniq/download/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/uniqs/download/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/unique-filename/download/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA= - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.npmmirror.com/unique-slug/download/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha1-uqvOkQg/xk6UWw861hPiZPfNTmw= - dependencies: - imurmurhash "^0.1.4" - -unist-util-find-all-after@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/unist-util-find-all-after/download/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6" - integrity sha1-/f7NFMW3rqXp7zjV4NX3dO61YfY= - dependencies: - unist-util-is "^4.0.0" - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/unist-util-is/download/unist-util-is-4.1.0.tgz?cache=0&sync_timestamp=1626875281214&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-is%2Fdownload%2Funist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha1-l25fRip6Xec9lLcGusG5BnG1d5c= - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.npmmirror.com/unist-util-stringify-position/download/unist-util-stringify-position-2.0.3.tgz?cache=0&sync_timestamp=1624607967709&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funist-util-stringify-position%2Fdownload%2Funist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha1-zOO/oc34W6c3XR1bF73Eytqb2do= - dependencies: - "@types/unist" "^2.0.2" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.npmmirror.com/universalify/download/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY= - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/unquote/download/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/unset-value/download/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.npmmirror.com/upath/download/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ= - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmmirror.com/uri-js/download/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34= - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/urix/download/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-loader@2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/url-loader/download/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" - integrity sha1-4OLvZY8APvuMpBsPP/v3a6uIZYs= - dependencies: - loader-utils "^1.2.3" - mime "^2.4.4" - schema-utils "^2.5.0" - -url-parse@^1.4.3: - version "1.5.4" - resolved "https://registry.npmmirror.com/url-parse/download/url-parse-1.5.4.tgz#e4f645a7e2a0852cc8a66b14b292a3e9a11a97fd" - integrity sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.npmmirror.com/url/download/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use-composed-ref@^1.0.0: - version "1.2.1" - resolved "https://registry.npmmirror.com/use-composed-ref/download/use-composed-ref-1.2.1.tgz#9bdcb5ccd894289105da2325e1210079f56bf849" - integrity sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw== - -use-isomorphic-layout-effect@^1.0.0: - version "1.1.1" - resolved "https://registry.npmmirror.com/use-isomorphic-layout-effect/download/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225" - integrity sha1-e7ZYkXDNKYehUgQvkIT57/t1wiU= - -use-latest@^1.0.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/use-latest/download/use-latest-1.2.0.tgz#a44f6572b8288e0972ec411bdd0840ada366f232" - integrity sha1-pE9lcrgojgly7EEb3QhAraNm8jI= - dependencies: - use-isomorphic-layout-effect "^1.0.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/use/download/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/util-deprecate/download/util-deprecate-1.0.2.tgz?cache=0&sync_timestamp=1624607944834&other_urls=https%3A%2F%2Fregistry.nlark.com%2Futil-deprecate%2Fdownload%2Futil-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/util.promisify/download/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA= - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util.promisify@^1.0.0: - version "1.1.1" - resolved "https://registry.npmmirror.com/util.promisify/download/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" - integrity sha1-d4MvV87SyUeBdBScrpuW6ZGM1Us= - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - for-each "^0.3.3" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.1" - -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/util.promisify/download/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha1-a693dLgO6w91INi4HQeYKlmruu4= - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.npmmirror.com/util/download/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.npmmirror.com/util/download/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.npmmirror.com/utila/download/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^3.0.1, uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.npmmirror.com/uuid/download/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.1: - version "8.3.2" - resolved "https://registry.npmmirror.com/uuid/download/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4= - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.npmmirror.com/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validator@^13.1.1: - version "13.7.0" - resolved "https://registry.npmmirror.com/validator/download/validator-13.7.0.tgz?cache=0&sync_timestamp=1635822643143&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fvalidator%2Fdownload%2Fvalidator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" - integrity sha1-T5ZYuhO6jz2C7ogdNRZInqhcCFc= - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/vendors/download/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha1-4rgApT56Kbk1BsPPQRANFsTErY4= - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.npmmirror.com/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.npmmirror.com/vfile-message/download/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha1-W0O4gXHUCerlhHfRPyPdQdUsNxo= - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.npmmirror.com/vfile/download/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha1-A/Hc4o/GJcYlvGUUNQ+9sA+p5iQ= - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -vis-network@7.3.5: - version "7.3.5" - resolved "https://registry.npmmirror.com/vis-network/download/vis-network-7.3.5.tgz#367f3a1c19ba1b677dc3dec495f7e0d235e1fd59" - integrity sha1-Nn86HBm6G2d9w97Elffg0jXh/Vk= - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.npmmirror.com/vm-browserify/download/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha1-eGQcSIuObKkadfUR56OzKobl3aA= - -void-elements@3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/void-elements/download/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" - integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= - -w3c-hr-time@^1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/w3c-hr-time/download/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha1-ConN9cwVgi35w2BUNnaWPgzDCM0= - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/w3c-xmlserializer/download/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" - integrity sha1-MEhcp9cKb9BSQgo9Ev2Q5jOc55Q= - dependencies: - domexception "^1.0.1" - webidl-conversions "^4.0.2" - xml-name-validator "^3.0.0" - -walker@^1.0.7, walker@~1.0.5: - version "1.0.8" - resolved "https://registry.npmmirror.com/walker/download/walker-1.0.8.tgz?cache=0&sync_timestamp=1635238315480&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwalker%2Fdownload%2Fwalker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha1-vUmNtHev5XPcBBhfAR06uKjXZT8= - dependencies: - makeerror "1.0.12" - -warning@^4.0.2, warning@^4.0.3: - version "4.0.3" - resolved "https://registry.npmmirror.com/warning/download/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha1-Fungd+uKhtavfWSqHgX9hbRnjKM= - dependencies: - loose-envify "^1.0.0" - -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/watchpack-chokidar2/download/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" - integrity sha1-OFAAcu5uzmbzdpk2lQ6hdxvhyVc= - dependencies: - chokidar "^2.1.8" - -watchpack@^1.6.0: - version "1.7.5" - resolved "https://registry.npmmirror.com/watchpack/download/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" - integrity sha1-EmfmxV4Lm1vkTCAjrtVDeiwmxFM= - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.npmmirror.com/wbuf/download/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha1-wdjRSTFtPqhShIiVy2oL/oh7h98= - dependencies: - minimalistic-assert "^1.0.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/webidl-conversions/download/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/webidl-conversions/download/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha1-qFWYCx8LazWbodXZ+zmulB+qY60= - -webpack-dev-middleware@^3.7.2: - version "3.7.3" - resolved "https://registry.npmmirror.com/webpack-dev-middleware/download/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" - integrity sha1-Bjk3KxQyYuK4SrldO5GnWXBhwsU= - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-server@3.10.3: - version "3.10.3" - resolved "https://registry.npmmirror.com/webpack-dev-server/download/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" - integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== - dependencies: - ansi-html "0.0.7" - bonjour "^3.5.0" - chokidar "^2.1.8" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" - express "^4.17.1" - html-entities "^1.2.1" - http-proxy-middleware "0.19.1" - import-local "^2.0.0" - internal-ip "^4.3.0" - ip "^1.1.5" - is-absolute-url "^3.0.3" - killable "^1.0.1" - loglevel "^1.6.6" - opn "^5.5.0" - p-retry "^3.0.1" - portfinder "^1.0.25" - schema-utils "^1.0.0" - selfsigned "^1.10.7" - semver "^6.3.0" - serve-index "^1.9.1" - sockjs "0.3.19" - sockjs-client "1.4.0" - spdy "^4.0.1" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.2" - webpack-log "^2.0.0" - ws "^6.2.1" - yargs "12.0.5" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/webpack-log/download/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8= - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" - -webpack-manifest-plugin@2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/webpack-manifest-plugin/download/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" - integrity sha1-GcpptDWwuux+KfvpD7QBXeLeTxY= - dependencies: - fs-extra "^7.0.0" - lodash ">=3.5 <5" - object.entries "^1.1.0" - tapable "^1.0.0" - -webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.npmmirror.com/webpack-sources/download/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha1-7t2OwLko+/HL/plOItLYkPMwqTM= - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@4.42.0: - version "4.42.0" - resolved "https://registry.npmmirror.com/webpack/download/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" - integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.2.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.1" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.6.0" - webpack-sources "^1.4.1" - -websocket-driver@>=0.5.1: - version "0.7.4" - resolved "https://registry.npmmirror.com/websocket-driver/download/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha1-ia1Slbv2S0gKvLox5JU6ynBvV2A= - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.npmmirror.com/websocket-extensions/download/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha1-f4RzvIOd/YdgituV1+sHUhFXikI= - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/whatwg-encoding/download/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha1-WrrPd3wyFmpR0IXWtPPn0nET3bA= - dependencies: - iconv-lite "0.4.24" - -whatwg-fetch@^3.0.0: - version "3.6.2" - resolved "https://registry.npmmirror.com/whatwg-fetch/download/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha1-3O0k838mJO0CgXJdUdDi4/5nf4w= - -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/whatwg-mimetype/download/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha1-PUseAxLSB5h5+Cav8Y2+7KWWD78= - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/whatwg-url/download/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.npmmirror.com/whatwg-url/download/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha1-8t8Cv/F2/WUHDfdK1cy7WhmZZag= - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.npmmirror.com/whatwg-url/download/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha1-wsSS8eymEpiO/T0iZr4bn8YXDQY= - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY= - dependencies: - 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" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/which-module/download/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9, which@^1.3.0, which@^1.3.1: - version "1.3.1" - resolved "https://registry.npmmirror.com/which/download/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/which/download/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= - dependencies: - isexe "^2.0.0" - -word-wrap@~1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" - integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== - -workbox-background-sync@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-background-sync/download/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" - integrity sha1-JoIbm/Funjf9HWQCie3dwIr9GVA= - dependencies: - workbox-core "^4.3.1" - -workbox-broadcast-update@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-broadcast-update/download/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b" - integrity sha1-4sAoCxSeOlBJg7dXYGrQQfMyw1s= - dependencies: - workbox-core "^4.3.1" - -workbox-build@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-build/download/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64" - integrity sha1-QU9w+01t5H9lOGCLgOxSQS0jPmQ= - dependencies: - "@babel/runtime" "^7.3.4" - "@hapi/joi" "^15.0.0" - common-tags "^1.8.0" - fs-extra "^4.0.2" - glob "^7.1.3" - lodash.template "^4.4.0" - pretty-bytes "^5.1.0" - stringify-object "^3.3.0" - strip-comments "^1.0.2" - workbox-background-sync "^4.3.1" - workbox-broadcast-update "^4.3.1" - workbox-cacheable-response "^4.3.1" - workbox-core "^4.3.1" - workbox-expiration "^4.3.1" - workbox-google-analytics "^4.3.1" - workbox-navigation-preload "^4.3.1" - workbox-precaching "^4.3.1" - workbox-range-requests "^4.3.1" - workbox-routing "^4.3.1" - workbox-strategies "^4.3.1" - workbox-streams "^4.3.1" - workbox-sw "^4.3.1" - workbox-window "^4.3.1" - -workbox-cacheable-response@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-cacheable-response/download/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91" - integrity sha1-9T4HkXnAlaPxnlMTsoSXXJFCjJE= - dependencies: - workbox-core "^4.3.1" - -workbox-core@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-core/download/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6" - integrity sha1-AF0sagahcUN6/WyikEpXJ+zXO+Y= - -workbox-expiration@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-expiration/download/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921" - integrity sha1-15BDNWICnlaDfzQdf1U8Snjr6SE= - dependencies: - workbox-core "^4.3.1" - -workbox-google-analytics@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-google-analytics/download/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a" - integrity sha1-ntoBg7EDiQtcJW5vTqFaHxVIUZo= - dependencies: - workbox-background-sync "^4.3.1" - workbox-core "^4.3.1" - workbox-routing "^4.3.1" - workbox-strategies "^4.3.1" - -workbox-navigation-preload@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-navigation-preload/download/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d" - integrity sha1-Kcjk21hDgDs0zZbcFV+evZr6RT0= - dependencies: - workbox-core "^4.3.1" - -workbox-precaching@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-precaching/download/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba" - integrity sha1-n8Re0SLZS74fDqlYT/WUCWB3HLo= - dependencies: - workbox-core "^4.3.1" - -workbox-range-requests@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-range-requests/download/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74" - integrity sha1-+KRwGIkiFFy/DAmpotXjVkUkTnQ= - dependencies: - workbox-core "^4.3.1" - -workbox-routing@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-routing/download/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda" - integrity sha1-pnWEGvYj4LsMZ85O2OckrAvtDNo= - dependencies: - workbox-core "^4.3.1" - -workbox-strategies@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-strategies/download/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646" - integrity sha1-0r4DxO8hTBFeGrKcnHWcn+Pp5kY= - dependencies: - workbox-core "^4.3.1" - -workbox-streams@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-streams/download/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3" - integrity sha1-C1facOmCVy3gnIdC3Qy0Cmt8LMM= - dependencies: - workbox-core "^4.3.1" - -workbox-sw@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-sw/download/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164" - integrity sha1-32njlcR5700USZNyvNhMD14kYWQ= - -workbox-webpack-plugin@4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-webpack-plugin/download/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd" - integrity sha1-R/9eocwHS2xA+1qGEIhjokEg1L0= - dependencies: - "@babel/runtime" "^7.0.0" - json-stable-stringify "^1.0.1" - workbox-build "^4.3.1" - -workbox-window@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/workbox-window/download/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3" - integrity sha1-7mBRvxDwavpUg8m436BTGZTt4PM= - dependencies: - workbox-core "^4.3.1" - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.npmmirror.com/worker-farm/download/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag= - dependencies: - errno "~0.1.7" - -worker-rpc@^0.1.0: - version "0.1.1" - resolved "https://registry.npmmirror.com/worker-rpc/download/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" - integrity sha1-y1Zb1tcHGo8WZgaGBR6WmtMvVNU= - dependencies: - microevent.ts "~0.1.1" - -wouter@^2.5.1: - version "2.7.5" - resolved "https://registry.npmmirror.com/wouter/download/wouter-2.7.5.tgz#c7466a2630bed3a4ec010aea0cda42a5bae69e5d" - integrity sha1-x0ZqJjC+06TsAQrqDNpCpbrmnl0= - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/wrap-ansi/download/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/wrap-ansi/download/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha1-H9H2cjXVttD+54EFYAG/tpTAOwk= - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmmirror.com/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@2.4.1: - version "2.4.1" - resolved "https://registry.npmmirror.com/write-file-atomic/download/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" - integrity sha1-0LBUY8GIroBDlv1asqNwBir4dSk= - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/write-file-atomic/download/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha1-Vr1cWlxwSBzRnFcb05q5ZaXeVug= - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write@1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/write/download/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM= - dependencies: - mkdirp "^0.5.1" - -ws@^5.2.0: - version "5.2.3" - resolved "https://registry.npmmirror.com/ws/download/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" - integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== - dependencies: - async-limiter "~1.0.0" - -ws@^6.1.2, ws@^6.2.1: - version "6.2.2" - resolved "https://registry.npmmirror.com/ws/download/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/xml-name-validator/download/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha1-auc+Bt5NjG5H+fsYH3jWSK1FfGo= - -xmlchars@^2.1.1: - version "2.2.0" - resolved "https://registry.npmmirror.com/xmlchars/download/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha1-Bg/hvLf5x2/ioX24apvDq4lCEMs= - -xregexp@^4.3.0: - version "4.4.1" - resolved "https://registry.npmmirror.com/xregexp/download/xregexp-4.4.1.tgz#c84a88fa79e9ab18ca543959712094492185fe65" - integrity sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag== - dependencies: - "@babel/runtime-corejs3" "^7.12.1" - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.npmmirror.com/xtend/download/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q= - -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.npmmirror.com/y18n/download/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8= - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmmirror.com/yallist/download/yallist-3.1.1.tgz?cache=0&sync_timestamp=1624607893982&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyallist%2Fdownload%2Fyallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha1-27fa+b/YusmrRev2ArjLrQ1dCP0= - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/yallist/download/yallist-4.0.0.tgz?cache=0&sync_timestamp=1624607893982&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyallist%2Fdownload%2Fyallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI= - -yaml@^1.10.0, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.npmmirror.com/yaml/download/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha1-h5oIZZc7yp9rq1y987HGfsfTvPQ= - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha1-Ew8JcC667vJlDVTObj5XBvek+zg= - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.npmmirror.com/yargs-parser/download/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha1-LrfcOwKJcY/ClfNidThFxBoMlO4= - -yargs@12.0.5: - version "12.0.5" - resolved "https://registry.npmmirror.com/yargs/download/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha1-BfWZe2CWR7ZPZrgeO0sQo2jnrRM= - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - -yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.npmmirror.com/yargs/download/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha1-rX/+/sGqWVZayRX4Lcyzipwxot0= - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.npmmirror.com/zwitch/download/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha1-0R1zgf/tFrdC9q97PyI9XNn+mSA= diff --git a/hugegraph-hubble/hubble-fe/src/api/auth-contract.test.js b/hugegraph-hubble/hubble-fe/src/api/auth-contract.test.js index e2f4dc2e0..e4041ab7e 100644 --- a/hugegraph-hubble/hubble-fe/src/api/auth-contract.test.js +++ b/hugegraph-hubble/hubble-fe/src/api/auth-contract.test.js @@ -1,10 +1,11 @@ /* + * * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -15,43 +16,69 @@ * limitations under the License. */ -import request from './request'; -import * as auth from './auth'; - -jest.mock('./request', () => ({ +const mockRequest = { get: jest.fn(), post: jest.fn(), put: jest.fn(), delete: jest.fn(), -})); +}; -beforeEach(() => { - jest.clearAllMocks(); -}); +jest.mock('./request', () => mockRequest); + +const auth = require('./auth'); + +describe('auth API contract', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('updates the current profile with PUT and a JSON body', () => { + const profile = {nickname: 'Alice', description: 'owner'}; + + auth.updatePersonal(profile); + + expect(mockRequest.put).toHaveBeenCalledWith('/auth/users/personal', profile); + }); + + it.each([ + ['getAllUserList', [{page_no: 1}], 'get', '/auth/users'], + ['getUserInfo', ['user'], 'get', '/auth/users/user'], + ['addUser', [{user_name: 'user'}], 'post', '/auth/users'], + ['updateUser', ['user', {user_nickname: 'User'}], 'put', + '/auth/users/user'], + ['updateAdminspace', ['user', ['SPACE']], 'post', + '/auth/users/updateadminspace/user'], + ['delUser', ['user'], 'delete', '/auth/users/user'], + ])('%s forwards page-owned error controls', (method, args, verb, route) => { + const config = {suppressBusinessErrorToast: true}; + auth[method](...args, config); + + if (verb === 'get' && method === 'getAllUserList') { + expect(mockRequest.get).toHaveBeenCalledWith( + route, {params: args[0], ...config} + ); + return; + } + if (verb === 'delete') { + expect(mockRequest[verb]).toHaveBeenCalledWith( + route, undefined, config + ); + return; + } + if (verb === 'get') { + expect(mockRequest[verb]).toHaveBeenCalledWith(route, config); + return; + } + expect(mockRequest[verb]).toHaveBeenCalledWith( + route, args.at(-1), config + ); + }); -test.each([ - ['getAllUserList', [{page_no: 1}], 'get', '/auth/users'], - ['getUserInfo', ['user'], 'get', '/auth/users/user'], - ['addUser', [{user_name: 'user'}], 'post', '/auth/users'], - ['updateUser', ['user', {user_nickname: 'User'}], 'put', '/auth/users/user'], - ['updateAdminspace', ['user', ['SPACE']], 'post', - '/auth/users/updateadminspace/user'], - ['delUser', ['user'], 'delete', '/auth/users/user'], -])('%s forwards page-owned error controls', (method, args, verb, route) => { - const config = {suppressBusinessErrorToast: true}; - auth[method](...args, config); - - if (verb === 'get' && method === 'getAllUserList') { - expect(request.get).toHaveBeenCalledWith(route, {params: args[0], ...config}); - return; - } - if (verb === 'delete') { - expect(request[verb]).toHaveBeenCalledWith(route, undefined, config); - return; - } - if (verb === 'get') { - expect(request[verb]).toHaveBeenCalledWith(route, config); - return; - } - expect(request[verb]).toHaveBeenCalledWith(route, args.at(-1), config); + it('does not expose retired Super or UUAP facades', () => { + expect(auth.getSuperUser).toBeUndefined(); + expect(auth.addSuperUser).toBeUndefined(); + expect(auth.removeSuperUser).toBeUndefined(); + expect(auth.addUuapUser).toBeUndefined(); + expect(auth.getUUapList).toBeUndefined(); + }); }); diff --git a/hugegraph-hubble/hubble-fe/src/api/auth.js b/hugegraph-hubble/hubble-fe/src/api/auth.js index 3377b332f..9cbe1b0ca 100644 --- a/hugegraph-hubble/hubble-fe/src/api/auth.js +++ b/hugegraph-hubble/hubble-fe/src/api/auth.js @@ -17,7 +17,6 @@ */ import request from './request'; -import qs from 'qs'; // login const login = data => { @@ -165,8 +164,8 @@ const getPersonal = () => { return request.get('/auth/users/getpersonal'); }; -const updatePersonal = params => { - return request.get('/auth/users/updatepersonal', {params}); +const updatePersonal = data => { + return request.put('/auth/users/personal', data); }; export {getPersonal, updatePersonal}; @@ -180,37 +179,3 @@ const getVermeer = () => { }; export {getDashboard, getVermeer}; - -const getUUapList = params => { - return request.get('/uic/list', {params}); -}; - -const getSuperUser = params => { - return request.get('/auth/users/super', {params}); -}; - -const addSuperUser = data => { - return request.post('/auth/users/super', - qs.stringify(data), - {headers: {'Content-Type': 'application/x-www-form-urlencoded'}} - ); -}; - -const addUuapUser = data => { - return request.post('/auth/users/uuap', - qs.stringify(data), - {headers: {'Content-Type': 'application/x-www-form-urlencoded'}} - ); - - // return request.post('/auth/users/uuap', data); -}; - -const removeSuperUser = username => { - return request.delete(`/auth/users/super/${username}`); -}; - -const getAccountsList = username => { - return request.get('/uic/accounts', {params: {username}}); -}; - -export {getUUapList, getSuperUser, addSuperUser, addUuapUser, removeSuperUser, getAccountsList}; diff --git a/hugegraph-hubble/hubble-fe/src/api/manage-contract.test.js b/hugegraph-hubble/hubble-fe/src/api/manage-contract.test.js index dd56c7750..70982c6cd 100644 --- a/hugegraph-hubble/hubble-fe/src/api/manage-contract.test.js +++ b/hugegraph-hubble/hubble-fe/src/api/manage-contract.test.js @@ -38,6 +38,16 @@ test('updates a graph with PUT JSON on the canonical route', () => { ); }); +test('clears graph data and schema with POST on the canonical route', () => { + manage.clearGraphDataAndSchema('DEFAULT', 'g'); + + expect(request.post).toHaveBeenCalledWith( + '/graphspaces/DEFAULT/graphs/g/clear' + ); + expect(request.get).not.toHaveBeenCalled(); + expect(manage.clearGraphData).toBeUndefined(); +}); + test('reads the default graph from the canonical route', () => { manage.getDefaultGraph('DEFAULT'); expect(request.get).toHaveBeenCalledWith( diff --git a/hugegraph-hubble/hubble-fe/src/api/manage.js b/hugegraph-hubble/hubble-fe/src/api/manage.js index c7c86bd9e..9c553aa6d 100644 --- a/hugegraph-hubble/hubble-fe/src/api/manage.js +++ b/hugegraph-hubble/hubble-fe/src/api/manage.js @@ -116,16 +116,10 @@ const getDefaultGraph = (graphspace, config) => { return config ? request.get(path, config) : request.get(path); }; -const clearGraphData = (graphspace, graph) => { - // TODO: Replace this temporary facade after Server exposes and verifies a - // data-only clear operation that preserves schema. - return request.get(`/graphspaces/${graphspace}/graphs/${graph}/truncate`, { - params: {clear_schema: false, clear_data: true}, - }); -}; - const clearGraphDataAndSchema = (graphspace, graph) => { - return request.get(`/graphspaces/${graphspace}/graphs/${graph}/truncate`, {params: {clear_schema: true}}); + // TODO: Add a distinct data-only action as soon as Server provides a + // verified API that preserves schema; this endpoint intentionally clears both. + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/clear`); }; const getGraphStatistic = (graphspace, graph, config) => { @@ -141,7 +135,7 @@ const cloneGraph = (graphspace, graph, params) => { }; export {getGraphList, getGraph, addGraph, updateGraph, delGraph, getDefaultGraph, - getGraphView, clearGraphData, setDefaultGraph, clearGraphDataAndSchema, + getGraphView, setDefaultGraph, clearGraphDataAndSchema, getGraphStatistic, updateGraphStatistic, cloneGraph}; // meta property diff --git a/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js b/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js index c1dff6c1b..6d4da2261 100644 --- a/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js +++ b/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js @@ -108,7 +108,7 @@ describe.each(['./request', './request2'])('%s error semantics', modulePath => { expect(messageError).toHaveBeenCalledWith('request.error'); }); - it('keeps the existing 401 sentinel response and redirects to login', () => { + it('rejects HTTP 401 and redirects to login', async () => { const {reject, clearLogin} = loadResponseHandlers(modulePath); const error = { response: { @@ -120,14 +120,24 @@ describe.each(['./request', './request2'])('%s error semantics', modulePath => { }, }; - expect(reject(error)).toEqual({ + await expect(reject(error)).rejects.toBe(error); + expect(clearLogin).toHaveBeenCalledTimes(1); + expect(sessionStorage.getItem('redirect')).toBe('/navigation?from=test'); + expect(window.location.href).toBe('/login?redirect=%2Fnavigation%3Ffrom%3Dtest'); + }); + + it('rejects business 401 and redirects to login', async () => { + const {resolve, clearLogin} = loadResponseHandlers(modulePath); + const response = { + status: 200, data: { status: 401, message: 'Unauthorized', }, - }); + }; + + await expect(resolve(response)).rejects.toBe(response); expect(clearLogin).toHaveBeenCalledTimes(1); - expect(sessionStorage.getItem('redirect')).toBe('/navigation?from=test'); expect(window.location.href).toBe('/login?redirect=%2Fnavigation%3Ffrom%3Dtest'); }); diff --git a/hugegraph-hubble/hubble-fe/src/api/request.js b/hugegraph-hubble/hubble-fe/src/api/request.js index ec10a9123..b328facb4 100644 --- a/hugegraph-hubble/hubble-fe/src/api/request.js +++ b/hugegraph-hubble/hubble-fe/src/api/request.js @@ -89,6 +89,7 @@ instance.interceptors.response.use( response => { if (response.status === 401 || response.data?.status === 401) { redirectToLogin(); + return Promise.reject(response); } else if (response.data?.status !== 200 && !response.config?.suppressBusinessErrorToast) { @@ -101,7 +102,7 @@ instance.interceptors.response.use( error => { if (isUnauthorizedError(error)) { redirectToLogin(); - return {data: {status: 401, message: 'Unauthorized'}}; + return Promise.reject(error); } if (!error.config?.suppressBusinessErrorToast) { const res = error.response?.data; diff --git a/hugegraph-hubble/hubble-fe/src/api/request2.js b/hugegraph-hubble/hubble-fe/src/api/request2.js index d1520c64a..2b30684f7 100644 --- a/hugegraph-hubble/hubble-fe/src/api/request2.js +++ b/hugegraph-hubble/hubble-fe/src/api/request2.js @@ -87,6 +87,7 @@ instance.interceptors.response.use( response => { if (response.status === 401 || response.data?.status === 401) { redirectToLogin(); + return Promise.reject(response); } else if (response.data?.status !== 200 && !response.config?.suppressBusinessErrorToast) { @@ -99,7 +100,7 @@ instance.interceptors.response.use( error => { if (isUnauthorizedError(error)) { redirectToLogin(); - return {data: {status: 401, message: 'Unauthorized'}}; + return Promise.reject(error); } if (!error.config?.suppressBusinessErrorToast) { const res = error.response?.data; diff --git a/hugegraph-hubble/hubble-fe/src/components/SelectUser/index.js b/hugegraph-hubble/hubble-fe/src/components/SelectUser/index.js deleted file mode 100644 index 7a76b31bd..000000000 --- a/hugegraph-hubble/hubble-fe/src/components/SelectUser/index.js +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -// import {useState, useCallback} from 'react'; -// import {Select, List, Avatar} from 'antd'; -// import * as api from '../../api'; -// TODO REMOVE IT -// const SelectUser = props => { -// const [userList, setUserList] = useState([]); -// -// const handleAdmins = useCallback(val => { -// if (val === '') { -// setUserList([]); -// return; -// } -// -// api.auth.getUUapList({username: val}).then(res => { -// if (res.status === 200) { -// setUserList(res.data); -// } -// else { -// setUserList([]); -// } -// }); -// }, []); -// -// -// return ( -// -// ); -// }; -// -// export default SelectUser; diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json index 2f8331ed2..f940ab1b4 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json @@ -174,10 +174,8 @@ "title": "Confirm graph clear", "graphspace": "GraphSpace: {{graphspace}}", "graph": "Graph: {{graph}}", - "scope_data": "Deletion scope: graph data only", "scope_schema_data": "Deletion scope: graph data, property keys, vertex labels, edge labels, and indexes", "irreversible": "This operation is irreversible.", - "schema_preservation_warning": "No verified dedicated Server operation currently guarantees schema preservation.", "input_label": "Enter the graph name to confirm", "input_placeholder": "Graph name", "confirm": "Clear graph", @@ -196,7 +194,6 @@ "enter_analysis": "Open Graph Studio", "meta_config": "Metadata Config", "clear_schema_data": "Clear Schema & Data", - "clear_data": "Clear Data", "set_default": "Set Default", "view_schema": "View Schema", "clone": "Clone Graph" diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json index b8748b491..cf166c54f 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json @@ -174,10 +174,8 @@ "title": "确认清空图", "graphspace": "GraphSpace:{{graphspace}}", "graph": "图:{{graph}}", - "scope_data": "删除范围:仅图数据", "scope_schema_data": "删除范围:图数据、属性键、顶点类型、边类型和索引", "irreversible": "此操作不可恢复。", - "schema_preservation_warning": "当前尚无经过验证、可保证保留 schema 的专用 Server 操作。", "input_label": "输入图名以确认", "input_placeholder": "图名", "confirm": "清空图", @@ -196,7 +194,6 @@ "enter_analysis": "进入图分析平台", "meta_config": "元数据配置", "clear_schema_data": "清空schema+数据", - "clear_data": "清空数据", "set_default": "设为默认", "view_schema": "查看schema", "clone": "克隆图" diff --git a/hugegraph-hubble/hubble-fe/src/modules/component/EditElement/index.js b/hugegraph-hubble/hubble-fe/src/modules/component/EditElement/index.js index f5395add4..78d6d3870 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/component/EditElement/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/component/EditElement/index.js @@ -228,9 +228,9 @@ const EditElement = props => { status, } = response; if (status === 200) { - const {NullableProps, nonNullableProps} = data; + const {nullableProps, nonNullableProps} = data; setEdgeNonNullableProps(nonNullableProps); - setEdgeNullableProps(NullableProps); + setEdgeNullableProps(nullableProps); } if (status !== 200 && !edgePropertiessMessage) { message.error(t('analysis.canvas.edit_element.get_edge_property_failed')); @@ -249,9 +249,9 @@ const EditElement = props => { status, } = response; if (status === 200) { - const {NullableProps, nonNullableProps, primaryKeys} = data; + const {nullableProps, nonNullableProps, primaryKeys} = data; setVertexPrimaryKeys(primaryKeys); - setVertexNullableProps(NullableProps); + setVertexNullableProps(nullableProps); setVertexNonNullableProps(nonNullableProps); } if (status !== 200 && !vertexPropertiessMessage) { diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.js index b7ac1a368..82a5513fc 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.js @@ -24,7 +24,6 @@ const ClearGraphConfirmModal = ({ open, graphspace, graph, - mode, onCancel, onSuccess, onConfirm, @@ -35,7 +34,7 @@ const ClearGraphConfirmModal = ({ const [error, setError] = useState(''); const pendingRef = useRef(false); const activeRequestRef = useRef(null); - const selectionKey = JSON.stringify([open, graphspace, graph, mode]); + const selectionKey = JSON.stringify([open, graphspace, graph]); const currentSelectionRef = useRef(selectionKey); useLayoutEffect(() => { @@ -50,7 +49,7 @@ const ClearGraphConfirmModal = ({ setPending(false); setError(''); } - }, [open, graphspace, graph, mode]); + }, [open, graphspace, graph]); const handleConfirm = useCallback(async () => { if (pendingRef.current || confirmation !== graph) { @@ -105,8 +104,6 @@ const ClearGraphConfirmModal = ({ setConfirmation(event.target.value); }, []); - const dataOnly = mode === 'data'; - return ( - {dataOnly && ( - - )} {error && } {t('graph.clear_confirm.input_label')} diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.test.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.test.js index 94c50220c..f2530319c 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.test.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.test.js @@ -27,11 +27,8 @@ const mockMessages = { 'graph.clear_confirm.title': mockClearMessages.title, 'graph.clear_confirm.graphspace': mockClearMessages.graphspace, 'graph.clear_confirm.graph': mockClearMessages.graph, - 'graph.clear_confirm.scope_data': mockClearMessages.scope_data, 'graph.clear_confirm.scope_schema_data': mockClearMessages.scope_schema_data, 'graph.clear_confirm.irreversible': mockClearMessages.irreversible, - 'graph.clear_confirm.schema_preservation_warning': - mockClearMessages.schema_preservation_warning, 'graph.clear_confirm.input_label': mockClearMessages.input_label, 'graph.clear_confirm.input_placeholder': mockClearMessages.input_placeholder, 'graph.clear_confirm.confirm': mockClearMessages.confirm, @@ -66,7 +63,6 @@ const renderModal = (props = {}) => { open: true, graphspace: 'DEFAULT', graph: 'hugegraph', - mode: 'data', onCancel: jest.fn(), onSuccess: jest.fn(), onConfirm: jest.fn(), @@ -89,30 +85,15 @@ const createDeferred = () => { return {promise, resolve, reject}; }; -test.each([ - ['data', 'Deletion scope: graph data only', true], - [ - 'schema-data', - 'Deletion scope: graph data, property keys, vertex labels, edge labels, and indexes', - false, - ], -])('requires exact graph-name confirmation in %s mode', async (mode, scope, warnsSchema) => { - renderModal({mode}); +test('requires exact graph-name confirmation for schema-and-data clear', async () => { + renderModal(); expect(screen.getByText('GraphSpace: DEFAULT')).toBeInTheDocument(); expect(screen.getByText('Graph: hugegraph')).toBeInTheDocument(); - expect(screen.getByText(scope)).toBeInTheDocument(); + expect(screen.getByText( + 'Deletion scope: graph data, property keys, vertex labels, edge labels, and indexes' + )).toBeInTheDocument(); expect(screen.getByText('This operation is irreversible.')).toBeInTheDocument(); - if (warnsSchema) { - expect(screen.getByText( - 'No verified dedicated Server operation currently guarantees schema preservation.' - )).toBeInTheDocument(); - } - else { - expect(screen.queryByText( - 'No verified dedicated Server operation currently guarantees schema preservation.' - )).not.toBeInTheDocument(); - } const input = screen.getByPlaceholderText('Graph name'); const confirm = screen.getByRole('button', {name: 'Clear graph'}); @@ -133,9 +114,6 @@ test('provides explicit schema-and-data scope in both locales', () => { expect(zhPages.graph.clear_confirm.scope_schema_data).toBe( '删除范围:图数据、属性键、顶点类型、边类型和索引' ); - expect(zhPages.graph.clear_confirm.schema_preservation_warning).toBe( - '当前尚无经过验证、可保证保留 schema 的专用 Server 操作。' - ); }); test('calls onSuccess only after a successful clear response', async () => { @@ -218,7 +196,7 @@ test('resets confirmation and errors when opened for a new graph', async () => { userEvent.click(screen.getByRole('button', {name: 'Clear graph'})); expect(await screen.findByText('boom')).toBeInTheDocument(); - rerender(); + rerender(); expect(screen.getByPlaceholderText('Graph name')).toHaveValue(''); expect(screen.queryByText('boom')).not.toBeInTheDocument(); @@ -268,7 +246,6 @@ test('ignores stale failure and finally after reopening for a newer graph reques {...props} open graph='graph-b' - mode='schema-data' onConfirm={onConfirmB} /> ); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/default-card-actions.test.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/default-card-actions.test.js new file mode 100644 index 000000000..58a6fbab7 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/default-card-actions.test.js @@ -0,0 +1,149 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {fireEvent, render, screen, waitFor} from '@testing-library/react'; +import Graph from './index'; +import * as api from '../../api'; + +jest.mock('react-i18next', () => ({ + useTranslation: () => ({t: key => key}), +})); + +jest.mock('react-router-dom', () => { + const router = jest.requireActual('react-router-dom'); + + return { + ...router, + Link: ({children, to}) => {children}, + useNavigate: () => jest.fn(), + useParams: () => ({graphspace: 'space'}), + }; +}); + +jest.mock('../../api', () => ({ + manage: { + getGraphSpace: jest.fn(), + getGraphList: jest.fn(), + clearGraphDataAndSchema: jest.fn(), + }, +})); + +jest.mock('./EditLayer', () => ({ + EditLayer: () => null, + ViewLayer: () => null, + CloneLayer: () => null, +})); + +jest.mock('./Card', () => ({menus}) => ( +
+ {menus.map(item =>
{item.label}
)} +
+)); + +jest.mock('./ClearGraphConfirmModal', () => ({open, onConfirm}) => ( + open ? ( + + ) : null +)); + +const installMatchMedia = () => { + window.matchMedia = jest.fn().mockImplementation(query => ({ + matches: false, + media: query, + onchange: null, + addListener: jest.fn(), + removeListener: jest.fn(), + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn(), + })); +}; + +beforeAll(installMatchMedia); + +beforeEach(() => { + jest.clearAllMocks(); + installMatchMedia(); + sessionStorage.setItem('hubble_config_', JSON.stringify({pd_enabled: true})); + api.manage.getGraphSpace.mockResolvedValue({ + status: 200, + data: {name: 'space', nickname: 'Space'}, + }); + api.manage.getGraphList.mockResolvedValue({ + status: 200, + data: { + records: [{ + name: 'default-graph', + nickname: 'Default graph', + graphspace: 'space', + default: true, + }], + total: 1, + }, + }); +}); + +test('disables every clear action for the default graph card', async () => { + render(); + + const menu = await screen.findByTestId('graph-card-menu'); + const clearSchemaData = screen.getByText('graph.menu.clear_schema_data'); + const setDefault = screen.getByText('graph.menu.set_default'); + + expect(menu).toContainElement(clearSchemaData); + expect(clearSchemaData.tagName).toBe('SPAN'); + expect(setDefault.tagName).toBe('SPAN'); + + fireEvent.click(clearSchemaData); + + await waitFor(() => { + expect(screen.queryByTestId('clear-confirm-modal')).not.toBeInTheDocument(); + }); + expect(api.manage.clearGraphDataAndSchema).not.toHaveBeenCalled(); +}); + +test('offers one schema-and-data clear action and calls its canonical API', async () => { + api.manage.getGraphList.mockResolvedValue({ + status: 200, + data: { + records: [{ + name: 'graph-a', + nickname: 'Graph A', + graphspace: 'space', + default: false, + }], + total: 1, + }, + }); + api.manage.clearGraphDataAndSchema.mockResolvedValue({status: 200}); + render(); + + const menu = await screen.findByTestId('graph-card-menu'); + const clearActions = screen.getAllByText('graph.menu.clear_schema_data'); + expect(menu).toContainElement(clearActions[0]); + expect(clearActions).toHaveLength(1); + expect(screen.queryByText('graph.menu.clear_data')).not.toBeInTheDocument(); + + fireEvent.click(clearActions[0]); + fireEvent.click(await screen.findByTestId('clear-confirm-modal')); + + await waitFor(() => expect(api.manage.clearGraphDataAndSchema) + .toHaveBeenCalledWith('space', 'graph-a')); +}); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js index 58ed9a6e6..8f63a39c3 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js @@ -100,12 +100,10 @@ const Graph = () => { setEditLayer(true); }; - const clearData = graph => { - setClearSelection({graph, mode: 'data'}); - }; - const clearSchema = graph => { - setClearSelection({graph, mode: 'schema-data'}); + // TODO: Restore a separate data-only action as soon as Server provides + // a verified API that preserves schema. + setClearSelection({graph}); }; const handleClearSuccess = useCallback(() => { @@ -119,9 +117,7 @@ const Graph = () => { }, []); const handleClearConfirm = useCallback(() => { - return clearSelection?.mode === 'data' - ? api.manage.clearGraphData(graphspace, clearSelection.graph) - : api.manage.clearGraphDataAndSchema(graphspace, clearSelection.graph); + return api.manage.clearGraphDataAndSchema(graphspace, clearSelection.graph); }, [clearSelection, graphspace]); const showSchema = graph => { @@ -281,8 +277,8 @@ const Graph = () => { {t('graph.menu.meta_config')} {(row.default) - ? {t('graph.menu.clear_data')} - : clearSchema(row.name)}>{t('graph.menu.clear_data')}} + ? {t('graph.menu.clear_schema_data')} + : clearSchema(row.name)}>{t('graph.menu.clear_schema_data')}} {(row.graphspace === 'neizhianli') ? {t('common.action.delete')} : deleteGraph(row.name)}>{t('common.action.delete')}} @@ -315,17 +311,13 @@ const Graph = () => { }, { key: '2', - label: item.isDefault + label: item.default ? {t('graph.menu.clear_schema_data')} : clearSchema(item.name)}>{t('graph.menu.clear_schema_data')}, }, - { - key: '3', - label: clearData(item.name)}>{t('graph.menu.clear_data')}, - }, graphDefaultMutationEnabled && { key: '4', - label: item.isDefault + label: item.default ? {t('graph.menu.set_default')} : handleSetDefault(item.name)}>{t('graph.menu.set_default')}, }, @@ -520,7 +512,6 @@ const Graph = () => { open={Boolean(clearSelection)} graphspace={graphspace} graph={clearSelection?.graph || ''} - mode={clearSelection?.mode || 'data'} onCancel={handleClearCancel} onSuccess={handleClearSuccess} onConfirm={handleClearConfirm} diff --git a/hugegraph-hubble/hubble-fe/src/pages/My/EditLayer.js b/hugegraph-hubble/hubble-fe/src/pages/My/EditLayer.js index 482b4883b..6321164af 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/My/EditLayer.js +++ b/hugegraph-hubble/hubble-fe/src/pages/My/EditLayer.js @@ -43,6 +43,8 @@ const EditLayer = ({visible, onCancel, data, refresh}) => { } message.error(res.message); + }).catch(() => { + setLoading(false); }); }); }, [form, onCancel, refresh]); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Super/EditLayer.js b/hugegraph-hubble/hubble-fe/src/pages/Super/EditLayer.js deleted file mode 100644 index c57bb6d31..000000000 --- a/hugegraph-hubble/hubble-fe/src/pages/Super/EditLayer.js +++ /dev/null @@ -1,84 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -// import {Modal, Input, Form, message} from 'antd'; -// import {useCallback, useEffect} from 'react'; -// import * as api from '../../api'; -// import * as rules from '../../utils/rules'; -// import SelectUser from '../../components/SelectUser'; -// TODO REMOVE SUPER -// const EditLayer = ({visible, onCancel, refresh}) => { -// const [form] = Form.useForm(); -// -// const onFinish = useCallback(() => { -// form.validateFields().then(values => { -// // createUser(values); -// const usernames = values.user_name.map(item => item.split('##')[0]).join(','); -// const nicknames = values.user_name.map(item => item.split('##')[1]).join(','); -// -// api.auth.addSuperUser({ -// usernames: usernames, -// nicknames: nicknames, -// description: values.user_description, -// }).then(res => { -// if (res.status === 200) { -// message.success('超级管理员添加成功'); -// onCancel(); -// refresh(); -// return; -// } -// -// message.error(`超级管理员添加失败。失败原因:${res.data.message}`); -// }); -// }); -// }, [form, onCancel, refresh]); -// -// useEffect(() => { -// form.resetFields(); -// }, [form, visible]); -// -// return ( -// -// -// -// -// -// -// -// -// -// -// ); -// }; -// -// export default EditLayer; diff --git a/hugegraph-hubble/hubble-fe/src/pages/Super/index.js b/hugegraph-hubble/hubble-fe/src/pages/Super/index.js deleted file mode 100644 index c6be9828b..000000000 --- a/hugegraph-hubble/hubble-fe/src/pages/Super/index.js +++ /dev/null @@ -1,159 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -// import {PageHeader, Button, Space, Table, message, Popconfirm, Tooltip} from 'antd'; -// import {useCallback, useEffect, useState} from 'react'; -// import {PlusOutlined} from '@ant-design/icons'; -// import TableHeader from '../../components/TableHeader'; -// import EditLayer from './EditLayer'; -// import * as api from '../../api'; -// import {getUser} from '../../utils/user'; -// TODO REMOVE SUPER -// const Super = () => { -// const [editLayerVisible, setEditLayerVisible] = useState(false); -// const [op, setOp] = useState('detail'); -// const [detail, setDetail] = useState({}); -// const [data, setData] = useState([]); -// const [refresh, setRefresh] = useState(false); -// const [pagination, setPagination] = useState({toatal: 0, current: 1, pageSize: 10}); -// -// const showAdd = useCallback(() => { -// setDetail({}); -// setOp('create'); -// setEditLayerVisible(true); -// }, []); -// -// const handleRefresh = useCallback(() => { -// setRefresh(!refresh); -// }, [refresh]); -// -// const handleHideLayer = useCallback(() => { -// setEditLayerVisible(false); -// }, []); -// -// const handleTable = useCallback(page => { -// setPagination({...pagination, ...page}); -// }, [pagination]); -// -// const RemoveSuper = ({data}) => { -// const handleDelete = useCallback(() => { -// api.auth.removeSuperUser(data.id).then(res => { -// if (res.status === 200) { -// message.success('超级管理员移除成功'); -// setRefresh(!refresh); -// return; -// } -// -// message.error(`超级管理员移除失败。失败原因:${res.message}`); -// }); -// }, [data.id]); -// -// return data.user_name === getUser().id -// ? '-' -// : ( -// -// 移除超管 -// -// ); -// }; -// -// const columns = [ -// { -// title: '账号ID', -// dataIndex: 'user_name', -// }, -// { -// title: '账号名', -// dataIndex: 'user_nickname', -// }, -// { -// title: '备注', -// dataIndex: 'user_description', -// ellipsis: {showTitle: false}, -// render: val => {val}, -// }, -// { -// title: '添加时间', -// dataIndex: 'user_create', -// align: 'center', -// width: 200, -// }, -// { -// title: '操作', -// width: 300, -// align: 'center', -// render: row => , -// }, -// ]; -// -// const rowKey = useCallback(item => item.user_name, []); -// -// useEffect(() => { -// api.auth.getSuperUser({ -// page_no: pagination.current, -// page_size: pagination.pageSize, -// }).then(res => { -// if (res.status === 200) { -// setData(res.data.records); -// setPagination({...pagination, total: res.data.total}); -// return; -// } -// -// message.error(res.message); -// }); -// }, [refresh, pagination.current, pagination.pageSize]); -// -// return ( -// <> -// -// -//
-// -// -// -// -// -// -//
-// -// -// -// -// ); -// }; -// -// export default Super; diff --git a/hugegraph-hubble/hubble-fe/src/pages/Super/index.module.scss b/hugegraph-hubble/hubble-fe/src/pages/Super/index.module.scss deleted file mode 100644 index f11f2b578..000000000 --- a/hugegraph-hubble/hubble-fe/src/pages/Super/index.module.scss +++ /dev/null @@ -1,21 +0,0 @@ -/*! - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -div.item { - margin: 0; -} diff --git a/hugegraph-hubble/hubble-fe/src/routes/index.js b/hugegraph-hubble/hubble-fe/src/routes/index.js index 2d6cfe09a..d47264bbd 100644 --- a/hugegraph-hubble/hubble-fe/src/routes/index.js +++ b/hugegraph-hubble/hubble-fe/src/routes/index.js @@ -28,7 +28,6 @@ import GraphSpace from '../pages/GraphSpace'; import Meta from '../pages/Meta'; import GraphDetail from '../pages/GraphDetail'; import My from '../pages/My'; -// import Super from '../pages/Super'; import Account from '../pages/Account'; import Navigation from '../pages/Navigation'; import Error404 from '../pages/Error404'; @@ -144,7 +143,6 @@ const RouteList = ({element}) => { } /> } /> - } /> } /> } /> { expect(sessionStorage.getItem('redirect')).toBeNull(); }); - it.each(['/super', '/resource', '/role'])( + it.each(['/resource', '/role'])( 'redirects unavailable legacy route %s to navigation', route => { sessionStorage.setItem('user_', JSON.stringify({ diff --git a/hugegraph-hubble/hubble-fe/src/utils/productMode.js b/hugegraph-hubble/hubble-fe/src/utils/productMode.js index 7e0cab1fd..2609325a0 100644 --- a/hugegraph-hubble/hubble-fe/src/utils/productMode.js +++ b/hugegraph-hubble/hubble-fe/src/utils/productMode.js @@ -42,7 +42,6 @@ const isPdOnlyPath = pathname => { || pathname.startsWith('/account') || pathname.startsWith('/resource') || pathname.startsWith('/role') - || pathname.startsWith('/super') || /^\/graphspace\/[^/]+\/schema(?:\/|$)/.test(pathname); }; diff --git a/pom.xml b/pom.xml index aed1343d0..26bc91c4a 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,8 @@ 1.8.0 - 1.7.0 + + 1.7.0 ${project.artifactId} apache-${release.name}-${project.version} ${project.basedir}/assembly @@ -154,7 +155,37 @@ org.apache.hugegraph hugegraph-common - ${hugegraph.common.version} + ${hugegraph.version} + + + org.apache.hugegraph + hugegraph-core + ${hugegraph.version} + + + org.apache.hugegraph + hugegraph-server + ${hugegraph.version} + + + org.apache.hugegraph + hg-pd-client + ${hugegraph.version} + + + org.apache.hugegraph + hg-pd-common + ${hugegraph.version} + + + org.apache.hugegraph + hg-pd-grpc + ${hugegraph.version} + + + org.apache.hugegraph + hg-store-common + ${hugegraph.version} From c00492d1bf4dcbea67c7e45427ef84cfbfe30425 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 02:22:59 +0800 Subject: [PATCH 47/68] fix(hubble): extend active session timeout - set the servlet idle timeout to 48 hours - rely on standard access-based inactivity refresh - add a contract test for the packaged Hubble config --- .../src/main/resources/application.properties | 3 ++ .../unit/SessionTimeoutConfigTest.java | 53 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/SessionTimeoutConfigTest.java diff --git a/hugegraph-hubble/hubble-be/src/main/resources/application.properties b/hugegraph-hubble/hubble-be/src/main/resources/application.properties index 77a2b16e7..842a2f025 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/application.properties +++ b/hugegraph-hubble/hubble-be/src/main/resources/application.properties @@ -20,6 +20,9 @@ info.app.name=hugegraph-hubble info.app.version=v1.2 spring.profiles.active=dev +# Keep an active browser session alive; Servlet access refreshes the idle timer. +server.servlet.session.timeout=48h + # web static file path, local h2 database or remote mysql for you to choose # local h2 database spring.resources.static-locations=classpath:/ui/ diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/SessionTimeoutConfigTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/SessionTimeoutConfigTest.java new file mode 100644 index 000000000..464cb3553 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/SessionTimeoutConfigTest.java @@ -0,0 +1,53 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hugegraph.unit; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Enumeration; +import java.util.Properties; + +import org.junit.Assert; +import org.junit.Test; + +public class SessionTimeoutConfigTest { + + @Test + public void testSessionIdleTimeoutIsExplicitlyFortyEightHours() + throws IOException { + Enumeration resources = this.getClass().getClassLoader() + .getResources( + "application.properties"); + while (resources.hasMoreElements()) { + Properties properties = new Properties(); + try (InputStream input = resources.nextElement().openStream()) { + properties.load(input); + } + if (!"hugegraph-hubble".equals( + properties.getProperty("info.app.name"))) { + continue; + } + Assert.assertEquals("48h", properties.getProperty( + "server.servlet.session.timeout")); + return; + } + Assert.fail("Hubble application.properties was not found"); + } +} From 33b3452ebe2f7dfc6dc55f4022ff049cad0ca499 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 02:42:43 +0800 Subject: [PATCH 48/68] chore: consolidate codex task tracking - keep one concise global follow-up list - stop tracking goal-specific process and evidence files - ignore local task artifacts by default - preserve completed audit evidence locally --- .codex-task/GLOBAL-TODO.md | 10 ++ .../evidence/2026-07-11-fresh-audit.md | 80 --------- .../evidence/2026-07-11-phase2-quality.md | 92 ---------- .../evidence/2026-07-12-final-local-gates.md | 34 ---- .../live-hubble-smoke.json | 165 ------------------ .../live-acceptance-2026-07-11/manifest.json | 9 - .../ui-full-acceptance.json | 24 --- .../ui/algorithms.png | Bin 105448 -> 0 bytes .../ui/asyncTasks.png | Bin 43269 -> 0 bytes .../ui/graphspace.png | Bin 39594 -> 0 bytes .../live-acceptance-2026-07-11/ui/gremlin.png | Bin 79304 -> 0 bytes .../ui/i18n-en-US.png | Bin 45384 -> 0 bytes .../ui/i18n-zh-CN.png | Bin 39594 -> 0 bytes .../ui/ui-browser-smoke.json | 122 ------------- .../ui/ui-i18n-switch-smoke.json | 11 -- .codex-task/hubble2-code-quality/lessons.md | 84 --------- .codex-task/hubble2-code-quality/plan.md | 116 ------------ .codex-task/hubble2-code-quality/progress.md | 85 --------- .codex-task/hubble2-code-quality/todo.md | 111 ------------ .gitignore | 3 +- 20 files changed, 12 insertions(+), 934 deletions(-) create mode 100644 .codex-task/GLOBAL-TODO.md delete mode 100644 .codex-task/hubble2-code-quality/evidence/2026-07-11-fresh-audit.md delete mode 100644 .codex-task/hubble2-code-quality/evidence/2026-07-11-phase2-quality.md delete mode 100644 .codex-task/hubble2-code-quality/evidence/2026-07-12-final-local-gates.md delete mode 100644 .codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/live-hubble-smoke.json delete mode 100644 .codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/manifest.json delete mode 100644 .codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui-full-acceptance.json delete mode 100644 .codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/algorithms.png delete mode 100644 .codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/asyncTasks.png delete mode 100644 .codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/graphspace.png delete mode 100644 .codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/gremlin.png delete mode 100644 .codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/i18n-en-US.png delete mode 100644 .codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/i18n-zh-CN.png delete mode 100644 .codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/ui-browser-smoke.json delete mode 100644 .codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/ui-i18n-switch-smoke.json delete mode 100644 .codex-task/hubble2-code-quality/lessons.md delete mode 100644 .codex-task/hubble2-code-quality/plan.md delete mode 100644 .codex-task/hubble2-code-quality/progress.md delete mode 100644 .codex-task/hubble2-code-quality/todo.md diff --git a/.codex-task/GLOBAL-TODO.md b/.codex-task/GLOBAL-TODO.md new file mode 100644 index 000000000..4256fdc7d --- /dev/null +++ b/.codex-task/GLOBAL-TODO.md @@ -0,0 +1,10 @@ +# 全局 TODO + +仅记录各 goal 完成后仍有价值、但不属于已完成 goal 的后续事项。 + +## Hubble 2.0 + +- 现代化 React、Ant Design、X6/Graphin/G6、Dagre 与构建链;先固化核心页面、图交互、性能和浏览器回归基线,再分批升级并清理兼容层。 +- HugeGraph Server 提供保留 Schema 的 data-only clear API 后,恢复 Hubble“仅清数据”能力及权限、默认图和失败合同测试。 +- 重构 Gremlin Basic 认证,移除 HTTP Session 中的短期明文凭据,并验证 token 生命周期。 +- 发布加固:建立逐 JAR license/native allowlist 与 NOTICE 审计,RC 使用正式发布密钥验证 `.sha512`/`.asc`。 diff --git a/.codex-task/hubble2-code-quality/evidence/2026-07-11-fresh-audit.md b/.codex-task/hubble2-code-quality/evidence/2026-07-11-fresh-audit.md deleted file mode 100644 index 4d5d4848f..000000000 --- a/.codex-task/hubble2-code-quality/evidence/2026-07-11-fresh-audit.md +++ /dev/null @@ -1,80 +0,0 @@ -# 2026-07-11 Fresh Audit - -## 审计边界 - -- 日期/时区:2026-07-11,Asia/Shanghai -- 分支/HEAD:`hubble2` / `b66848d308d58e6899cab7eb92589f1789b62259` -- 工作树基线:26 个已修改 Hubble BE Java 文件,`150 insertions / 57 deletions`;均为 wildcard import 展开、未使用 import 删除、空格/换行等 code-style 修改,fresh audit 前已存在,本轮保留并按“既有未提交质量修复”管理。 -- 审计前 source-of-truth:25 个 TODO;状态为“初始化,未执行”。 -- 历史目录:`.codex-task/hubble2-hardening/` 只用于定位命令和已知风险,未把其中结果当成当前证据。 - -## 工具链 - -| 工具 | 当前值 | 结论 | -|---|---:|---| -| 默认 Java | 21.0.2 | 与 CI Java 11 不同,不用于最终 Java 门禁 | -| `j11` | Temurin 11.0.22 | 可用 | -| Maven | 3.9.11 | Java 11 原生 Maven 审计入口 | -| mvnd | shell 直接调用为 1.0.2;`zsh -lc` 解析为 2.0.0-rc-3 | 2.0 agent class version 61,不能在 Java 11 启动;计划中的 Java 11 daemon 复用假设失效,暂用原生 Maven | -| Node | 25.6.0 | 与 CI 18.20.8 不同;现有 FE 结果仅为本地审计,不代替 CI | -| Yarn | 1.22.22 | CI workflow 固定 Node 18.20.8,但未固定系统 Yarn 与 dist plugin 的 1.22.21 差异 | - -## Fresh gate 输出 - -### Frontend - -- `CI=true yarn build`:exit 0,wall `51.49s`;i18n `1587/1587`、静态 key `1108` 通过。 -- build 不是无 warning:`@antv/x6-react-components`、`dagre-compound` 和 antd source map 缺失/不支持;Browserslist 数据 6 个月未更新;主 bundle gzip `2.14 MB`。 -- `yarn test --watchAll=false --runInBand`:exit 0,wall `6.07s`;40 suites / 148 tests 全过。 -- Jest 仍输出 ReactDOM test-utils `act` 弃用、React Router v7 future flags、第三方 `defaultProps` warning。先区分本项目测试可修复项与第三方 warning,禁止用静默/忽略换绿。 -- 当前仓库没有独立 `lint` script;CRA production build 是 JS/JSX lint 真值入口,TypeScript 需单独盘点 lint/typecheck 可执行面。 - -### Backend - -- `zsh -lc 'j11; mvnd ...'`:exit 1;mvnd 2.0.0-rc-3 agent 以 Java 17 编译,Java 11 仅支持 class version 55。 -- 按计划回退 `zsh -lc 'j11; mvn -e compile ...'`:exit 1,`6.932s`;依赖解析失败,尚未进入 javac。 -- `mvn test -P unit-test -pl hugegraph-hubble/hubble-be`:exit 1,`4.57s`;同一依赖解析失败,未执行测试。 -- `mvn checkstyle:check -pl hugegraph-hubble/hubble-be -am`:exit 0,但插件输出大量具体 style 提示后仍报告 `0 violations`,说明当前配置不是可靠失败门禁。Hubble BE 明确包含 line length、indentation、operator wrap、empty-line、whitespace 等问题;既有 dirty diff 尚未覆盖全部问题。 -- Maven effective-model/依赖 warning 还包括旧 `compilerArguments`、blocked HTTP metadata、过期证书 metadata 和 HugeGraph parent model 读取失败,需按“仓库可修 / 外部依赖”分类。 - -## server-core 兼容故障 - -- 当前稳定症状:`hugegraph-core:1.7.0` 传递依赖 `hugegraph-struct:1.7.0` 的 artifact descriptor 无法读取。 -- 精确根因:本地解析到的官方 `hugegraph-struct-1.7.0.pom` 父坐标版本仍为 `${revision}`,Maven 继而请求 `org.apache.hugegraph:hugegraph:pom:${revision}`;腾讯镜像返回 HTTP 400。 -- 当前层级:发布 POM/依赖元数据兼容问题,不是 Hubble Java 源码编译错误。 -- 旧 GitHub run `26214055519` 只有 run 元数据,log 已不可获取,不能作为当前根因证据;当前 HEAD 尚无真实 Hubble CI run。 -- 修复边界:不得直接升级/降级依赖版本;先验证能否通过 Hubble 范围内的显式依赖/排除或正确发布坐标恢复,若涉及版本变更则登记用户决策。 - -## CI 基线 - -- 当前 `.github/workflows/hubble-ci.yml` 已增加 Node 18、Yarn/Playwright cache、FE i18n、release package audit、BE unit test 与 issue-694 API acceptance。 -- 最近可读取的成功 run `28464206368` 总时长约 17m15s,但对应其他分支/旧 workflow:Compile `7m07s`、Prepare env/service `8m15s`、Unit `24s`、API `66s`;只能用作历史对照,不能作为当前 HEAD 基线。 -- 当前 workflow 仍在 Compile 先 install Client/Loader,Prepare 阶段再次 `mvn package`;是否存在可消除的重复构建必须用当前 HEAD run 的 step 数据验证后再改。 - -## 核心 API 测试覆盖初表 - -| 核心路径 | 当前成功合同 | 当前失败/权限/边界合同 | fresh audit 结论 | -|---|---|---|---| -| 认证/会话/拦截器 | `AuthSecurityTest` 覆盖 authenticated client 与 token/space/graph 传递 | 401、未登录、PD capability unavailable | 覆盖较强,需以真实执行确认 | -| Graph/GraphSpace | `GraphServiceImportTest` 覆盖导入成功,`Graphs*Test` 覆盖默认图 | 缺字段、错误数组、重复 ID、边不匹配 | service 边界较强;高频 controller 写路径仍需盘点 | -| Schema | controller security/route tests | 权限与路由注册 | CRUD 成功合同覆盖偏弱 | -| Gremlin/Query | `QueryServiceTest`、history failure、client test | 外部异常、history failure | 有 service failure;核心 controller 成功/非法请求需盘点 | -| Datasource/Loader/Task | upload、load task、job manager success/failure | 空值、重复/恢复、失败状态 | 局部较强,需确认真实 suite 是否收录 | - -## 审计后计划变化 - -- 不再假定 Java 11 + mvnd 可用;增加 mvnd launcher/version 一致性诊断,当前统一回退 Maven 3.9.11。 -- 将“FE lint”拆为源码 lint、测试 warning、第三方 build warning;第三方 warning 不通过修改依赖来擅自处理。 -- 将 server-core 作为 Phase 1 前置阻塞:依赖未解析前无法获得有效 BE compile/test/耗时基线。 -- 将 checkstyle “exit 0 但报告问题”登记为 CI 可诊断性缺口;是否强化为失败门禁属于门禁语义变化,先仅修明确问题并提交独立决策。 -- CI 性能基线必须通过当前 HEAD 的真实 run 重采,不复用旧 run 数字。 - -## Phase 1 实施与验证 - -- 最小修复:在 Hubble 的 `hugegraph-core:1.7.0` 依赖上排除未被 Hubble 源码使用的 `hg-store-common`,从而避免其破损的 `hugegraph-struct:1.7.0` 发布 POM;依赖版本保持不变。 -- `mvn dependency:tree -pl hugegraph-hubble/hubble-be -Dincludes=org.apache.hugegraph` 显示 server-core 相关直接依赖仅为 `hg-pd-client:1.7.0` 与 `hugegraph-core:1.7.0`,不再包含 `hg-store-common/hugegraph-struct`。 -- 首次进入 javac 后暴露既有 import 清理造成的 16 个错误;修复错误包的 `Autowired`、漏掉的 JDK/实体/Elasticsearch imports,并将 `SingleSourceShortestPathEntity` 指向 Hubble 自身 request entity,未改变接口或控制流。 -- BE compile:exit 0,265 source files;cold `11.17s`,并行采样的后续 run `18.28s` 受同时运行 unit test 干扰,不能作为有效 warm 对比,需串行重采。 -- BE unit test:exit 0,119 tests / 0 failures / 0 errors / 0 skipped,wall `22.58s`。 -- 新发现:JaCoCo 报告提示 execution data 与 `AppName` class 不匹配;需清理旧 `jacoco.exec` 后新鲜复验,不能把当前 coverage report 当作最终证据。 -- code-style 精确盘点显示 Hubble BE 仍有约百项 checkstyle 提示,插件仍 exit 0;按文件/根因分批修复并在每批后 compile/test。 diff --git a/.codex-task/hubble2-code-quality/evidence/2026-07-11-phase2-quality.md b/.codex-task/hubble2-code-quality/evidence/2026-07-11-phase2-quality.md deleted file mode 100644 index 87664dfc3..000000000 --- a/.codex-task/hubble2-code-quality/evidence/2026-07-11-phase2-quality.md +++ /dev/null @@ -1,92 +0,0 @@ -# Phase 2 quality and performance evidence - -- 日期:2026-07-11 -- 基线 HEAD:`d8e27523ddf6d0e01dde72143fd464551075f146` -- 当前实现 HEAD:`66e36594ee279bd8063d0bf2dc338f8698e41f46` -- 工作树边界:本文件更新前产品代码已全部按批次提交并推送;本地仅 source-of-truth 文档待收口。 - -## FE warning 分类 - -- fresh `CI=true yarn build`:exit 0,56.80s;52 条第三方 source-map 缺源 warning,另有 Browserslist DB 陈旧和 2.14 MB bundle 提示。 -- fresh Jest:40 suites / 148 tests,exit 0,6.49s;项目可控 React Router future warning 6 条。 -- 最小修复:仅为 3 个测试夹具的 `MemoryRouter` 增加 React Router 已支持的 future flags,不改生产路由。 -- scoped:3 suites / 6 tests,exit 0,3.30s;full:40 / 148,exit 0,4.57s;Router warning 6 -> 0。 -- 剩余 `ReactDOMTestUtils.act`、`rc-table defaultProps`、source-map warning 均来自锁定依赖;不通过关闭 source map、过滤 console 或弱化 CI 处理。 - -## 核心 API 覆盖矩阵与最小增量 - -| 核心域 | 当前成功合同 | 当前重要失败/权限/边界合同 | 本轮结论 | -|---|---|---|---| -| 认证/授权 | 登录、会话、鉴权路由 | 401、503、无效 token/权限 | 已有覆盖充分,不重复增加 | -| Graph/GraphSpace | create/update/default、import | legacy payload、导入边界/失败 | 已有覆盖充分,不重复增加 | -| Gremlin/Query | escaping 与查询构造 | 非法 operator、结构化注入值、history failure | 已有覆盖充分,不重复增加 | -| Loader/Task | 路由、password/token | schema/file mapping 边界 | 已有覆盖满足最小合同 | -| Schema view | export header 安全 | 缺少 view 成功映射与引用不存在失败 | 新增 2 个最小合同测试 | - -新增 `SchemaServiceViewTest`: - -- 成功合同:vertex id、primary keys、property type 映射及空 edge 列表。 -- 失败合同:label 引用不存在的 property key 时抛出现有 `InternalException`。 -- 敏感性 RED:临时将真实属性类型映射替换为 `mutation`,2 tests 中成功合同按预期失败;该 mutation 随即恢复,未进入 diff。 -- GREEN:targeted 2/2;完整 Hubble BE 121 tests,0 failure/error/skip,15.14s。 - -## CI 性能与可诊断性 - -现行 workflow 两个全 cache-hit 成功样本:run `29145996476` 约 9m30s;run `29154385676` 约 14m45s。runner 波动约 55%,后续 before/after 使用至少 3 个 warm run 的中位数与范围。 - -| 慢点 | 快样本 | 慢样本 | 占比/判断 | -|---|---:|---:|---| -| Compile | 1m58s | 3m19s | 包含第一次 FE build | -| Prepare env/service | 4m55s | 7m49s | 最大关键路径 | -| FE production build x2 | 2m08s | 3m41s | 总时长约 22-25% | -| Server source package | 2m19s | 3m36s | 总时长约 24% | -| BE unit + API | 41s | 60s | 非主要慢点 | - -低风险优化 `66e36594`:复用 Loader CI 已验证的精确 Server commit SHA tarball cache。cache miss 仍 checkout 并校验实际 SHA、源码 package;cache hit 只复用同 SHA 目录。已验证 YAML 解析、shell syntax 与本地 cache-hit 分支。真实收益待本 HEAD 三次 warm CI 证据。 - -## 当前门禁冲突 - -- `hubble-dist/pom.xml` 的 frontend build 显式设置 `false`,生成的 `dist.sh` 也 export `CI=false`。 -- workflow 的独立 FE step 未运行 production build;历史成功日志中两次 `Compiled with warnings` 仍绿。 -- 因此当前真实 CI 即使通过,也只能证明现行宽松门禁,不满足本目标最终证据。 -- 临时将两处环境改为 `CI=true` 后,完整 Maven package 仍 exit 0,117.73s,distribution audit 通过;52 条 source-map warning 仍存在。临时修改已恢复,未进入 diff。 -- CRA 5 在本项目中不会将这些 warning 提升为失败,因此恢复 `CI=true` 可消除宽松配置,但不能技术性清零第三方制品 warning。 - -## Checkstyle 门禁 A/B - -- 根因:`tools/checkstyle.xml` 全局 severity 为 `info`,插件默认 `violationSeverity=error`,导致 diagnostics 打印但计数为 0。 -- 全仓当前债务 15 条:Client 6、Loader 9、Hubble BE 0。部分 Client 项为公开 API 名称,不在本目标中重命名。 -- `0fe6fd1f` 仅在 Hubble BE 将失败阈值设为 `info` 并保留 `failOnViolation=true`。 -- 临时 117 字符行 mutation:exit 1、1 violation;恢复后 exit 0、0 violation。mutation 未进入 diff。 - -## FE 依赖决策矩阵 - -- React/Jest:声明 `^18.2.0` 实装 18.3.1;18.3 专门增加 React 19 迁移 warning。最低风险候选是精确 pin `react`/`react-dom` 18.2.0,可望清除 `act` 与 function `defaultProps` warning。 -- X6 38 条:`@antv/x6-react-components` 1.1.20 已是最后 1.x;抽检 2.0.9/3.0.0 仍缺发布源码,major 升级不修根因。 -- Dagre 10 条:传递依赖 0.0.11;越界 override 0.0.12/13 无清 warning 证据,且有布局行为风险。 -- Antd 4 条:4.24.16 已是 4.x 末版;升级 5/6 才避开旧 map,但会改变 CSS/DOM/API/视觉,不符合稳定目标。 -- 推荐决策:批准 React 18.2 精确 pin;52 条 source-map warning 登记为已诊断的外部发布制品缺陷并由用户明确接受。禁用 source map、过滤 loader、patch `node_modules` 均不采用。 - -## 用户决策后的稳定实现 - -- 用户批准精确 pin React/ReactDOM 18.2.0,并接受限定来源/数量的 52 条第三方 source-map warning。 -- `dbf7090d`:package/lock 只改变 React、ReactDOM 与 scheduler 解析;删除仓库和 CI 无消费路径的 npm lockfile,Yarn 保持唯一构建执行器。 -- 实装版本:React 18.2.0、ReactDOM 18.2.0;frozen offline install exit 0。 -- `yarn lint`:330 files,0 warning/error,5.20s。 -- Jest:40 suites / 148 tests,0 warning,6.09s;18.3 的 `act/defaultProps` warning 归零。 -- `CI=true yarn build`:exit 0,47.73s;第三方 source-map warning 精确保持 X6 38、Dagre 10、Antd 4;主 bundle 2.14 MB(较前一构建 +53 B)。 -- Browser:本地 1280px 登录页正常渲染,无横向溢出,用户名/密码/登录控件存在;浏览器控制台 0 error/warning。 -- Maven `CI=true` package:exit 0,123.93s;distribution audit 通过(423 JAR、275 license files、43 FE license files、10 native-bearing JAR)。 -- Antd/X6/Graphin/G6/Dagre、peer dependency、Browserslist/CRA 与 bundle 现代化全部登记为未来计划,明确不属于当前 task/goal。 - -## 精确 Server SHA 本地兼容与性能 - -- CI baseline:Apache HugeGraph Server PR #3008 head `3bd990d8b58e81cb61e3b85c287d34243836f181`;其 Git tree 与 merge commit `99936be5` 完全一致。 -- 为保护 `/Users/imbajin/github/graph/server` 的既有脏工作树,从该精确 SHA `git archive` 到临时目录构建;43-module package exit 0,165.26s。 -- Server tarball SHA-256:`1d76f3ab8afe45ccd36dcd2eb6fbc84e9d947c4db6bb7ef87291799a8a5757d9`。 -- 同一 397 MB、同一 SHA cache 连续 hit:0.41s / 0.40s / 0.35s,中位数 0.40s;相对 cold build 165.26s 节省 164.86s(约 99.76%)。cache miss 仍执行源码构建与 checkout SHA 校验,未削弱兼容门禁。 -- 首次 acceptance 因 daemon 随执行 session 退出导致 Server 8080 不再监听;Hubble health/静态路由 7 项已通过,但 login 连接拒绝。该失败分类为环境生命周期,不是产品断言失败。 -- 有限恢复:使用同一 tarball foreground session 保持 Server 生命周期后重试一次,完整 acceptance 通过。证据目录:`evidence/live-acceptance-2026-07-11/`。 -- Runtime:27 checks;登录/ADMIN、Server login、GraphSpace、Schema view、Job/Async、Property/Vertex/Edge schema、CSV upload/file mapping/loader、3 vertices/2 edges、direct shortest-path、Cypher/OLAP boundary 均符合合同。 -- UI:GraphSpace、Gremlin、Algorithms、AsyncTasks API/页面检查通过,console errors 为空;中英文切换通过,无 raw i18n key/404。 -- `hubble-shortestpath-string-id-followup` 仍按既有 acceptance 合同标记为已知 follow-up;本轮 direct shortest-path 数据合同已通过,该 follow-up 不由本稳定化 goal 扩展修复。 diff --git a/.codex-task/hubble2-code-quality/evidence/2026-07-12-final-local-gates.md b/.codex-task/hubble2-code-quality/evidence/2026-07-12-final-local-gates.md deleted file mode 100644 index 199c341f7..000000000 --- a/.codex-task/hubble2-code-quality/evidence/2026-07-12-final-local-gates.md +++ /dev/null @@ -1,34 +0,0 @@ -# Final Local Gates — 2026-07-12 - -## 边界 - -- 完整本地门禁覆盖的产品实现 SHA:`10c0e8fa4f18694f8f848212ed1da52ef36d80a4` -- 后续 review checkpoint:`03be1bd7b9e2cbdbac90499821bbf4ce147124ac`;相对实现 SHA 仅新增 SOT/evidence 文档,不改变产品验证面 -- 分支:`hubble2` -- 工作树:验证前 clean;验证仅生成 ignored build artifacts -- Java/Maven:Java 11 + Maven 3.9.11 -- GitHub quota:远端 Hubble job pending;不阻塞本地门禁与独立 review,仅延迟最终真实 CI 证据 - -## 新鲜最终结果 - -| 门禁 | 结果 | 耗时/数量 | -|---|---|---| -| FE `yarn lint` | exit 0 | 4.94s;330 files,0 warning/error | -| FE Jest | exit 0 | 6.50s;40 suites / 148 tests;console warning 0 | -| FE `CI=true yarn build` | exit 0 | 47.47s;52 条已批准第三方 source-map warning,来源预算未变化 | -| BE `clean test -P unit-test` | exit 0 | 31.40s;121 tests;checkstyle 0;JaCoCo 407 classes | -| Client + Loader linked install | exit 0 | 49.26s;reactor 3/3 success | -| Hubble package | exit 0 | 126.73s;reactor 3/3 success | -| distribution audit | exit 0 | 423 JAR;275 license;43 FE license;10 native-bearing | -| CI-equivalent sidecars | exit 0 | SHA-512 + temporary GPG signature + `--require-sidecars` | - -## Warning 边界 - -- FE production build 的 52 条 warning 仅来自 X6 38、Dagre 10、Antd 4;这是 DEC-FE-02 明确接受的精确预算,不关闭 source map、不做过滤。 -- Browserslist、bundle size 与 Yarn peer-dependency 债务已进入 FUTURE-VIS,明确不在当前 goal 实施。 -- Maven 发布 POM 元数据、Loader Shade 重复类等为 Hubble 范围外既有输出;本轮没有通过忽略退出码或跳过必需测试换绿。 - -## 仍待外部证据 - -- PR #4 最终 HEAD 的 Hubble CI 与 cache hit 交叉验证;GitHub quota 恢复后补证。 -- 独立只读 reviewer 及必要 re-review。 diff --git a/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/live-hubble-smoke.json b/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/live-hubble-smoke.json deleted file mode 100644 index 213bcc5c2..000000000 --- a/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/live-hubble-smoke.json +++ /dev/null @@ -1,165 +0,0 @@ -{ - "checks": [ - { - "detail": "HugeGraph Hubble
", - "name": "hubble-health", - "status": "passed" - }, - { - "name": "hubble-ui-root", - "status": "passed" - }, - { - "name": "route:/navigation", - "status": "passed" - }, - { - "name": "route:/graphspace", - "status": "passed" - }, - { - "name": "route:/gremlin", - "status": "passed" - }, - { - "name": "route:/algorithms", - "status": "passed" - }, - { - "name": "route:/asyncTasks", - "status": "passed" - }, - { - "name": "hubble-login", - "status": "passed", - "user": "admin" - }, - { - "level": "ADMIN", - "name": "hubble-auth-status", - "status": "passed" - }, - { - "name": "server-login", - "status": "passed", - "user": "admin" - }, - { - "name": "graphspace-list", - "status": "passed" - }, - { - "name": "schema-graphview", - "status": "passed" - }, - { - "name": "job-manager-list", - "status": "passed" - }, - { - "name": "async-task-list", - "status": "passed" - }, - { - "detail_type": "dict", - "name": "server-versions", - "status": "passed" - }, - { - "name": "hubble-schema-propertykeys", - "status": "passed" - }, - { - "label": "issue_694_1783785466_person", - "name": "hubble-schema-vertexlabel", - "status": "passed" - }, - { - "label": "issue_694_1783785466_knows", - "name": "hubble-schema-edgelabel", - "status": "passed" - }, - { - "label": "issue_694_1783785466_person", - "name": "server-direct-schema-vertexlabel", - "status": "passed" - }, - { - "file_mapping_id": 1, - "job_id": 1, - "name": "hubble-upload-csv", - "status": "passed" - }, - { - "file_mapping_id": 1, - "name": "hubble-file-mapping", - "status": "passed" - }, - { - "job_status": "LOADING", - "name": "hubble-loader-task", - "status": "passed", - "task_id": 1, - "task_status": "SUCCEED" - }, - { - "edges": 2, - "expected_edges": 2, - "expected_vertices": 3, - "name": "server-loader-rest-count", - "status": "passed", - "vertices": 3 - }, - { - "expected_edges": [ - [ - "issue_694_1783785466_alice", - "issue_694_1783785466_bob", - "issue_694_1783785466_knows" - ], - [ - "issue_694_1783785466_bob", - "issue_694_1783785466_carol", - "issue_694_1783785466_knows" - ] - ], - "expected_vertices": [ - "issue_694_1783785466_alice", - "issue_694_1783785466_bob", - "issue_694_1783785466_carol" - ], - "name": "server-direct-shortestpath", - "server_edges": 2, - "server_path_objects": 3, - "server_vertices": 3, - "status": "passed" - }, - { - "classification": "known-follow-up", - "name": "hubble-shortestpath-string-id-followup", - "reason": "Hubble shortestPath string-id handling is tracked outside the loader auth smoke gate", - "status": "skipped" - }, - { - "classification": "boundary-or-environment-dependent", - "http_or_business_status": 400, - "name": "analysis-cypher-boundary", - "status": "passed" - }, - { - "classification": "boundary-or-environment-dependent", - "http_or_business_status": 400, - "name": "analysis-olap-boundary", - "status": "passed" - } - ], - "connection_name": "issue_694_1783785466_conn", - "data_prefix": "issue_694_1783785466", - "graph": "hugegraph", - "hubble_home": "/var/folders/9h/hhd8xz1x0bj2kx8vjsm0h4sc0000gn/T/hubble-694-runtime-DY3WED/apache-hugegraph-hubble-1.8.0", - "hubble_url": "http://127.0.0.1:8088", - "server_url": "http://127.0.0.1:8080", - "status": "passed", - "tarball": "hugegraph-hubble/target/apache-hugegraph-hubble-1.8.0.tar.gz", - "work_dir": "/var/folders/9h/hhd8xz1x0bj2kx8vjsm0h4sc0000gn/T/hubble-694-runtime-DY3WED" -} diff --git a/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/manifest.json b/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/manifest.json deleted file mode 100644 index c4b5dc1a1..000000000 --- a/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/manifest.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "status": "passed", - "hubbleUrl": "http://127.0.0.1:8088", - "serverUrl": "http://127.0.0.1:8080", - "graphspace": "DEFAULT", - "graph": "hugegraph", - "runtime": "/Users/imbajin/github/graph/toolchain/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/live-hubble-smoke.json", - "ui": "/Users/imbajin/github/graph/toolchain/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui-full-acceptance.json" -} diff --git a/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui-full-acceptance.json b/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui-full-acceptance.json deleted file mode 100644 index cf3cc0931..000000000 --- a/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui-full-acceptance.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "hubbleUrl": "http://127.0.0.1:8088", - "connId": "1", - "outputDir": "/Users/imbajin/github/graph/toolchain/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui", - "checks": [ - { - "name": "ui-browser-smoke", - "command": "/opt/homebrew/Cellar/node/25.6.0/bin/node /Users/imbajin/github/graph/toolchain/hugegraph-hubble/hubble-dist/assembly/travis/run_ui_browser_smoke.js --hubble-url http://127.0.0.1:8088 --conn-id 1 --output-dir /Users/imbajin/github/graph/toolchain/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui --json-output /Users/imbajin/github/graph/toolchain/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/ui-browser-smoke.json --chromium-executable ", - "startedAt": "2026-07-11T15:57:55.027Z", - "status": "passed", - "stdout": "{\n \"hubbleUrl\": \"http://127.0.0.1:8088\",\n \"authenticatedUser\": \"admin\",\n \"authLevel\": \"ADMIN\",\n \"results\": [\n {\n \"route\": \"/graphspace\",\n \"screenshot\": \"/Users/imbajin/github/graph/toolchain/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/graphspace.png\",\n \"matchedApis\": [\n {\n \"requiredApi\": \"/api/v1.3/graphspaces\",\n \"entries\": [\n {\n \"method\": \"GET\",\n \"url\": \"http://127.0.0.1:8088/api/v1.3/graphspaces?create_time=&query=&page_no=1&page_size=11\",\n \"httpStatus\": 200,\n \"ok\": true,\n \"businessStatus\": 200\n }\n ],\n \"passed\": true\n }\n ],\n \"rawI18nKeyFound\": false,\n \"routeTextMatched\": true,\n \"notFoundPage\": false,\n \"requestCount\": 2\n },\n {\n \"route\": \"/gremlin\",\n \"screenshot\": \"/Users/imbajin/github/graph/toolchain/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/gremlin.png\",\n \"matchedApis\": [\n {\n \"requiredApi\": \"/api/v1.3/graphspaces/list\",\n \"entries\": [\n {\n \"method\": \"GET\",\n \"url\": \"http://127.0.0.1:8088/api/v1.3/graphspaces/list\",\n \"httpStatus\": 200,\n \"ok\": true,\n \"businessStatus\": 200\n },\n {\n \"method\": \"GET\",\n \"url\": \"http://127.0.0.1:8088/api/v1.3/graphspaces/list\",\n \"httpStatus\": 200,\n \"ok\": true,\n \"businessStatus\": 200\n }\n ],\n \"passed\": true\n }\n ],\n \"rawI18nKeyFound\": false,\n \"routeTextMatched\": true,\n \"notFoundPage\": false,\n \"requestCount\": 40\n },\n {\n \"route\": \"/algorithms\",\n \"screenshot\": \"/Users/imbajin/github/graph/toolchain/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/algorithms.png\",\n \"matchedApis\": [\n {\n \"requiredApi\": \"/api/v1.3/graphspaces/list\",\n \"entries\": [\n {\n \"method\": \"GET\",\n \"url\": \"http://127.0.0.1:8088/api/v1.3/graphspaces/list\",\n \"httpStatus\": 200,\n \"ok\": true,\n \"businessStatus\": 200\n },\n {\n \"method\": \"GET\",\n \"url\": \"http://127.0.0.1:8088/api/v1.3/graphspaces/list\",\n \"httpStatus\": 200,\n \"ok\": true,\n \"businessStatus\": 200\n }\n ],\n \"passed\": true\n }\n ],\n \"rawI18nKeyFound\": false,\n \"routeTextMatched\": true,\n \"notFoundPage\": false,\n \"requestCount\": 40\n },\n {\n \"route\": \"/asyncTasks\",\n \"screenshot\": \"/Users/imbajin/github/graph/toolchain/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/asyncTasks.png\",\n \"matchedApis\": [\n {\n \"requiredApi\": \"/api/v1.3/graphspaces/list\",\n \"entries\": [\n {\n \"method\": \"GET\",\n \"url\": \"http://127.0.0.1:8088/api/v1.3/graphspaces/list\",\n \"httpStatus\": 200,\n \"ok\": true,\n \"businessStatus\": 200\n },\n {\n \"method\": \"GET\",\n \"url\": \"http://127.0.0.1:8088/api/v1.3/graphspaces/list\",\n \"httpStatus\": 200,\n \"ok\": true,\n \"businessStatus\": 200\n }\n ],\n \"passed\": true\n }\n ],\n \"rawI18nKeyFound\": false,\n \"routeTextMatched\": true,\n \"notFoundPage\": false,\n \"requestCount\": 12\n }\n ],\n \"consoleErrors\": [],\n \"status\": \"passed\"\n}\n", - "stderr": "" - }, - { - "name": "ui-i18n-switch-smoke", - "command": "/opt/homebrew/Cellar/node/25.6.0/bin/node /Users/imbajin/github/graph/toolchain/hugegraph-hubble/hubble-dist/assembly/travis/run_ui_i18n_switch_smoke.js --hubble-url http://127.0.0.1:8088 --output-dir /Users/imbajin/github/graph/toolchain/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui --json-output /Users/imbajin/github/graph/toolchain/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/ui-i18n-switch-smoke.json --chromium-executable ", - "startedAt": "2026-07-11T15:58:02.759Z", - "status": "passed", - "stdout": "{\n \"hubbleUrl\": \"http://127.0.0.1:8088\",\n \"authenticatedUser\": \"admin\",\n \"authLevel\": \"ADMIN\",\n \"zhContainsChinese\": true,\n \"enSelectorVisible\": true,\n \"textChanged\": true,\n \"rawI18nKeyFound\": false,\n \"notFoundPage\": false,\n \"status\": \"passed\"\n}\n", - "stderr": "" - } - ], - "status": "passed" -} diff --git a/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/algorithms.png b/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/algorithms.png deleted file mode 100644 index 3c53cc3d12d7ae34b37d8e28be5ddf4a36e45d26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105448 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 M{6)E>GdJ%24=U3#DgXcg diff --git a/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/asyncTasks.png b/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/asyncTasks.png deleted file mode 100644 index 79c472794a6ff97cc2c59b8793401f2e84984511..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43269 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

Pt-}3A&T@b5) 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 Candidate-only reflection;不是实时进度源。候选规则不得自动写入 AGENTS.md 或 Memory。 - -## Session Summary - -- Goal:将 Hubble2 提升到质量稳定、CI 可诊断且核心路径具有最小有效测试保障的状态。 -- Outcome:本地实现、package/live acceptance 与独立 review 已完成;真实最终 CI 因 GitHub quota 延迟,目标尚未完成。 -- Key evidence:FE lint/Jest/build、BE 121 tests、Client/Loader 联动、Hubble package/sidecar audit、精确 Server acceptance、独立 review/re-review。 - -## 已复用的历史经验 - -### 1. 分层验证比逐项完整构建更高效 - -- 证据来源:Hubble2 hardening 的批内 targeted checks、阶段完整门禁和最终 package/CI 分层实践。 -- 本轮应用:按共享验证面批处理,完整 build/package 仅在阶段边界和最终 diff 冻结后运行。 -- 不适用情况:公共契约变化、难定位回归或高风险修改必须提前拆批并扩大验证。 - -### 2. 历史 mvnd 复用经验在本轮工具合同下失效 - -- 证据来源:历史最终门禁中 Hubble BE 约 13 秒、Client UnitTestSuite 约 4 秒、Client+Loader install 约 37 秒;完整 Hubble package 仍接近 2 分钟。 -- 本轮结论:当前 mvnd agent 要求 Java 17,与项目 Java 11 合同冲突;统一使用 Java 11 + Maven 3.9.11,并单独记录 cold/warm 数据。 -- 不适用情况:只有后续 mvnd 明确支持当前 Java 合同,且与 CI 原生 Maven 做过等价性验证后,才可重新评估 daemon 复用。 - -### 3. 性能优化必须保留真实门禁 - -- 证据来源:历史 `CI=true` build 曾暴露 59 files/183 warnings;隐藏 warning 会造成错误绿色。 -- 本轮应用:只消除重复工作、无效缓存和不必要串行等待,不删除测试或弱化断言。 -- 不适用情况:无;若优化只能通过降低覆盖获得收益,应作为拒绝或用户决策项。 - -## Lessons - -### 区分外部排队与完成门禁 - -- Event:GitHub quota 使多数 job 长时间 queued;用户明确要求它不阻塞本地实测和 review。 -- Root cause:把“当前不可立即取得”误等同于“所有工作被阻塞”,会浪费可并行的本地验证窗口。 -- Effective response:继续完成本地完整门禁、live acceptance 和独立 review,同时保留真实 CI 为最终完成条件。 -- Next time:外部 CI 排队时先推进所有独立本地工作;只有最终声明完成时才要求届时实际 head 的 CI 证据。 - -### 依赖清单必须由生成器同步 - -- Event:license checker 将当前 runtime snapshot 与旧 `known-dependencies.txt` 做 diff,准确暴露 31 add/2 remove。 -- Root cause:依赖图变化后没有同步受控 third-party inventory;手工只改直接依赖会遗漏传递项。 -- Effective response:运行仓库生成器产生 516 项清单,再用 CI 同一检查脚本验证 exit 0,并由独立 reviewer 确认没有混入升级。 -- Next time:任何改变 runtime dependency graph 的提交都应在本地重新生成并检查 third-party inventory。 - -### 文档 SHA 应表达证据语义而非自指当前值 - -- Event:reviewer 发现文档提交后,SOT 仍把其 parent 实现 SHA 称为“当前 HEAD”。 -- Root cause:把“完整验证覆盖的 SHA”和“不断前移的 PR HEAD”混为一谈。 -- Effective response:拆成产品验证基线、review checkpoint 和最终 CI 的届时实际 PR head;re-review 确认 finding resolved。 -- Next time:证据文件记录稳定的“验证覆盖 SHA/观测 checkpoint”,避免在将改变 HEAD 的提交中写静态“当前 HEAD”。 - -## Promotion Candidates - -### HGTC-CQ-01 runtime 依赖变化同步 third-party inventory - -- Proposed rule:修改 runtime dependency graph 后,运行 `regenerate_known_dependencies.sh current-dependencies.txt` 并用 `check_dependencies.sh` 验证受控清单。 -- Scope:repository -- Target:repo `AGENTS.md` -- Evidence:PR #4 license checker 在清单落后时稳定失败;生成后本地同门禁 exit 0,独立复审无 finding。 -- Counterexample:仅测试 scope 或不进入 runtime snapshot 的依赖变化无需改清单,但仍应运行检查确认。 -- Validation:在临时分支增加/移除一个 runtime 依赖,确认检查先红;同步清单后转绿。 -- Status:pending - -### HGTC-CQ-02 CI quota 排队不阻塞独立本地工作 - -- Proposed rule:CI 因 quota queued 时继续本地门禁、证据整理和独立 review;保留最终实际 PR head 的真实 CI 作为完成门禁。 -- Scope:repository -- Target:repo `AGENTS.md` -- Evidence:本轮在排队期间完成 package、sidecar、live acceptance 和 review,没有弱化最终 CI 要求。 -- Counterexample:缺失外部服务使本地无法等价验证,且所有剩余工作都依赖该服务时,仍可能构成真实阻塞。 -- Validation:检查恢复入口能从 CI 待证项继续,而不会重跑已通过的独立本地门禁。 -- Status:pending - -### HGTC-CQ-03 证据 SHA 使用稳定语义 - -- Proposed rule:SOT 区分 fresh-audit SHA、完整验证覆盖 SHA、review checkpoint 和最终 CI head,避免在提交内把 parent SHA 称为当前 HEAD。 -- Scope:repository -- Target:repo `AGENTS.md` -- Evidence:独立 reviewer 将 SHA 混用列为唯一 Important;语义拆分后 re-review resolved。 -- Counterexample:只读报告且不会产生后续提交时,可以直接记录报告生成时的当前 HEAD,但必须带观测时间。 -- Validation:提交 SOT 后检查其中 SHA 描述仍真实,不因该提交自身前移 HEAD 而过期。 -- Status:pending diff --git a/.codex-task/hubble2-code-quality/plan.md b/.codex-task/hubble2-code-quality/plan.md deleted file mode 100644 index e74556fa7..000000000 --- a/.codex-task/hubble2-code-quality/plan.md +++ /dev/null @@ -1,116 +0,0 @@ -# Hubble2 Code Quality Implementation Plan - -> **For agentic workers:** Execute coherent dependent tasks in the current session. Use parallel agents only for genuinely independent workstreams. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** 在默认保持 Hubble 业务语义、公开 API 和用户行为稳定的前提下,清理明确的前后端质量问题,定位并改善构建/CI 慢点,修复 server-core 升级故障,并为核心 API 补齐最小有效测试。2026-07-12 用户确认 Hubble 2.0 尚未发布、无需保留旧契约,因此旧 review 暴露的不合理 destructive/auth/JSON 契约按显式批准直接迁移,不提供 legacy facade。 - -**Architecture:** 工作分为基线、低风险质量修复、CI/构建性能、server-core 兼容性、核心 API 测试与最终门禁六个阶段。`todo.md` 是唯一实时状态源,`progress.md` 保存跨会话 checkpoint,日期 evidence 保存命令、耗时、日志与 CI URL,`lessons.md` 只保存结束反思和待审批规则候选。 - -**Tech Stack:** Java 11、Maven/mvnd、Spring Boot、JUnit、React 18、TypeScript/JavaScript、ESLint、Jest、Yarn 1、GitHub Actions。 - -## Global Constraints - -- 仅处理 Hubble 及为验证所必需的 Client/Loader、构建和 CI 文件;不修改 Server/PD 仓库。 -- 保留当前工作树已有改动;开始实施前按文件归属记录基线,不覆盖、回退或混入无关修改。 -- lint/code-style 修复优先采用不改变控制流、数据流、公开 API 和运行语义的最小改动。 -- 禁止用 `CI=false`、禁用规则、跳过必需测试、弱化断言、忽略退出码或伪造响应获得绿色结果。 -- 依赖升级、公开 API/序列化契约变化、CI 门禁删除或大范围工作流重构必须先记录方案、收益、风险和回滚方式,并暂停等待用户批准。 -- 2026-07-12 已批准的例外仅限 `todo.md` 的 DEC-REV-01..05;不得据此扩大到未列出的业务语义或依赖升级。 -- 所有生产代码、测试逻辑、构建或 CI 改动在最终完成前必须由未参与实现的独立只读 reviewer 审查;修复 finding 后复审受影响范围。 - ---- - -## 文件与状态职责 - -- `.codex-task/hubble2-code-quality/plan.md`:范围、阶段、验证层级、性能方法、风险与恢复规则。 -- `.codex-task/hubble2-code-quality/todo.md`:唯一实时状态源;只保存可检查事项、状态和 evidence 链接。 -- `.codex-task/hubble2-code-quality/progress.md`:当前阶段、工作树状态、最近验证、阻塞、恢复入口和下一动作。 -- `.codex-task/hubble2-code-quality/lessons.md`:结束时通过 `reflection` skill 生成的证据化经验和待审批推广候选。 -- `.codex-task/hubble2-code-quality/evidence/YYYY-MM-DD-*.md`:环境、SHA、精确命令、退出码、分段耗时、日志摘要、CI run URL 和 before/after 对比。 -- `.codex-task/hubble2-hardening/`:只读历史基线;不得重新启用其已完成 TODO。 - -## 复用的执行加速合同 - -1. **三层验证** - - 批内反馈:只运行受影响的 Java test、JS/JSX ESLint、Jest 和 i18n。 - - 阶段门禁:一批改动冻结后运行完整 Hubble BE tests、完整 FE Jest/lint/i18n 与 `CI=true yarn build`。 - - 最终门禁:最终 diff 冻结后运行 Client/Loader 联动、Hubble package/audit、真实 CI 与独立 review;仅在用户可见行为变化时增加真实发布包 Chrome 验证。 -2. **Daemon 与环境固定** - - 本地固定 Java 11;fresh audit 已确认当前 `mvnd` 2.0.0-rc-3 agent 需要 Java 17,不能在 Java 11 启动,因此当前统一使用 Maven 3.9.11,避免混用 launcher/daemon 产生伪差异。 - - 仅在 launcher、agent 与 Java 11 兼容性重新验证后才恢复 `mvnd`;远程 CI 保持仓库原生命令语义。 -3. **按共享验证面批处理** - - 先盘点并按根因、目录或测试面归组,再集中修复;一批的上限是失败后仍能快速定位到具体文件或调用点。 - - 公共契约变化、难定位回归或风险升级时立即拆批,单独执行 RED/GREEN。 -4. **慢任务并行** - - 预计超过两分钟的 build/test/CI 等待期间,如有有意义且不冲突的工作,启动只读盘点、日志分析、证据整理或文件所有权隔离的独立 lane;禁止制造忙碌任务或让并行实现者编辑同一文件。 -5. **失败与连续性** - - 首次 CI/test/network 失败不是终止条件:保存证据、分类为确定性或瞬态、有限重试并继续其他可执行项。 - - 暂停或 quota 前更新 `todo.md` 与 `progress.md`,记录未提交状态、最近成功验证、失败证据、reset time/时区和下一条恢复命令;使用非阻塞等待并恢复同一目标。 - -## 性能分析方法 - -- 在相同 commit、Java/Node/Yarn 版本、runner 类型和命令参数下采集可比较样本;每条关键路径至少记录一次 cold run 和一次 warm run,不把网络首次下载与稳定执行混为一谈。 -- 对 GitHub Actions 按 checkout、toolchain setup、dependency restore/install、frontend checks、Maven compile/package、服务准备、测试和 acceptance 分段记录 wall time;同时记录 cache key、cache hit/miss、下载量和重复构建点。 -- 本地分别测量 FE install/lint/Jest/build、BE targeted/full test、Client+Loader install、Hubble compile/package;记录 `time`/Maven reactor summary、峰值内存或明确资源异常。 -- 优化候选按“预计节省时间、正确性风险、维护成本、回滚难度”评估。只有不削弱门禁、契约清晰且可通过 before/after 证明收益的低风险项可直接实施。 -- 不用单次偶然波动宣称性能提升;至少比较相同条件 before/after,若 CI 噪声较大则保留多次 run 范围或中位数,并明确推断边界。 - -## 实施阶段 - -### Phase 0:基线与所有权 - -- 记录当前 branch/HEAD、工作树已有修改及文件所有权,创建首份日期 evidence。 -- 盘点 Hubble FE/BE lint、compile warning、现有测试入口、Hubble CI job/step 和 server-core 失败日志。 -- 建立可枚举问题清单、性能测量矩阵和风险分级;不得在基线采集前开始大批修改。 - -### Phase 1:server-core 依赖解析前置恢复 - -- 以 `hugegraph-struct:1.7.0` 发布 POM 残留 `${revision}` 的当前复现为起点,确定 Hubble 范围内不改变版本/契约的最小恢复方案。 -- 恢复依赖解析后立即补跑 BE compile/test cold/warm 基线;如只能通过依赖版本变化解决,停止并登记用户决策。 - -### Phase 2:前后端 lint 与 code-style - -- 按根因和验证面拆分为 FE JS/JSX、FE TS、BE Java、构建配置批次。 -- 每批采用最小语义保持修复,运行 scoped lint/test;阶段冻结后运行完整 FE/BE 门禁。 -- 对需要改变 hooks 依赖、异步时序、异常处理或序列化行为的 warning 升级为行为改动,先添加测试并单独审查。 - -### Phase 3:本地构建与 CI 性能 - -- 完成本地 cold/warm 分段基线和 Hubble CI step 级基线,定位关键路径、重复工作、无效缓存和串行等待。 -- 先实施低风险优化,例如缓存键/路径纠正、同一阶段的重复安装或重复构建消除、无依赖步骤并行化;不得删除覆盖面或改变发布包门禁含义。 -- 高风险候选写入 evidence 的用户决策区后挂起,不阻塞其他阶段。 - -### Phase 4:server-core 运行兼容验证 - -- 从失败 CI 的精确 head、server-core 版本和完整日志建立稳定复现;区分编译、二进制/API 兼容、运行环境和测试 fixture 问题。 -- 先写或定位能复现故障的最小验证,再实施兼容修复;验证 Hubble BE、必要 Client/Loader 联动与真实 Hubble CI。 -- 若修复要求 Server/PD 变更,只记录准确调用点、外部依赖和解除条件,不越界修改其仓库。 - -### Phase 5:核心 API 最小有效测试 - -- 从 controller/service 调用图、现有测试和用户高频路径建立覆盖矩阵,优先认证/会话、GraphSpace/Graph、Schema、Gremlin、Datasource/Loader/Task 等核心读写链路。 -- 每个入选路径至少覆盖一个关键成功合同和一个最重要失败/权限/边界合同;优先 service/controller 单元或窄集成测试,不复制已有 E2E 覆盖。 -- 测试必须在修复前对目标缺口产生可解释失败,修复后稳定通过;不追求覆盖率数字或外围 CRUD 大而全。 - -### Phase 6:最终门禁与独立审查 - -- 冻结最终 diff,运行与改动风险匹配的完整前后端、联动、package/audit 和真实 CI 门禁,并将命令、退出码、耗时与 URL 写入 evidence。 -- 由未参与实现的独立只读 reviewer 对最终 diff、目标覆盖、性能证据、兼容性、测试有效性、回归和遗漏进行审查。 -- 修复全部 actionable findings;同一 reviewer 或另一独立 reviewer 复审受影响改动。无未解决高严重度 finding 后才可完成。 -- 使用 `reflection` skill 的 candidate-only 模式更新 `lessons.md`;推广到 AGENTS.md 或 Memory 必须另获用户明确授权。 - -## 完成标准 - -- `todo.md` 全部范围内事项有可复核 evidence,或由用户明确接受为不实施的高风险候选。 -- FE lint/Jest/i18n/`CI=true` build、BE compile/tests、必要 Client/Loader 联动和 Hubble package/audit 均真实通过。 -- server-core 升级故障有稳定复现、根因、修复和真实 CI 证据。 -- 性能报告包含相同条件 before/after、关键路径归因和未实施候选,不削弱任何必需门禁。 -- 核心 API 覆盖矩阵与新增最小测试均有成功/失败合同证据。 -- 独立 review/re-review 完成,无未解决高严重度 finding;`progress.md` 与 `lessons.md` 已收口。 - -## 停止条件 - -- 需求或稳定设计冲突,或继续会覆盖用户已有工作树修改。 -- 需要改变公开 API、业务语义、数据兼容性、依赖版本或删除 CI 必需门禁。 -- 经有限恢复后,必需外部环境仍不可用并阻止所有有意义的剩余工作。 -- 无法创建独立只读 reviewer。 diff --git a/.codex-task/hubble2-code-quality/progress.md b/.codex-task/hubble2-code-quality/progress.md deleted file mode 100644 index 0dee13128..000000000 --- a/.codex-task/hubble2-code-quality/progress.md +++ /dev/null @@ -1,85 +0,0 @@ -# Hubble2 Code Quality Progress - -## 当前 checkpoint - -- 更新时间:2026-07-12 02:00 +08:00 -- 当前阶段:Phase 6B review remediation 最终门禁 -- 当前分支:`hubble2` -- 目标状态:active -- 唯一实时状态源:[`todo.md`](todo.md) -- 执行合同:[`plan.md`](plan.md) -- 完整本地门禁覆盖的产品实现 SHA:`10c0e8fa4f18694f8f848212ed1da52ef36d80a4` -- 独立整体 review checkpoint:`03be1bd7b9e2cbdbac90499821bbf4ce147124ac` -- 最新已推送代码 checkpoint:`e76544c70055f7fcb97c1c499f7ceee463e77696` -- 最终候选/真实 CI SHA:`a56fb6c1ebb27c717568bf1e0baba1cb94afa3c0` -- 当前工作树:旧 review remediation 的 FE/BE/CI/测试和 SOT 修改,尚未提交;无用户未确认的 API/依赖升级混入 - -## 已完成 - -- 创建新的 code-quality 状态空间,未重新启用已完成的 hardening TODO。 -- 从 `.codex-task/hubble2-hardening/EXECUTION.md` 和最终 evidence 提炼三层验证、`mvnd` 复用、批处理、慢任务并行、有限重试和真实门禁经验。 -- 在 plan 中增加 cold/warm、本地/CI 分段计时、cache hit/miss、重复构建和 before/after 性能证据方法。 -- 在 HEAD `b66848d3` 完成 fresh audit,记录工具版本、工作树边界、FE build/Jest、BE compile/test/checkstyle、CI workflow/run 与核心 API 覆盖初表。 -- 清除 Java 11 + mvnd 可复用的失效假设;当前固定 Java 11 + Maven 3.9.11。 -- 将 TODO 从初始 25 项重排为审计后 30 项,增加依赖解析前置阶段、Jest/第三方 warning 分类与 checkstyle 可诊断性事项。 -- 通过排除 Hubble 未使用的 `hugegraph-core -> hg-store-common` 传递依赖恢复解析;修复既有 import 清理暴露的 compile errors。 -- BE compile 成功;Hubble BE 119 tests 全部通过;依赖树不再包含破损的 `hugegraph-struct` 链。 -- 清理 stale JaCoCo 数据后重跑成功,报告分析 265 classes,无 class mismatch。 -- Hubble BE checkstyle 从 128 项降至 0;clean javac unchecked warning 从 49 项降至 0,并清理本项目可控 deprecation warning。 -- Client/Loader Java 11 联动 install 成功:41.04s(root 2.98s、client 1.87s、loader 36.06s)。 -- EditorConfig 扫描排除通用生成物/二进制缓存,避免本地 ignored `node_modules`、`dist`、`.vinext`、`.wrangler`、DB、SVG/WOFF2 干扰真实门禁。 -- FE Router warning 6 -> 0;full Jest 40 suites / 148 tests 通过;第三方 warning 已隔离。 -- 核心 API 覆盖矩阵完成;新增 Schema view 成功/失败合同,mutation RED 有效,完整 BE 121 tests 通过。 -- CI 性能慢点完成分段;实现精确 Server SHA tarball cache,最新产品 HEAD `66e36594` 已推送并触发 PR #4 CI。 -- Hubble BE checkstyle 真实失败阈值已启用;临时违规 exit 1,恢复后 0 violations。 -- FE 显式 lint 已恢复:JS/JSX 329 文件原本 clean;唯一 TS 文件从配置 exit 2、36 errors 修至全量 330 文件 0 warning/error,并接入 CI。 - -## 工作树边界 - -- fresh audit 基线:审计前已有 26 个 Hubble BE Java 修改(`+150/-57`),已保留并纳入 scoped verification。 -- 当前:工作树 clean;本轮提交覆盖 BE 依赖/风格门禁、FE lint/React 稳定批次、Schema 最小合同测试、精确 Server cache 和 CI 可诊断性。未改变公开 API 或业务控制流。 - -## 最近验证 - -- 2026-07-12 remediation 稳定工作树:JDK 11 Hubble BE unit 133/133,checkstyle 0,JaCoCo 无 class mismatch,18.14s。 -- FE full Jest 41 suites / 153 tests,lint 0 warning,i18n zh/en 各 1584;smoke Python regression 5/5;actionlint 1.7.12 和 `git diff --check` 通过。 -- `e76544c7` 上一阶段真实 PR checks 全部通过:Hubble、Client、Loader、Tools、Spark、Go、license header/dependency、triage。 - -- FE `yarn lint`:exit 0,4.94s,330 files 0 warning/error;Jest:40 suites / 148 tests,exit 0,6.50s,console warning 0。 -- FE `CI=true yarn build`:exit 0,47.47s;仅保留已接受的 52 条第三方 source-map warning,以及已转未来任务的 Browserslist/bundle 提示。 -- BE clean compile:成功,265 source files;本项目 unchecked/deprecation warning 为 0,剩余输出为外部发布 POM/仓库元数据 warning。 -- BE clean unit:121 tests,0 failure/error/skip,exit 0,31.40s;checkstyle 0,JaCoCo 分析 407 classes。 -- Hubble checkstyle info 级门禁已证明临时违规 exit 1、恢复后 exit 0;全仓 15 条既有 debt 不扩入本目标。 -- Client/Loader linked install:exit 0,49.26s;shade 的历史依赖重复 warning 不属于本轮 Hubble 源码 warning。 -- Hubble package:exit 0,126.73s;distribution audit 423 JAR / 275 license / 43 FE license / 10 native-bearing。 -- CI 等价 sidecar audit:SHA-512、临时 GPG detached signature、`--require-sidecars` 均 exit 0。 -- PR #4 最终候选 `a56fb6c1`:全部 checks 通过。Hubble 11m12s;dependency license 12m28s;Client 12m13s;Loader 6m26s;Tools 4m57s;Spark 4m59s;Go 4m48s。 -- Hubble 真实 CI:Compile 3m23s、Prepare 4m13s、release audit 1m、unit 28s、API 30s;Server SHA `3bd990d8...` cache 2.7s 命中,121 tests 与 runtime/UI acceptance 全部通过。 - -## 阻塞与决策 - -- 历史 review 已在 `e76544c7` 完整复核:清图/认证/API/readiness/algorithm/artifact findings 仍真实并已按用户 D1=A、D2=B、D3=A、D4=A、D5=A 实施;TrueLicense、Server tree 不一致和 legacy 残留结论已证明过期。 -- 当前清图只提供诚实的 Schema+数据操作;data-only 对用户有高价值,FE/BE TODO 与 FUTURE-SERVER-01 明确要求 Server 支持后第一时间恢复。 -- Server CI 已固定 master 合入 commit `99936be5...`;其 tree 与此前验证的 PR head 相同。 - -- server-core 发布 POM 阻塞已用 Hubble 最小排除解除;精确 Server package、Hubble package 与完整本地 acceptance 已证明运行兼容,仅最终 HEAD 真实 CI 待补。 -- DEC-FE-01/02 已获用户批准:本轮精确 pin React/ReactDOM 18.2.0、恢复 `CI=true`,并以限定来源/数量接受 52 条第三方 source-map warning。 -- Antd/X6/Graphin/G6/Dagre 等核心可视化栈现代化已登记为未来任务,明确不属于当前 task/goal;稳定版本冻结后再积极迁移和重构。 -- 当前唯一构建执行器为 Yarn;删除无消费路径且与精确 pin 冲突的 `package-lock.json`。既有 peer-dependency、Browserslist 与 bundle 债务纳入未来现代化任务,本轮不补包、不升级核心图组件。 -- React/ReactDOM 18.2 稳定批次已完成:lint 0、Jest 148/148 且控制台 warning 归零、`CI=true` build 通过、浏览器登录页正常、Maven package/distribution audit 通过。 -- 精确 PR #3008 Server SHA 隔离构建通过;完整 runtime/UI acceptance 在一次环境生命周期恢复后通过,未发现 server-core 运行兼容错误。 -- Server cache 本地 before/after 已收口:165.26s cold vs 0.40s hit 中位数,约节省 99.76%,未削弱 SHA 校验或 miss 源码构建。 -- 合并重复 FE build/release scan 属门禁编排重构(DEC-CI-02),未实施。 -- `check-dependency-license` 失败根因为受控 third-party inventory 落后于当前 runtime snapshot;使用仓库生成器得到 516 项并更新(31 add/2 remove),同一检查脚本本地 exit 0。该提交未改依赖声明或版本。 -- 独立 reviewer `/root/final_reviewer` 完整覆盖 `b66848d..03be1bd7`;唯一 Important 为 SOT SHA 语义,修复后 re-review resolved。后续依赖清单提交亦 re-review,无新增 finding。 -- 最终绿色 CI 有两类非失败 annotation 待 DEC-CI-03:GitHub Actions Node 20 runtime 弃用,以及 SkyWalking Eyes 内部 setup-go cache path restore。消除前者需多项 action major 升级;后者需第三方 pin/替换/fork 调查,均不得未经批准实施。 - -## 下一动作 - -1. 运行 Client/Loader 联动、Hubble production build/package/distribution audit 与必要 live acceptance。 -2. 提交并推送代码阶段,等待新 HEAD 真实 CI;quota 排队期间继续证据整理。 -3. 冻结最终 diff,创建未参与实现的独立 reviewer;修复后 re-review,再收口 progress/lessons。 - -## 恢复入口 - -续跑时先读取 `plan.md`、`todo.md`、`progress.md`,核对当前 HEAD/工作树是否变化,然后从 `todo.md` 第一个未完成项继续;不要创建重复目标或重新打开 hardening TODO。 diff --git a/.codex-task/hubble2-code-quality/todo.md b/.codex-task/hubble2-code-quality/todo.md deleted file mode 100644 index a7dbdf335..000000000 --- a/.codex-task/hubble2-code-quality/todo.md +++ /dev/null @@ -1,111 +0,0 @@ -# Hubble2 Code Quality TODO - -> 唯一实时状态源。这里只保存可检查事项、状态与 evidence 链接;执行规则见 [`plan.md`](plan.md),跨会话恢复见 [`progress.md`](progress.md)。旧 `.codex-task/hubble2-hardening/` 仅作历史基线。 - -- 初始化日期:2026-07-11 -- 当前分支:`hubble2` -- 审计日期/HEAD:2026-07-11 / `b66848d308d58e6899cab7eb92589f1789b62259`;2026-07-12 旧 review 复核基线 `e76544c70055f7fcb97c1c499f7ceee463e77696` -- 完整本地门禁覆盖的产品实现 SHA:`10c0e8fa4f18694f8f848212ed1da52ef36d80a4` -- 独立整体 review checkpoint:`03be1bd7b9e2cbdbac90499821bbf4ce147124ac` -- 最新已推送代码 checkpoint:`e76544c70055f7fcb97c1c499f7ceee463e77696`;当前 review remediation 尚未提交 -- 最终候选/真实 CI SHA:`a56fb6c1ebb27c717568bf1e0baba1cb94afa3c0` -- fresh audit 工作树边界:26 个审计前已存在的 Hubble BE Java 修改,`+150/-57` -- 初始/审计后 TODO 数:25 / 30 -- 当前范围内 CQ:30 项原始审计任务完成;新增 8 项 review remediation 中 6 项本地完成、2 项待最终门禁/review;FUTURE 不计入本轮完成率 -- 状态:旧 review 当前 HEAD 复核和批准项实现完成;本地阶段门禁通过,待 package/audit、真实 CI、独立 review/re-review -- 当前阶段:Phase 6 review remediation 与最终门禁 - -## Phase 0:基线与所有权 - -- [x] **CQ-BASE-01** 记录 HEAD、工作树已有改动、文件所有权和环境版本。证据:[`evidence/2026-07-11-fresh-audit.md`](evidence/2026-07-11-fresh-audit.md)。 -- [x] **CQ-BASE-02** 枚举 FE/BE lint、compile/code-style warning 并分类;确认 checkstyle 当前不会因已报告问题失败。证据:fresh audit。 -- [x] **CQ-BASE-03** 完成本地分段基线:FE build/Jest/lint、BE compile/unit、Client+Loader install、Hubble package、精确 Server cold/cache-hit 均有当前数据。 -- [x] **CQ-BASE-04** 最终候选 HEAD 真实 Hubble CI step/cache/重复工作基线已保存;精确 Server cache key/hit 与阶段耗时可复核。证据:[`evidence/2026-07-12-final-real-ci.md`](evidence/2026-07-12-final-real-ci.md)。 -- [x] **CQ-BASE-05** 稳定复现 server-core 依赖错误并固定当前 HEAD/版本/日志;旧失败 run 日志已过期不可用。证据:fresh audit。 -- [x] **CQ-BASE-06** 建立认证、Graph/GraphSpace、Schema、Gremlin、Datasource/Loader/Task 覆盖初表。证据:fresh audit。 - -## Phase 1:server-core 依赖解析前置恢复 - -- [x] **CQ-COMPAT-01** 验证发布 POM `${revision}` 根因与 `hugegraph-core -> hg-store-common -> hugegraph-struct` 路径。证据:fresh audit Phase 1。 -- [x] **CQ-COMPAT-02** 通过排除 Hubble 未使用的 `hg-store-common` 恢复依赖解析,版本/API 不变。证据:dependency tree + compile。 -- [x] **CQ-COMPAT-03** 清理 stale JaCoCo 后 BE 119 unit tests、Client/Loader install 联动均通过;联动耗时 41.04s。 - -## Phase 2:lint 与 code-style - -- [x] **CQ-LINT-01** 329 个 JS/JSX 文件显式 ESLint 0 warning/error;`yarn lint` 已接入真实 CI。 -- [x] **CQ-LINT-02** 修复唯一 TS 文件缺少 parser services 的配置阻塞及 36 个机械 lint error;全量 330 文件 0 warning/error。 -- [x] **CQ-LINT-03** Hubble BE checkstyle 由 128 项降为 0,javac unchecked warning 由 49 项降为 0,并清理本项目 deprecation warning;compile、119 unit、checkstyle 均通过。 -- [x] **CQ-LINT-04** 本项目 lint/Jest warning 清零;52 条第三方 source-map warning 已按来源/数量获用户接受;peer/build-stack 债务明确转入未来任务。 -- [x] **CQ-LINT-05** React Router warning 6 -> 0;第三方 source-map/act/defaultProps warning 已隔离并登记依赖升级决策。证据:[`evidence/2026-07-11-phase2-quality.md`](evidence/2026-07-11-phase2-quality.md)。 -- [x] **CQ-LINT-06** 定位 severity 阈值错配;仅对当前 0 diagnostics 的 Hubble BE 启用 info 级失败,mutation A/B 证明 1 violation 时 exit 1。全仓 15 条 debt 不扩入本目标。 - -## Phase 3:构建与 CI 性能 - -- [x] **CQ-PERF-01** 已量化 Compile、Prepare、重复 FE build 与 Server package;Server package 为稳定高价值慢点。 -- [x] **CQ-PERF-02** 精确 Server SHA cache 本地 before/after:cold 165.26s;3 次 hit 0.41/0.40/0.35s,中位数 0.40s,约节省 99.76%;真实 CI quota 后补交叉验证。 -- [x] **CQ-PERF-03** 高风险/收益不确定方案已记录并获边界决策;核心可视化栈升级明确排除在当前 goal 外。 - -## Phase 4:server-core 运行兼容 - -- [x] **CQ-COMPAT-04** 精确 PR #3008 Server tree package、Hubble package 及完整 live acceptance 未发现 Java API/二进制/运行兼容错误。 -- [x] **CQ-COMPAT-05** 保存无真实运行兼容错误的否证;首次连接拒绝已证明为 daemon session 生命周期并经 foreground 有限恢复排除。 -- [x] **CQ-COMPAT-06** 最终候选 HEAD 的真实 Hubble CI 已通过:精确 Server SHA、package/audit、121 unit、runtime/UI acceptance 全部成功。 - -## Phase 5:核心 API 测试 - -- [x] **CQ-TEST-01** 完成核心 API 覆盖矩阵;仅 Schema view 存在最小关键缺口。 -- [x] **CQ-TEST-02** 新增 Schema view 成功映射合同。 -- [x] **CQ-TEST-03** 新增缺失 property key 的现有失败合同。 -- [x] **CQ-TEST-04** mutation RED 1 failure、GREEN targeted 2/2、full BE 121/121;未重复既有覆盖。证据:Phase 2 evidence。 - -## Phase 6:最终门禁与审查 - -- [x] **CQ-FINAL-01** 新鲜运行完整 FE/BE、联动、package/audit 门禁并保存耗时与退出码。证据:[`evidence/2026-07-12-final-local-gates.md`](evidence/2026-07-12-final-local-gates.md)。 -- [x] **CQ-FINAL-02** 最终候选 HEAD `a56fb6c1` 的 Hubble CI、dependency license 及全部 PR checks 真实通过。 -- [x] **CQ-FINAL-03** 独立只读 reviewer `/root/final_reviewer` 完成 `b66848d..03be1bd7` 整体审查;实现无高严重度 finding。 -- [x] **CQ-FINAL-04** 唯一 Important(SOT SHA 语义)已修复并复审通过;依赖清单后续修复 `0a160afc..e2c6926e` 亦由同一 reviewer 复审,无 finding。 -- [x] **CQ-FINAL-05** progress 已更新,并以 reflection candidate-only 模式完成 lessons;未修改 AGENTS 或 Memory。 - -## Phase 6B:历史 review 当前 HEAD 复核与修复 - -- [x] **CQ-REV-01** 修复默认图卡片使用 `isDefault` 的错误字段;默认图两种 destructive action 均不可点击,真实渲染测试在修复前 RED、修复后 GREEN。 -- [x] **CQ-REV-02** 按 DEC-REV-01 移除伪 data-only 入口和 destructive GET;唯一 `POST .../{graph}/clear` 明确清除 Schema+数据,旧 GET 和 data-only facade 均不存在;FE/BE 留有 Server 能力恢复 TODO。 -- [x] **CQ-REV-03** 按 DEC-REV-02 迁移个人资料 JSON PUT、401 reject、`graph`/`nullableProps` 字段,并删除退役 Super/UUAP API、页面、路由和 facade;新增成功、未认证、校验、旧端点和字段合同测试。 -- [x] **CQ-REV-04** 按 DEC-REV-03 修复登录 Session 原子提交、ID 轮换、异常清理、Client/连接关闭和 standalone timeout;保留当前 Gremlin 所需的 10 分钟短期凭据。 -- [x] **CQ-REV-05** readiness 严格验证 `/about` JSON;环境依赖算法非 200 记 `skipped` 而非 `passed`;CI `always()` 上传 smoke JSON、截图和日志。 -- [x] **CQ-REV-06** 按 DEC-REV-04 将 Server 固定到 master 已合入提交 `99936be5f41fccd193f120e01206e3cf3c73a050`,不再动态依赖关闭的 PR #3008。 -- [ ] **CQ-REV-07** 当前 remediation diff 完成 JDK 11 FE/BE、Client/Loader、package/audit、live acceptance 和真实 CI 最终门禁。 -- [ ] **CQ-REV-08** 未参与实现的独立 reviewer 完成最终 diff review;finding 修复后 re-review,无未解决高严重度问题。 - -## 用户决策项 - -- **DEC-FE-01(已批准,2026-07-11)**:精确 pin `react`/`react-dom` 18.2.0,以清除 18.3 的迁移期 Jest warning,并恢复 Maven production build 的 `CI=true`。验证范围:148 Jest、production build、关键 UI、package/audit/API。 -- **DEC-FE-02(已接受,2026-07-11)**:接受当前精确识别的 52 条第三方发布制品 source-map warning(X6 38、Dagre 10、Antd 4)。仅接受当前来源与数量;不关闭 source map、不做 loader 过滤、不 patch 第三方包;新增、增量或来源变化必须重新调查。 -- **DEC-CI-02(暂缓)**:FE build 去重、release audit 去重、Maven cache 合并仍属收益/等价性未充分证明的 workflow 重构,不实施。 -- **DEC-CI-03(已处理,2026-07-12)**:用户批准兼容前提下升级 CI actions;checkout/setup/cache/codecov/CodeQL 等已迁移当前 major,Temurin 替代 deprecated adopt。SkyWalking Eyes 当前 main 内部非失败 cache annotation 为第三方实现限制,用户已接受。 -- **DEC-REV-01(已批准,2026-07-12)**:隐藏 data-only,直接迁移 destructive GET 为非 GET;Server 提供保 Schema API 后第一时间恢复高价值 data-only 功能。 -- **DEC-REV-02(已批准,2026-07-12)**:Hubble 2.0 无旧契约包袱,个人资料、Axios 401、Super/UUAP、`graphe` 和 `NullableProps` 直接按合理新契约迁移,不保留兼容层。 -- **DEC-REV-03(已批准,2026-07-12)**:本轮保留 Gremlin 依赖的短期 Session 凭据,只实施 Session 原子性、轮换、异常清理和资源安全;认证重构转未来。 -- **DEC-REV-04(已批准,2026-07-12)**:CI 固定 HugeGraph master 已合入 commit,不再动态依赖 PR。 -- **DEC-REV-05(已批准,2026-07-12)**:逐 JAR license/native allowlist 属未来 release-hardening;当前 Category-X/package/audit gate 保持不弱化。 - -## 未来任务:核心可视化技术栈现代化(明确不属于当前 task/goal) - -> 前置条件:先交付并冻结本 goal 的稳定可用基线。以下任务只记录后续方向,本轮禁止实施、混入 commit 或用作当前完成条件。 - -- [ ] **FUTURE-VIS-01** 建立 Antd、X6、Graphin/G6、Dagre、React 及构建链的版本/维护状态/安全/兼容矩阵,确定目标技术栈与分阶段迁移顺序。 -- [ ] **FUTURE-VIS-02** 固化核心页面视觉与交互基线:登录、导航、GraphSpace、Schema、图查询、图详情、ER 图编辑、菜单/工具栏、表格/弹窗及错误态;保存截图、关键 DOM/交互和可访问性证据。 -- [ ] **FUTURE-VIS-03** 为图可视化建立布局与数据合同:节点/边数量、位置稳定性、缩放/拖拽/选择、菜单/工具栏、复杂图性能及异常/空图边界,避免升级只验证“能渲染”。 -- [ ] **FUTURE-VIS-04** 分离升级 React 测试生态与 UI/图组件:先升级 Testing Library/类型/测试设施,再按独立批次迁移 Antd major、X6/Graphin/G6、Dagre;每批可单独回滚。 -- [ ] **FUTURE-VIS-05** Antd major 迁移需审计组件 API、CSS token、DOM、主题、表格/表单/弹窗行为和视觉差异,并完成真实浏览器回归。 -- [ ] **FUTURE-VIS-06** X6/Graphin/G6/Dagre 迁移需验证图模型转换、布局输出、事件语义、插件/React shape、序列化兼容和大图性能,禁止仅以 build/test 通过收口。 -- [ ] **FUTURE-VIS-07** 清理兼容层、废弃 API、旧 polyfill、重复图工具和过期构建配置;每项删除必须有无调用证据和回滚点。 -- [ ] **FUTURE-VIS-08** 输出同条件 before/after:bundle、首屏/交互耗时、布局耗时、内存、warning/debt 数量及浏览器兼容;达不到收益或稳定性门槛则不合并。 -- [ ] **FUTURE-VIS-09** 清理当前 Yarn peer-dependency 债务:Graphin/lodash-es、Testing Library/types、react-json-view/flux、CRA Babel、vis-network peers、Ecomfe lint/stylelint peers;先证明真实消费路径,不以盲目补包换静默。 -- [ ] **FUTURE-VIS-10** 现代化 Browserslist/CRA/build toolchain,更新浏览器数据策略并评估替代已停止演进的 CRA;同时制定 2.14 MB 主 bundle 的 code-splitting 与性能预算。 - -## 未来任务:Server 能力与 release hardening(明确不属于当前 task/goal) - -- [ ] **FUTURE-SERVER-01** Server 提供并验证保留 Schema 的 data-only clear API 后,第一时间恢复 Hubble FE/BE “仅清数据”能力、确认文案、权限/默认图保护和成功/失败合同测试。 -- [ ] **FUTURE-AUTH-01** 重构 Gremlin Basic 认证,移除 HTTP Session 中的短期明文凭据,并验证登录、查询和 token 生命周期。 -- [ ] **FUTURE-REL-01** 建立逐 JAR license 映射及 native-bearing JAR allowlist/NOTICE 审计;正式 RC 使用真实发布密钥完成 `.sha512`/`.asc` 验证。 diff --git a/.gitignore b/.gitignore index 85c9a500f..ba5e60b11 100644 --- a/.gitignore +++ b/.gitignore @@ -104,7 +104,8 @@ go.env # AI-IDE prompt files (We only keep AGENTS.md, other files could soft-linked it when needed) # Local AI-agent workspaces and run evidence -.codex-task/ +.codex-task/* +!.codex-task/GLOBAL-TODO.md .autonomous/ .claude/ From 49c76ffd7a9ae2a38c0f036ca2411644108f550d Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 02:46:17 +0800 Subject: [PATCH 49/68] docs: consolidate remaining hubble work - capture the unfinished UI and UX refactor - keep completed legacy and hardening tasks excluded - preserve detailed execution steps in local task records --- .codex-task/GLOBAL-TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.codex-task/GLOBAL-TODO.md b/.codex-task/GLOBAL-TODO.md index 4256fdc7d..581f0124f 100644 --- a/.codex-task/GLOBAL-TODO.md +++ b/.codex-task/GLOBAL-TODO.md @@ -4,6 +4,7 @@ ## Hubble 2.0 +- 完成 Hubble UI/UX 重构:基于真实双模式与 Chrome 基线完成三方向选型,交付“理解图、准备数据、查询分析”三个核心旅程,并以能力映射、可访问性、性能和发布包回归收口。 - 现代化 React、Ant Design、X6/Graphin/G6、Dagre 与构建链;先固化核心页面、图交互、性能和浏览器回归基线,再分批升级并清理兼容层。 - HugeGraph Server 提供保留 Schema 的 data-only clear API 后,恢复 Hubble“仅清数据”能力及权限、默认图和失败合同测试。 - 重构 Gremlin Basic 认证,移除 HTTP Session 中的短期明文凭据,并验证 token 生命周期。 From 53a9408e0976ca6049caa01efce526ea520ad257 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 03:00:37 +0800 Subject: [PATCH 50/68] chore(hubble): correct README references and update gitignore --- .gitignore | 1 + AGENTS.md | 18 +- README.md | 12 +- .../2026-07-10-hubble-api-cleanup-design.md | 215 ------------------ hugegraph-hubble/README.md | 47 +++- 5 files changed, 53 insertions(+), 240 deletions(-) delete mode 100644 docs/superpowers/specs/2026-07-10-hubble-api-cleanup-design.md diff --git a/.gitignore b/.gitignore index ba5e60b11..96af3fcca 100644 --- a/.gitignore +++ b/.gitignore @@ -108,6 +108,7 @@ go.env !.codex-task/GLOBAL-TODO.md .autonomous/ .claude/ +superpowers/ # Local Hubble runtime / extracted distributions /db*.db diff --git a/AGENTS.md b/AGENTS.md index f398d6ad6..4aa6cceaa 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ This file provides guidance to AI coding assistants (Claude Code, Cursor, GitHub ## Project Overview -Apache HugeGraph Toolchain - a multi-module Maven project providing utilities for the HugeGraph graph database. Current version: 1.7.0. +Apache HugeGraph Toolchain - a multi-module Maven project providing utilities for the HugeGraph graph database. It relies on the Java Client to power loaders, CLI tools, and the modernized Hubble platform. ## Build Commands @@ -130,22 +130,6 @@ hugegraph-loader, hugegraph-tools, hugegraph-hubble, hugegraph-spark-connector | tools | `hugegraph-tools/src/main/java` | `org.apache.hugegraph` | | spark | `hugegraph-spark-connector/src/main/scala` | `org.apache.hugegraph.spark` | -## Running Applications - -### Hubble (Web UI on port 8088) -```bash -cd hugegraph-hubble/apache-hugegraph-hubble-*/bin -./start-hubble.sh # Background -./start-hubble.sh -f # Foreground -./stop-hubble.sh # Stop -``` - -### Loader -```bash -cd hugegraph-loader/apache-hugegraph-loader-* -./bin/hugegraph-loader.sh [options] -``` - ## Docker ```bash diff --git a/README.md b/README.md index 3d848a2ec..322e6bda5 100644 --- a/README.md +++ b/README.md @@ -234,12 +234,12 @@ client := hugegraph.NewClient("http://localhost:8080", "hugegraph") **Purpose**: Web-based graph management and visualization platform **Key Features**: -- Schema management with visual editor -- Data loading interface -- Graph visualization and exploration -- Gremlin query console -- Multi-graph workspace management -- User authentication and authorization +- Multi-graph workspace & connection management +- Interactive schema management with graphical editor +- Comprehensive data loading dashboard +- Dynamic graph visualization with path and topology canvas +- Built-in Gremlin query console & algorithm explorer +- Fine-grained user authentication & multi-language localization (i18n) **Technology Stack**: Spring Boot + React + TypeScript + MobX + Ant Design diff --git a/docs/superpowers/specs/2026-07-10-hubble-api-cleanup-design.md b/docs/superpowers/specs/2026-07-10-hubble-api-cleanup-design.md deleted file mode 100644 index 39d4b7238..000000000 --- a/docs/superpowers/specs/2026-07-10-hubble-api-cleanup-design.md +++ /dev/null @@ -1,215 +0,0 @@ -# Hubble API Cleanup Design - -> **Status: Accepted.** 本文只记录稳定的 API/兼容性决策,不记录当前进度。 -> 未完成事项以 [Hubble2 TODOs](../../../.codex-task/hubble2-hardening/TODOs.md) 为准。 - -## Goal - -Align Hubble's graph-management facade with the canonical HugeGraph Server -contracts from `apache/hugegraph#3008`, remove unreleased legacy endpoints, and -make destructive graph-clear actions explicit and difficult to trigger by -mistake. - -## Compatibility Boundary - -Hubble 2.0 is unreleased, so its frontend and backend facade routes do not need -legacy compatibility. Obsolete Hubble-only routes are removed instead of kept -as aliases. - -`hugegraph-client` is a public library with a different compatibility boundary. -Its unsupported per-graph reload methods remain binary/source compatible for -this release but are marked `@Deprecated` with guidance that only whole-server -graph reload is currently supported. The no-argument reload methods remain. - -## Canonical Hubble Graph APIs - -### Update graph metadata - -The frontend sends a JSON mutation to the graph resource: - -```http -PUT /api/v1.3/graphspaces/{graphspace}/graphs/{graph} -Content-Type: application/json - -{"nickname":"New nickname"} -``` - -The backend validates the request shape and calls -`GraphsService.update(...)`. The client layer continues to translate that call -to Server's `{"action":"update","update":{...}}` body. The GET -`/{graph}/update` facade is removed. - -### Create graph - -Only path-resource JSON creation remains: - -```http -POST /api/v1.3/graphspaces/{graphspace}/graphs/{graph} -Content-Type: application/json - -{"nickname":"Graph nickname","schema":"optional-template"} -``` - -The form-urlencoded collection endpoint `POST /graphs` and its legacy test are -removed. - -### Default graph - -Hubble exposes only these routes: - -```text -POST /api/v1.3/graphspaces/{graphspace}/graphs/{graph}/default -DELETE /api/v1.3/graphspaces/{graphspace}/graphs/{graph}/default -GET /api/v1.3/graphspaces/{graphspace}/graphs/default -``` - -GET mutation aliases `setdefault` and `unsetdefault` are removed. The old -`getdefault` read alias is replaced by the canonical `default` resource. - -## Removed Unused Facades - -The unused role routes `setdefaultrole` and `deldefaultrole` are removed. -Hubble will expose default-role management only when a product flow needs it, -using Server's canonical POST/GET/DELETE resource contract. - -The Hubble-only default-GraphSpace `setdefault` and `getdefault` routes, service -methods, frontend API functions, and UI mutation are removed. Non-PD routing -continues to use the existing `DEFAULT` GraphSpace product-mode rule. Hubble -does not invent a default-GraphSpace contract before Server defines one. - -## Graph Clear Transitional Behavior - -Both existing user-facing clear actions and the GET `/{graph}/truncate` Hubble -facade remain temporarily because Server has not implemented two distinct -canonical operations. - -The data-only frontend/backend path receives a code TODO that states the exact -follow-up: replace the temporary facade after Server provides and verifies a -data-only operation that preserves schema. The UI must not silently claim that -the current Server behavior has that guarantee; it warns users to treat the -operation as potentially affecting schema until the Server contract is ready. - -### Strong confirmation dialog - -Both actions use one controlled confirmation component with a mode of -`data` or `schema-and-data`. - -The dialog always: - -- shows the GraphSpace and graph name; -- describes the requested deletion scope; -- states that the operation is irreversible; -- requires the exact graph name before enabling confirmation; -- disables duplicate submission while the request is pending; -- preserves the dialog and typed value on failure, showing the backend error; -- closes, reports success, and refreshes the graph list only after success. - -For `data`, the dialog describes the intended vertex/edge data deletion and -adds the transitional warning that schema preservation is not yet guaranteed -by a dedicated Server API. For `schema-and-data`, it explicitly lists graph -data, property keys, vertex labels, edge labels, and indexes. - -## Error Handling - -Existing response normalization remains the transport boundary. API failures -must use the backend-provided message when available. A failed destructive -request must not close the dialog or clear the user's confirmation input. -Success handling must not depend on a response body when the backend returns an -empty successful response. - -## Dashboard Address and Health Boundary - -`dashboard.address` remains the shared Vermeer/Dashboard host-and-port value; -it does not contain a scheme, path, credentials, query, or fragment. The -existing `server.protocol` option supplies `http` or `https`. Hubble's -`GET /api/v1.3/dashboard` returns both values after configuration validation -and performs no outbound health request. - -The browser constructs the external origin from those two fields. It does not -probe the configured address during page load. A reachability probe is allowed -only after the user explicitly clicks a Dashboard operation, uses no -credentials or referrer, has a bounded timeout, and either opens the requested -external page or reports one localized actionable failure. This preserves -private and loopback deployment support without turning passive navigation -rendering into an arbitrary network request. - -## Retired Role Authorization Deep Link - -Role management has no supported Navigation entry in Hubble 2.0, and the -top-level `/role` path already redirects to `/navigation`. The orphaned legacy -`/role/graphspace/:graphspace/:role` authorization path follows the same -replace-redirect policy instead of rendering the old RoleAuth page. This keeps -direct bookmarks from exposing a partially localized, unsupported product -surface while preserving a deterministic non-404 recovery path. - -## Retired and External Operational APIs - -The unused graph-storage facade is retired. Hubble has no reachable product -consumer for `/graphspaces/{graphspace}/graphs/{graph}/storage`, and the former -backend implementation was already commented out. Both remnants are removed; -Hubble must not invent storage data to keep a dead endpoint green. - -Audit log is not a Hubble 2.0 published surface: there is no route, navigation -entry or frontend client, and its Elasticsearch dependency is disabled by -default. The fully commented controller is removed instead of restoring an -untested capability. Reintroducing audit requires a separate accepted design, -real Elasticsearch environment and complete authentication/browser evidence. - -PD and HStore status endpoints remain external-capability boundaries. Server -1.7.0 does not expose the REST paths required by the current HugeClient calls. -Hubble keeps the real calls and records the exact dependency at each call site; -it must not synthesize a healthy response. These endpoints are not consumed by -the Hubble frontend, whose monitoring entry opens Dashboard. - -The missing APIs remain external blockers, but their failure representation is -Hubble-owned. These two status endpoints map the verified downstream -`ServerException` to HTTP/business 503 with a localized actionable message and -no downstream cause. Other ServerException paths retain their legacy HTTP -compatibility until separately migrated. - -In non-PD mode, `/graphspaces/list` exposes `DEFAULT` for business navigation, -while the paginated `/graphspaces` management API has no manageable records. -This is an intentional capability distinction, not evidence that a synthetic -GraphSpace record should enable unsupported management mutations. - -Graph nickname input follows the Server contract rather than the card display -truncation. Server master `3bd990d8` defines a 48-character maximum in -`GraphManager.NICKNAME_MAX_LENGTH`; Hubble therefore accepts up to 48 -characters while cards may still visually truncate long nicknames. The graph -name remains immutable during edit and follows its separate name contract. - -## Testing and Acceptance - -Backend MockMvc coverage verifies: - -- PUT graph update accepts JSON and delegates the path graph plus nickname; -- GET `/{graph}/update` is absent; -- form-urlencoded `POST /graphs` is absent while JSON path creation works; -- canonical default POST, DELETE, and GET routes delegate correctly; -- legacy default graph GET aliases are absent; -- obsolete role and default-GraphSpace routes are absent. - -Frontend unit coverage verifies: - -- graph update uses PUT with a JSON body; -- default graph read uses `/graphs/default`; -- removed facade functions are no longer exported; -- destructive confirmation text contains GraphSpace, graph name, scope, and - irreversible warning; -- confirmation is disabled until the exact graph name is entered; -- each mode calls only its matching API; -- failures keep the dialog open and expose the backend message. - -Client coverage verifies the public per-graph reload methods are deprecated at -compile/API level while no-argument reload behavior remains unchanged. - -Final verification uses Java 11 for Hubble backend tests, the focused frontend -test suites, frontend production build, and targeted client tests/compile. - -## Out of Scope - -- Defining or implementing Server's two graph-clear APIs. -- Claiming schema preservation before that Server behavior is verified. -- Creating a new default-role product flow. -- Defining a canonical default-GraphSpace Server API. -- Removing the public per-graph reload methods in this release. diff --git a/hugegraph-hubble/README.md b/hugegraph-hubble/README.md index 33227f022..d9196a168 100644 --- a/hugegraph-hubble/README.md +++ b/hugegraph-hubble/README.md @@ -7,6 +7,49 @@ hugegraph-hubble is a graph management and analysis platform that provides features: graph data load, schema management, graph relationship analysis, and graphical display. +## Functional Modules Overview + +```mermaid +graph TD + Hubble["HugeGraph-Hubble Platform"] + + Hubble --> Conn["1. Workspace Management
(Multi-Graph Connections)"] + Hubble --> Schema["2. Visual Schema Designer
(Vertex, Edge & Index Types)"] + Hubble --> Load["3. Guided Data Importer
(Source Mapping & Task Monitor)"] + Hubble --> Analyze["4. Graph Analysis & Visualization
(Gremlin Console & Visual Exploration)"] + Hubble --> System["5. System Administration
(Async Tasks & Access Control)"] +``` + +

+ASCII diagram (for terminals/editors) + +``` + ┌──────────────────────────────────────────┐ + │ HugeGraph-Hubble Platform │ + └────────────────────┬─────────────────────┘ + │ + ┌───────────────────────────┼───────────────────────────┐ + ▼ ▼ ▼ +┌──────────────┐ ┌──────────────┐ ┌──────────────┐ +│ Workspace │ │Visual Schema │ │ Guided Data │ +│ Management │ │ Designer │ │ Importer │ +│ - Connect │ │ - Vertex │ │ - Sources │ +│ - Switch │ │ - Edge │ │ - Mapping │ +│ - Card View │ │ - Index │ │ - Monitor │ +└──────────────┘ └──────────────┘ └──────────────┘ + │ │ + └───────────────────────────┬───────────────────────────┘ + │ + ▼ + ┌──────────────────────────┐ + │Graph Analysis & Explorer │ + │ - Gremlin Console │ + │ - Algorithm Execution │ + │ - Topology Exploration │ + └──────────────────────────┘ +``` +
+ ## Features - Graph connection management, supporting to easily switch graph to operate @@ -16,13 +59,13 @@ graph data load, schema management, graph relationship analysis, and graphical d ## Quick Start -There are three ways to get HugeGraph-Loader: +There are three ways to get HugeGraph-Hubble: - Download the Toolchain binary package - Source code compilation - Use Docker image (Convenient for Test/Dev) -And you can find more details in the [doc](https://hugegraph.apache.org/docs/quickstart/hugegraph-loader/#2-get-hugegraph-loader) +And you can find more details in the [doc](https://hugegraph.apache.org/docs/quickstart/hugegraph-hubble/#2-deploy) ### 1. Download the Toolchain binary package From 57098c137bcfc01a73c1df6080eb90b334ac00c2 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 04:00:55 +0800 Subject: [PATCH 51/68] fix(hubble): harden request security - disable Kubernetes token endpoints\n- validate pagination and close request clients\n- secure CORS and sanitize exception logging\n- clean up graph listeners and loading state\n- add backend security regression coverage --- hugegraph-hubble/Dockerfile | 2 + .../hugegraph/config/GlobalCorsConfig.java | 6 +- .../hugegraph/controller/BaseController.java | 2 + .../controller/auth/LoginController.java | 4 + .../controller/op/K8sTokenController.java | 10 +-- .../query/EditElementHistoryController.java | 12 ++- .../hugegraph/handler/CustomInterceptor.java | 34 ++++++++ .../hugegraph/handler/ExceptionAdvisor.java | 21 ++--- .../apache/hugegraph/util/GremlinUtil.java | 2 + .../org/apache/hugegraph/util/PageUtil.java | 27 +++++- .../src/main/resources/application.properties | 2 + .../resources/hugegraph-hubble.properties | 5 ++ .../unit/K8sTokenEndpointSecurityTest.java | 44 ++++++++++ .../hugegraph/unit/PriorityFixTest.java | 83 +++++++++++++++++++ .../apache/hugegraph/unit/UnitTestSuite.java | 2 + .../components/RouteErrorBoundary/index.js | 44 ++++++++++ .../src/modules/component/FixNode/index.js | 24 ++++-- .../src/modules/component/RedoUndo/index.js | 9 +- .../GraphStatistics/Home/index.js | 9 +- .../hubble-fe/src/pages/Schema/index.js | 12 ++- .../hubble-fe/src/routes/index.js | 9 +- 21 files changed, 315 insertions(+), 48 deletions(-) create mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/K8sTokenEndpointSecurityTest.java create mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/PriorityFixTest.java create mode 100644 hugegraph-hubble/hubble-fe/src/components/RouteErrorBoundary/index.js diff --git a/hugegraph-hubble/Dockerfile b/hugegraph-hubble/Dockerfile index 60fad2ca0..4591715d7 100644 --- a/hugegraph-hubble/Dockerfile +++ b/hugegraph-hubble/Dockerfile @@ -40,5 +40,7 @@ FROM eclipse-temurin:11-jre-jammy COPY --from=build /pkg/hugegraph-hubble/apache-hugegraph-hubble-*/ /hubble WORKDIR /hubble/ +# SECURITY: This is a plain HTTP port. Do not publish it to an untrusted network; +# production/public deployments must put Hubble behind HTTPS and block bypasses. EXPOSE 8088 ENTRYPOINT ["./bin/start-hubble.sh", "-f"] diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/GlobalCorsConfig.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/GlobalCorsConfig.java index 565f94aad..8706c8de0 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/GlobalCorsConfig.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/config/GlobalCorsConfig.java @@ -30,11 +30,11 @@ public class GlobalCorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); - config.addAllowedOrigin("*"); - config.setAllowCredentials(true); + // Same-origin is the secure default. Deployments that need cross-origin + // access must add an explicit trusted-origin allowlist. + config.setAllowCredentials(false); config.addAllowedMethod("*"); config.addAllowedHeader("*"); - config.addExposedHeader("/api/**"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/BaseController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/BaseController.java index e85c647fc..a5767e92c 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/BaseController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/BaseController.java @@ -108,6 +108,8 @@ protected void setUser(String username) { } protected void setCredentialPassword(String password) { + // TODO: Stop retaining the plaintext login password after Vermeer migrates to + // token/service credentials and Loader/Ingest token-only paths are verified. setSession(Constant.CREDENTIAL_PASSWORD_KEY, password); setSession(Constant.CREDENTIAL_EXPIRES_AT_KEY, System.currentTimeMillis() + Constant.CREDENTIAL_TTL_MILLIS); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java index 6e4629b83..69e7dacef 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java @@ -64,6 +64,8 @@ public class LoginController extends BaseController { @PostMapping("/login") public Object login(@RequestBody Login login) { + // TODO: Add account-aware throttling and security audit events before this + // endpoint is exposed to an untrusted network. // Set Expire: 1 Month login.expire(TOKEN_EXPIRE_SECONDS); try { @@ -185,6 +187,8 @@ public Object status() { return ImmutableMap.of("level", level); } + // FIXME: Change logout to POST and add CSRF/Origin protection after coordinating + // the API change with the frontend; explicitly harden the session cookie as well. @GetMapping("/logout") public void logout() { this.clearAuthSession(); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/K8sTokenController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/K8sTokenController.java index 695a4b66b..ce878b46f 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/K8sTokenController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/op/K8sTokenController.java @@ -26,20 +26,16 @@ import java.nio.file.Paths; import java.util.List; -import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.controller.BaseController; import org.apache.hugegraph.exception.InternalException; import com.google.common.collect.ImmutableMap; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; @Log4j2 -@RestController -@RequestMapping(Constant.API_VERSION + "k8s/token") +// SECURITY: This controller is intentionally not registered or mapped. Do not expose +// Kubernetes credentials through Hubble without a privileged authorization design. public class K8sTokenController extends BaseController { @Autowired @@ -54,7 +50,6 @@ private Path fileDir() { return null; } - @GetMapping public Object getK8sToken() { Path configDir = fileDir(); @@ -78,7 +73,6 @@ public Object getK8sToken() { throw new InternalException("k8s.token.file.not-exist"); } - @GetMapping("dir") public Object getK8sToken1() { Path configDir = fileDir(); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/EditElementHistoryController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/EditElementHistoryController.java index 3d4339b57..ac008cfda 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/EditElementHistoryController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/EditElementHistoryController.java @@ -137,6 +137,9 @@ public IPage queryByGremlin( defaultValue = "10") int pageSize, @RequestParam(name = "gremlin_query", required = true) String gremlinQuery) { + // FIXME: Push range/limit and an explicit total-count strategy to the server; + // collecting the complete Gremlin result defeats pagination and risks OOM. + PageUtil.checkPositivePage(pageNo, pageSize); GremlinResult gremlin = gremlinService.gremlin(graphSpace, graph, new GremlinQuery(gremlinQuery)); @@ -155,8 +158,8 @@ public IPage queryByGremlin( List mergedElements = mergeEditHistory(this.authClient(graphSpace, graph), histories, - elements); - return PageUtil.page(mergedElements, pageNo, pageSize); + subElements); + return PageUtil.newPage(mergedElements, pageNo, pageSize, elements.size()); } private List mergeEditHistory(HugeClient client, @@ -196,8 +199,9 @@ private List mergeEditHistory(HugeClient client, private List getSubList(List elements, int pageNo, int pageSize) { - int start = Math.min((pageNo - 1) * pageSize, elements.size()); - int end = Math.min(pageNo * pageSize, elements.size()); + long offset = (long) (pageNo - 1) * pageSize; + int start = (int) Math.min(offset, elements.size()); + int end = (int) Math.min(offset + pageSize, elements.size()); return elements.subList(start, end); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomInterceptor.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomInterceptor.java index cb2d0494d..b48d9cdbb 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomInterceptor.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/CustomInterceptor.java @@ -34,6 +34,8 @@ import org.apache.hugegraph.common.Constant; import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.exception.ExternalException; +import org.apache.hugegraph.util.PageUtil; import lombok.extern.log4j.Log4j2; @@ -53,6 +55,8 @@ public class CustomInterceptor extends HandlerInterceptorAdapter { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + validatePage(request, "page_no", false); + validatePage(request, "page_size", true); String url = request.getRequestURI(); if (!CHECK_API_PATTERN.matcher(url).matches()) { setHugeClientToRequest(request); @@ -73,6 +77,36 @@ public boolean preHandle(HttpServletRequest request, return true; } + private void validatePage(HttpServletRequest request, String name, + boolean size) { + String value = request.getParameter(name); + if (!StringUtils.hasText(value)) { + return; + } + try { + int number = Integer.parseInt(value); + boolean invalid = size ? number != -1 && + (number < 1 || number > PageUtil.MAX_PAGE_SIZE) : + number < 1; + if (invalid) { + throw new ExternalException("Invalid pagination parameter: %s", name); + } + } catch (NumberFormatException e) { + throw new ExternalException("Invalid pagination parameter: %s", name); + } + } + + @Override + public void afterCompletion(HttpServletRequest request, + HttpServletResponse response, + Object handler, Exception exception) { + Object value = request.getAttribute("hugeClient"); + if (value instanceof HugeClient) { + ((HugeClient) value).close(); + request.removeAttribute("hugeClient"); + } + } + public void setHugeClientToRequest(HttpServletRequest request) { String uri = request.getRequestURI(); HugeClient client = null; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java index bb4b79f78..ee8c55ba7 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java @@ -20,7 +20,6 @@ import org.apache.hugegraph.driver.HugeClient; import org.apache.hugegraph.exception.ServerException; -import org.apache.commons.lang3.StringUtils; import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.exception.IllegalGremlinException; import org.apache.hugegraph.exception.InternalException; @@ -55,10 +54,13 @@ public class ExceptionAdvisor { @Autowired private MessageSourceHandler messageSourceHandler; + // FIXME: Map business failures to HTTP status codes only after auditing frontend + // compatibility; clients currently depend on the status field in the JSON body. + @ExceptionHandler(InternalException.class) @ResponseStatus(HttpStatus.OK) public Response exceptionHandler(InternalException e) { - log.info("Log InternalException: ", e); + log.warn("Internal request failure"); String message = this.handleMessage(e.getMessage(), e.args()); closeRequestClient(); return Response.builder() @@ -71,7 +73,7 @@ public Response exceptionHandler(InternalException e) { @ExceptionHandler(ExternalException.class) @ResponseStatus(HttpStatus.OK) public Response exceptionHandler(ExternalException e) { - log.info("Log ExternalException: ", e); + log.debug("External request failure: {}", e.getMessage()); String message = this.handleMessage(e.getMessage(), e.args()); closeRequestClient(); return Response.builder() @@ -96,12 +98,7 @@ public Response exceptionHandler(ParameterizedException e) { @ExceptionHandler(ServerException.class) @ResponseStatus(HttpStatus.OK) public Response exceptionHandler(ServerException e) { - String logMessage = "Log ServerException: \n" + e.exception() + "\n"; - if (e.trace() != null) { - logMessage += StringUtils.join( - HubbleUtil.>uncheckedCast(e.trace()), "\n"); - } - log.info(logMessage); + log.warn("HugeGraph Server request failed"); String message = this.handleMessage(e.getMessage(), null); closeRequestClient(); @@ -115,7 +112,7 @@ public Response exceptionHandler(ServerException e) { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.OK) public Response exceptionHandler(Exception e) { - log.info("Log Exception: ", e); + log.error("Unexpected request failure", e); String message = this.handleMessage(e.getMessage(), null); closeRequestClient(); return Response.builder() @@ -156,7 +153,7 @@ public Response exceptionHandler( @ExceptionHandler(IllegalGremlinException.class) @ResponseStatus(HttpStatus.OK) public Response exceptionHandler(IllegalGremlinException e) { - log.info("Log IllegalGremlinException: ", e); + log.debug("Illegal Gremlin request: {}", e.getMessage()); String message = this.handleMessage(e.getMessage(), e.args()); closeRequestClient(); return Response.builder() @@ -169,7 +166,7 @@ public Response exceptionHandler(IllegalGremlinException e) { @ExceptionHandler(UnauthorizedException.class) @ResponseStatus(HttpStatus.UNAUTHORIZED) public Response exceptionHandler(UnauthorizedException e) { - log.info("Log UnauthorizedException: ", e); + log.debug("Unauthorized request: {}", e.getMessage()); String message = e.getMessage(); closeRequestClient(); return Response.builder() diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/GremlinUtil.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/GremlinUtil.java index 22f42831b..55d21d837 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/GremlinUtil.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/GremlinUtil.java @@ -310,6 +310,8 @@ public static Object escape(Object object) { } public static String optimizeLimit(String gremlin, int limit) { + // FIXME: Do not treat suffix matching as a resource-safety boundary. Decide on + // server-side timeout/result/byte limits without changing aggregation semantics. String[] rawLines = StringUtils.split(gremlin, "\n"); List newLines = new ArrayList<>(rawLines.length); for (String rawLine : rawLines) { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/PageUtil.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/PageUtil.java index da90d03ff..523410fe6 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/PageUtil.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/util/PageUtil.java @@ -27,7 +27,28 @@ public final class PageUtil { + public static final int MAX_PAGE_SIZE = 500; + + public static void checkPage(int pageNo, int pageSize) { + boolean invalidSize = pageSize != -1 && + (pageSize < 1 || pageSize > MAX_PAGE_SIZE); + if (pageNo < 1 || invalidSize) { + throw new IllegalArgumentException( + "page_no must be >= 1 and page_size must be -1 or between 1 " + + "and " + MAX_PAGE_SIZE); + } + } + + public static void checkPositivePage(int pageNo, int pageSize) { + if (pageNo < 1 || pageSize < 1 || pageSize > MAX_PAGE_SIZE) { + throw new IllegalArgumentException( + "page_no must be >= 1 and page_size must be between 1 and " + + MAX_PAGE_SIZE); + } + } + public static IPage page(List entities, int pageNo, int pageSize) { + checkPage(pageNo, pageSize); // Regard page no < 1 as 1 int current = pageNo > 1 ? pageNo : 1; int pages; @@ -60,9 +81,9 @@ public static IPage page(List entities, int pageNo, int pageSize) { public static IPage newPage(List records, int pageNo, int pageSize, int total) { - - int current = pageNo > 1 ? pageNo : 1; - int pages = 0; + checkPositivePage(pageNo, pageSize); + int current = pageNo; + int pages = total == 0 ? 0 : (total + pageSize - 1) / pageSize; Page page = new Page<>(current, pageSize, total, true); page.setRecords(records); diff --git a/hugegraph-hubble/hubble-be/src/main/resources/application.properties b/hugegraph-hubble/hubble-be/src/main/resources/application.properties index 842a2f025..9b1be8999 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/application.properties +++ b/hugegraph-hubble/hubble-be/src/main/resources/application.properties @@ -20,6 +20,8 @@ info.app.name=hugegraph-hubble info.app.version=v1.2 spring.profiles.active=dev +# SECURITY: Production or public deployments must terminate HTTPS before Hubble. +# Never expose Hubble's plain HTTP listener directly to an untrusted network. # Keep an active browser session alive; Servlet access refreshes the idle timer. server.servlet.session.timeout=48h diff --git a/hugegraph-hubble/hubble-be/src/main/resources/hugegraph-hubble.properties b/hugegraph-hubble/hubble-be/src/main/resources/hugegraph-hubble.properties index 4f67645a9..ec77a0cf6 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/hugegraph-hubble.properties +++ b/hugegraph-hubble/hubble-be/src/main/resources/hugegraph-hubble.properties @@ -18,6 +18,11 @@ server.host=localhost server.port=8088 +# SECURITY: Keep this HTTP listener private. Production/public access requires an +# HTTPS reverse proxy with secure session-cookie handling and no direct port bypass. + +# SECURITY: The Kubernetes token API is hard-disabled in code. Do not restore it +# without server-side privileged authorization and dedicated security review. graph_connection.ip_white_list=[*] graph_connection.port_white_list=[-1] diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/K8sTokenEndpointSecurityTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/K8sTokenEndpointSecurityTest.java new file mode 100644 index 000000000..ffe4a08fe --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/K8sTokenEndpointSecurityTest.java @@ -0,0 +1,44 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hugegraph.unit; + +import java.lang.reflect.Method; + +import org.apache.hugegraph.controller.op.K8sTokenController; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +public class K8sTokenEndpointSecurityTest { + + @Test + public void testK8sTokenEndpointHasNoWebMappings() { + Assert.assertNull(K8sTokenController.class.getDeclaredAnnotation( + RestController.class)); + Assert.assertNull(K8sTokenController.class.getDeclaredAnnotation( + RequestMapping.class)); + + for (Method method : K8sTokenController.class.getDeclaredMethods()) { + Assert.assertFalse(AnnotatedElementUtils.hasAnnotation( + method, RequestMapping.class)); + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/PriorityFixTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/PriorityFixTest.java new file mode 100644 index 000000000..6816ade60 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/PriorityFixTest.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * Licensed under the Apache License, Version 2.0. + */ +package org.apache.hugegraph.unit; + +import java.util.Arrays; + +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.exception.ExternalException; +import org.apache.hugegraph.handler.CustomInterceptor; +import org.apache.hugegraph.util.PageUtil; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; + +import com.baomidou.mybatisplus.core.metadata.IPage; + +public class PriorityFixTest { + + @Test + public void testAfterCompletionClosesRequestClient() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + HugeClient client = Mockito.mock(HugeClient.class); + request.setAttribute("hugeClient", client); + + new CustomInterceptor().afterCompletion(request, + new MockHttpServletResponse(), + new Object(), null); + + Mockito.verify(client).close(); + Assert.assertNull(request.getAttribute("hugeClient")); + } + + @Test + public void testNewPageCalculatesPageCount() { + IPage page = PageUtil.newPage(Arrays.asList(3, 4), 2, 2, 5); + + Assert.assertEquals(3L, page.getPages()); + Assert.assertEquals(5L, page.getTotal()); + Assert.assertEquals(Arrays.asList(3, 4), page.getRecords()); + } + + @Test + public void testPageKeepsLegacyAllPageSentinel() { + IPage page = PageUtil.page(Arrays.asList(1, 2, 3), 1, -1); + + Assert.assertEquals(Arrays.asList(1, 2, 3), page.getRecords()); + } + + @Test(expected = IllegalArgumentException.class) + public void testNewPageRejectsZeroPageSize() { + PageUtil.newPage(Arrays.asList(), 1, 0, 0); + } + + @Test(expected = IllegalArgumentException.class) + public void testPositivePageRejectsAllPageSentinel() { + PageUtil.checkPositivePage(1, -1); + } + + @Test(expected = ExternalException.class) + public void testInterceptorRejectsOversizedPage() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/api/list"); + request.setParameter("page_size", "501"); + + new CustomInterceptor().preHandle(request, + new MockHttpServletResponse(), + new Object()); + } + + @Test + public void testInterceptorKeepsLegacyAllPageSentinel() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/api/list"); + request.setParameter("page_size", "-1"); + + Assert.assertTrue(new CustomInterceptor().preHandle( + request, new MockHttpServletResponse(), new Object())); + } +} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java index b86a4ee25..01f764fd2 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java @@ -47,9 +47,11 @@ MessageSourceHandlerTest.class, SchemaControllerSecurityTest.class, JobManagerServiceTest.class, + K8sTokenEndpointSecurityTest.class, LoadTaskServiceTest.class, OltpAlgoControllerTest.class, OltpAlgoServiceTest.class, + PriorityFixTest.class, QueryServiceTest.class, UrlUtilTest.class }) diff --git a/hugegraph-hubble/hubble-fe/src/components/RouteErrorBoundary/index.js b/hugegraph-hubble/hubble-fe/src/components/RouteErrorBoundary/index.js new file mode 100644 index 000000000..88c14acc7 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/RouteErrorBoundary/index.js @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * Licensed under the Apache License, Version 2.0. + */ + +import React from 'react'; +import {Button, Result} from 'antd'; + +class RouteErrorBoundary extends React.Component { + constructor(props) { + super(props); + this.state = {failed: false}; + this.reload = this.reload.bind(this); + } + + static getDerivedStateFromError() { + return {failed: true}; + } + + componentDidCatch(error, info) { + console.error('Route render failed', error, info); + } + + reload() { + window.location.reload(); + } + + render() { + if (this.state.failed) { + return ( + Reload} + /> + ); + } + return this.props.children; + } +} + +export default RouteErrorBoundary; diff --git a/hugegraph-hubble/hubble-fe/src/modules/component/FixNode/index.js b/hugegraph-hubble/hubble-fe/src/modules/component/FixNode/index.js index d34ea79de..d41f24fff 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/component/FixNode/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/component/FixNode/index.js @@ -34,21 +34,27 @@ const FixNode = () => { useEffect(() => { - graph?.on('node:click', evt => { + if (!graph) { + return undefined; + } + const handleNodeClick = evt => { const {item} = evt; setFixState(true); setSelectedNode(item); - }); - - graph?.on('edge:click', evt => { + }; + const clearSelection = () => { setSelectedNode(); setFixState(false); - }); + }; - graph?.on('canvas:click', evt => { - setSelectedNode(); - setFixState(false); - }); + graph.on('node:click', handleNodeClick); + graph.on('edge:click', clearSelection); + graph.on('canvas:click', clearSelection); + return () => { + graph.off('node:click', handleNodeClick); + graph.off('edge:click', clearSelection); + graph.off('canvas:click', clearSelection); + }; }, [graph]); diff --git a/hugegraph-hubble/hubble-fe/src/modules/component/RedoUndo/index.js b/hugegraph-hubble/hubble-fe/src/modules/component/RedoUndo/index.js index 536d3d6f9..a5e8057fb 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/component/RedoUndo/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/component/RedoUndo/index.js @@ -37,7 +37,10 @@ const RedoUndo = props => { useEffect( () => { - graph?.on('stackchange', evt => { + if (!graph) { + return undefined; + } + const handleStackChange = evt => { const {undoStack, redoStack} = evt; const undoStackLen = undoStack.length; const redoStackLen = redoStack.length; @@ -53,7 +56,9 @@ const RedoUndo = props => { else { setRedoState(true); } - }); + }; + graph.on('stackchange', handleStackChange); + return () => graph.off('stackchange', handleStackChange); }, [graph] ); diff --git a/hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/GraphStatistics/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/GraphStatistics/Home/index.js index 0bf4d0bfc..5a81df7a1 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/GraphStatistics/Home/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/component/StatisticsPanel/GraphStatistics/Home/index.js @@ -52,10 +52,15 @@ const GraphStatistics = props => { useEffect( () => { - graph.on('node:mouseenter', evt => { + if (!graph) { + return undefined; + } + const handleNodeMouseEnter = evt => { const {id, statistics} = evt.item.getModel(); setSelectedNode({id, statistics}); - }); + }; + graph.on('node:mouseenter', handleNodeMouseEnter); + return () => graph.off('node:mouseenter', handleNodeMouseEnter); }, [graph] ); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Schema/index.js b/hugegraph-hubble/hubble-fe/src/pages/Schema/index.js index 185869aa3..e2370d2bc 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Schema/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Schema/index.js @@ -50,7 +50,7 @@ const Schema = () => { const [pagination, setPagination] = useState({current: 1, pageSize: 10}); const [query, setQuery] = useState(''); const [graphspaceInfo, setGraphspaceInfo] = useState({}); - const [loading] = useState(false); + const [loadingCount, setLoadingCount] = useState(0); const {graphspace} = useParams(); const navigate = useNavigate(); const {current} = pagination; @@ -133,6 +133,7 @@ const Schema = () => { ]; useEffect(() => { + setLoadingCount(value => value + 1); api.manage.getGraphSpace(graphspace, PAGE_ERROR_CONFIG).then(res => { if (res.status === 200) { setGraphspaceInfo(res.data); @@ -140,10 +141,12 @@ const Schema = () => { } message.error(t('common.msg.load_failed')); - }).catch(() => message.error(t('common.msg.load_failed'))); + }).catch(() => message.error(t('common.msg.load_failed'))) + .finally(() => setLoadingCount(value => Math.max(0, value - 1))); }, [graphspace, t]); useEffect(() => { + setLoadingCount(value => value + 1); api.manage.getSchemaList(graphspace, { query, page_no: current, @@ -154,12 +157,13 @@ const Schema = () => { return; } message.error(t('common.msg.load_failed')); - }).catch(() => message.error(t('common.msg.load_failed'))); + }).catch(() => message.error(t('common.msg.load_failed'))) + .finally(() => setLoadingCount(value => Math.max(0, value - 1))); }, [graphspace, refresh, current, query, t]); return ( <> - + 0}> { ); }; -export default RouteList; +const SafeRouteList = props => ( + + + +); + +export default SafeRouteList; From 29f6f5af919d399f6ab88c9052396435965e70e1 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 04:18:41 +0800 Subject: [PATCH 52/68] fix(hubble): throttle failed logins - add configurable exponential backoff after repeated failures - return HTTP 429 with Retry-After and backend warnings - serialize concurrent attempts per principal and client address - show a deduplicated frontend warning and cover regressions --- .../controller/auth/LoginController.java | 68 ++++++-- .../exception/LoginThrottledException.java | 23 +++ .../hugegraph/handler/ExceptionAdvisor.java | 17 ++ .../service/auth/LoginAttemptGuard.java | 153 ++++++++++++++++++ .../src/main/resources/application.properties | 9 ++ .../main/resources/i18n/messages.properties | 1 + .../resources/i18n/messages_zh_CN.properties | 1 + .../hugegraph/unit/AuthSecurityTest.java | 41 ++++- .../hugegraph/unit/LoginAttemptGuardTest.java | 91 +++++++++++ .../apache/hugegraph/unit/UnitTestSuite.java | 1 + .../src/api/request-error-semantics.test.js | 40 +++++ hugegraph-hubble/hubble-fe/src/api/request.js | 9 ++ .../hubble-fe/src/api/request2.js | 9 ++ .../hubble-fe/src/api/throttleWarning.js | 21 +++ 14 files changed, 470 insertions(+), 14 deletions(-) create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/LoginThrottledException.java create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/LoginAttemptGuard.java create mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoginAttemptGuardTest.java create mode 100644 hugegraph-hubble/hubble-fe/src/api/throttleWarning.js diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java index 69e7dacef..967a78f12 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/auth/LoginController.java @@ -31,11 +31,15 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.entity.auth.UserEntity; +import org.apache.hugegraph.exception.ExternalException; +import org.apache.hugegraph.exception.ServerException; import com.google.common.collect.ImmutableMap; import org.apache.hugegraph.driver.factory.PDHugeClientFactory; import org.apache.hugegraph.options.HubbleOptions; import org.apache.hugegraph.service.auth.UserService; +import org.apache.hugegraph.service.auth.LoginAttemptGuard; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -61,26 +65,22 @@ public class LoginController extends BaseController { UserService userService; @Autowired private HugeConfig config; + @Autowired + private LoginAttemptGuard loginAttemptGuard; @PostMapping("/login") public Object login(@RequestBody Login login) { - // TODO: Add account-aware throttling and security audit events before this - // endpoint is exposed to an untrusted network. + String address = this.getRequest().getRemoteAddr(); + boolean pdEnabled = this.config.get(HubbleOptions.PD_ENABLED); + this.loginAttemptGuard.checkAllowed(login.name(), address); // Set Expire: 1 Month login.expire(TOKEN_EXPIRE_SECONDS); try { - boolean pdEnabled = this.config.get(HubbleOptions.PD_ENABLED); - LoginResult result; + LoginResult result = this.authenticate(login, pdEnabled, address); Object user; if (!pdEnabled) { - result = this.loginStandalone(login); user = currentUser(login.name()); } else { - try (HugeClient client = - this.createLoginClient(login.name(), - login.password())) { - result = client.auth().login(login); - } try (HugeClient client = this.createLoginTokenClient(result.token())) { client.assignGraph(PDHugeClientFactory.DEFAULT_GRAPHSPACE, @@ -107,6 +107,44 @@ public Object login(@RequestBody Login login) { } } + private LoginResult authenticate(Login login, boolean pdEnabled, + String address) { + try { + LoginResult result; + if (!pdEnabled) { + result = this.loginStandalone(login); + } else { + try (HugeClient client = + this.createLoginClient(login.name(), + login.password())) { + result = client.auth().login(login); + } + } + this.loginAttemptGuard.reset(login.name(), address); + return result; + } catch (Throwable e) { + if (isAuthenticationFailure(e)) { + this.loginAttemptGuard.recordFailure(login.name(), address); + } else { + this.loginAttemptGuard.release(login.name(), address); + } + throw e; + } + } + + private static boolean isAuthenticationFailure(Throwable error) { + if (error instanceof ServerException) { + int status = ((ServerException) error).status(); + return status == HttpStatus.UNAUTHORIZED.value() || + status == HttpStatus.FORBIDDEN.value(); + } + return error instanceof ExternalException && + (((ExternalException) error).status() == + HttpStatus.UNAUTHORIZED.value() || + ((ExternalException) error).status() == + HttpStatus.FORBIDDEN.value()); + } + protected LoginResult loginStandalone(Login login) { String endpoint = this.config.get(HubbleOptions.SERVER_URL) + "/auth/login"; @@ -131,9 +169,15 @@ protected LoginResult loginStandalone(Login login) { try (OutputStream output = connection.getOutputStream()) { output.write(MAPPER.writeValueAsBytes(body)); } - if (connection.getResponseCode() >= 400) { + int status = connection.getResponseCode(); + if (status == HttpStatus.UNAUTHORIZED.value() || + status == HttpStatus.FORBIDDEN.value()) { + throw new ExternalException(status, + "graph-connection.username-or-password.incorrect"); + } + if (status >= 400) { throw new IOException("Standalone login failed: HTTP " + - connection.getResponseCode()); + status); } Map response; try (InputStream input = connection.getInputStream()) { diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/LoginThrottledException.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/LoginThrottledException.java new file mode 100644 index 000000000..3adba9ebc --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/LoginThrottledException.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * Licensed under the Apache License, Version 2.0. + */ + +package org.apache.hugegraph.exception; + +import lombok.Getter; + +@Getter +public class LoginThrottledException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + private final long retrySeconds; + + public LoginThrottledException(long retrySeconds) { + super("auth.login.throttled"); + this.retrySeconds = retrySeconds; + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java index ee8c55ba7..ab75117d0 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/handler/ExceptionAdvisor.java @@ -23,11 +23,13 @@ import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.exception.IllegalGremlinException; import org.apache.hugegraph.exception.InternalException; +import org.apache.hugegraph.exception.LoginThrottledException; import org.apache.hugegraph.exception.ParameterizedException; import org.apache.hugegraph.exception.ServerCapabilityUnavailableException; import org.apache.hugegraph.exception.UnauthorizedException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; @@ -54,6 +56,21 @@ public class ExceptionAdvisor { @Autowired private MessageSourceHandler messageSourceHandler; + @ExceptionHandler(LoginThrottledException.class) + public ResponseEntity exceptionHandler(LoginThrottledException e) { + String message = this.handleMessage(e.getMessage(), + new Object[]{e.getRetrySeconds()}); + Response response = Response.builder() + .status(HttpStatus.TOO_MANY_REQUESTS.value()) + .message(message) + .cause(null) + .build(); + return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS) + .header("Retry-After", + String.valueOf(e.getRetrySeconds())) + .body(response); + } + // FIXME: Map business failures to HTTP status codes only after auditing frontend // compatibility; clients currently depend on the status field in the JSON body. diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/LoginAttemptGuard.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/LoginAttemptGuard.java new file mode 100644 index 000000000..33469baa0 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/LoginAttemptGuard.java @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * Licensed under the Apache License, Version 2.0. + */ + +package org.apache.hugegraph.service.auth; + +import java.util.concurrent.TimeUnit; +import java.util.function.LongSupplier; + +import org.apache.hugegraph.exception.LoginThrottledException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; + +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@Component +public class LoginAttemptGuard { + + private final Cache attempts; + private final LongSupplier clock; + private final int failureThreshold; + private final long initialBackoffMillis; + private final long maxBackoffMillis; + + @Autowired + public LoginAttemptGuard( + @Value("${auth.login.failure-threshold}") int failureThreshold, + @Value("${auth.login.initial-backoff-seconds}") long initialSeconds, + @Value("${auth.login.max-backoff-seconds}") long maxSeconds, + @Value("${auth.login.max-tracked-principals}") long maximumSize) { + this(failureThreshold, TimeUnit.SECONDS.toMillis(initialSeconds), + TimeUnit.SECONDS.toMillis(maxSeconds), maximumSize, + System::currentTimeMillis); + } + + public LoginAttemptGuard(int failureThreshold, long initialBackoffMillis, + long maxBackoffMillis, long maximumSize, + LongSupplier clock) { + if (failureThreshold < 1 || initialBackoffMillis < 1L || + maxBackoffMillis < initialBackoffMillis || maximumSize < 1L) { + throw new IllegalArgumentException("Invalid login backoff settings"); + } + this.clock = clock; + this.failureThreshold = failureThreshold; + this.initialBackoffMillis = initialBackoffMillis; + this.maxBackoffMillis = maxBackoffMillis; + // FIXME: For multi-instance or hostile high-cardinality traffic, move this + // state to a shared rate limiter that preserves active bans under key spray. + this.attempts = Caffeine.newBuilder() + .maximumSize(maximumSize) + .expireAfterAccess(maxBackoffMillis * 2L, + TimeUnit.MILLISECONDS) + .build(); + } + + public void checkAllowed(String username, String address) { + String key = key(username, address); + long now = this.clock.getAsLong(); + long[] retrySeconds = {0L}; + this.attempts.asMap().compute(key, (ignored, current) -> { + Attempt attempt = current == null ? Attempt.EMPTY : current; + if (attempt.blockedUntil > now) { + retrySeconds[0] = retrySeconds(attempt.blockedUntil - now); + return attempt; + } + if (attempt.inFlight) { + retrySeconds[0] = 1L; + return attempt; + } + return new Attempt(attempt.failures, attempt.blockedUntil, true); + }); + if (retrySeconds[0] > 0L) { + throw new LoginThrottledException(retrySeconds[0]); + } + } + + public void recordFailure(String username, String address) { + String key = key(username, address); + Attempt attempt = this.attempts.asMap().compute(key, (ignored, current) -> { + int failures = current == null ? 1 : increment(current.failures); + long blockedUntil = 0L; + if (failures >= this.failureThreshold) { + int exponent = failures - this.failureThreshold; + long delay = backoff(exponent, this.initialBackoffMillis, + this.maxBackoffMillis); + blockedUntil = this.clock.getAsLong() + delay; + } + return new Attempt(failures, blockedUntil, false); + }); + if (attempt.failures >= this.failureThreshold) { + log.warn("Login throttled for principal {}, failures={}, retry={}s", + Integer.toHexString(key.hashCode()), attempt.failures, + Math.max(1L, (attempt.blockedUntil - this.clock.getAsLong() + + 999L) / 1000L)); + } + } + + public void reset(String username, String address) { + this.attempts.invalidate(key(username, address)); + } + + public void release(String username, String address) { + this.attempts.asMap().computeIfPresent(key(username, address), + (ignored, current) -> + new Attempt(current.failures, + current.blockedUntil, + false)); + } + + private static String key(String username, String address) { + return String.valueOf(username) + '|' + + String.valueOf(address); + } + + private static int increment(int value) { + return value == Integer.MAX_VALUE ? value : value + 1; + } + + private static long retrySeconds(long remainingMillis) { + return Math.max(1L, (remainingMillis + 999L) / 1000L); + } + + private static long backoff(int exponent, long initial, long maximum) { + long delay = initial; + for (int i = 0; i < exponent && delay < maximum; i++) { + delay = delay > maximum / 2L ? maximum : delay * 2L; + } + return Math.min(delay, maximum); + } + + private static final class Attempt { + + private static final Attempt EMPTY = new Attempt(0, 0L, false); + + private final int failures; + private final long blockedUntil; + private final boolean inFlight; + + private Attempt(int failures, long blockedUntil, boolean inFlight) { + this.failures = failures; + this.blockedUntil = blockedUntil; + this.inFlight = inFlight; + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/main/resources/application.properties b/hugegraph-hubble/hubble-be/src/main/resources/application.properties index 9b1be8999..bdbdb2a4d 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/application.properties +++ b/hugegraph-hubble/hubble-be/src/main/resources/application.properties @@ -22,9 +22,18 @@ spring.profiles.active=dev # SECURITY: Production or public deployments must terminate HTTPS before Hubble. # Never expose Hubble's plain HTTP listener directly to an untrusted network. +# Trust forwarding headers only from Tomcat's internal-proxy ranges. Configure +# server.tomcat.internal-proxies explicitly when the HTTPS proxy uses other ranges. +server.use-forward-headers=true # Keep an active browser session alive; Servlet access refreshes the idle timer. server.servlet.session.timeout=48h +# Login brute-force protection: first three failures pass normally, then back off. +auth.login.failure-threshold=4 +auth.login.initial-backoff-seconds=5 +auth.login.max-backoff-seconds=600 +auth.login.max-tracked-principals=10000 + # web static file path, local h2 database or remote mysql for you to choose # local h2 database spring.resources.static-locations=classpath:/ui/ diff --git a/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages.properties b/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages.properties index 0cb5e83f3..9f39cf5e0 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages.properties +++ b/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages.properties @@ -224,3 +224,4 @@ service.url.parse.error=Parse host info ({0}) error?please check the url in \ service config service.manual.disable.modify=Disallown modify manual service +auth.login.throttled=Too many login failures. Please retry in {0} seconds diff --git a/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages_zh_CN.properties b/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages_zh_CN.properties index 0c64e34d5..ef9fc53a7 100644 --- a/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages_zh_CN.properties +++ b/hugegraph-hubble/hubble-be/src/main/resources/i18n/messages_zh_CN.properties @@ -221,3 +221,4 @@ service.no-available=当前无可用服务 service.default.no-available=DEFAULT命名空间下的DEFAULT服务无法使用 service.url.parse.error="无法解析的主机名或 IP ({0}) ,请修改相关服务的URL配置" service.manual.disable.modify=禁止修改手动启动的图服务 +auth.login.throttled=登录失败次数过多,请在 {0} 秒后重试 diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/AuthSecurityTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/AuthSecurityTest.java index f434ece11..11f2b4c47 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/AuthSecurityTest.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/AuthSecurityTest.java @@ -39,6 +39,7 @@ import org.junit.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.util.ReflectionTestUtils; @@ -58,6 +59,7 @@ import org.apache.hugegraph.entity.auth.UserEntity; import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.exception.InternalException; +import org.apache.hugegraph.exception.LoginThrottledException; import org.apache.hugegraph.exception.ParameterizedException; import org.apache.hugegraph.exception.ServerCapabilityUnavailableException; import org.apache.hugegraph.exception.UnauthorizedException; @@ -66,6 +68,7 @@ import org.apache.hugegraph.handler.LoginInterceptor; import org.apache.hugegraph.handler.MessageSourceHandler; import org.apache.hugegraph.options.HubbleOptions; +import org.apache.hugegraph.service.auth.LoginAttemptGuard; import org.apache.hugegraph.service.auth.UserService; import org.apache.hugegraph.structure.auth.Login; import org.apache.hugegraph.structure.auth.LoginResult; @@ -305,6 +308,27 @@ public void testUnauthorizedExceptionUsesHttp401() throws Exception { Assert.assertEquals(HttpStatus.UNAUTHORIZED, status.value()); } + @Test + public void testLoginThrottleUsesHttp429AndRetryAfter() { + ExceptionAdvisor advisor = new ExceptionAdvisor(); + MessageSourceHandler messageSource = + Mockito.mock(MessageSourceHandler.class); + Mockito.when(messageSource.getMessage(Mockito.anyString(), + Mockito.any())) + .thenReturn("retry later"); + ReflectionTestUtils.setField(advisor, "messageSourceHandler", + messageSource); + + ResponseEntity response = advisor.exceptionHandler( + new LoginThrottledException(5L)); + + Assert.assertEquals(HttpStatus.TOO_MANY_REQUESTS, + response.getStatusCode()); + Assert.assertEquals("5", response.getHeaders().getFirst("Retry-After")); + Assert.assertEquals(HttpStatus.TOO_MANY_REQUESTS.value(), + response.getBody().getStatus()); + } + @Test public void testMissingRequestParameterUsesActionableHttp400() throws Exception { @@ -592,6 +616,8 @@ public void testLoginFailureClearsExistingAuthentication() throws Exception { Assert.assertNull(request.getSession().getAttribute( Constant.USERNAME_KEY)); Assert.assertNull(request.getSession().getAttribute(Constant.TOKEN_KEY)); + Mockito.verify(controller.attemptGuard) + .recordFailure("admin", "127.0.0.1"); } @Test @@ -616,7 +642,8 @@ public void testPdLoginClosesClientsWhenUserValidationFails() controller.userClient = userClient; UserService users = Mockito.mock(UserService.class); Mockito.when(users.getUser(userClient, "admin")) - .thenThrow(new RuntimeException("expected validation failure")); + .thenThrow(new ExternalException(HttpStatus.UNAUTHORIZED.value(), + "expected validation failure")); ReflectionTestUtils.setField(controller, "userService", users); Login login = new Login(); login.name("admin"); @@ -631,6 +658,8 @@ public void testPdLoginClosesClientsWhenUserValidationFails() Mockito.verify(loginClient).close(); Mockito.verify(userClient).close(); + Mockito.verify(controller.attemptGuard, Mockito.never()) + .recordFailure(Mockito.anyString(), Mockito.anyString()); Assert.assertNull(request.getSession().getAttribute(Constant.TOKEN_KEY)); } @@ -688,6 +717,13 @@ private static class TestLoginController extends LoginController { private HugeClient loginClient; private HugeClient userClient; private String validationToken; + private LoginAttemptGuard attemptGuard; + + private TestLoginController() { + this.attemptGuard = Mockito.mock(LoginAttemptGuard.class); + ReflectionTestUtils.setField(this, "loginAttemptGuard", + this.attemptGuard); + } public LoginResult standalone(Login login) { return this.loginStandalone(login); @@ -696,7 +732,8 @@ public LoginResult standalone(Login login) { @Override protected LoginResult loginStandalone(Login login) { if (this.failStandalone) { - throw new RuntimeException("expected login failure"); + throw new ExternalException(HttpStatus.UNAUTHORIZED.value(), + "expected login failure"); } if (this.connection != null || this.useNetwork) { return super.loginStandalone(login); diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoginAttemptGuardTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoginAttemptGuardTest.java new file mode 100644 index 000000000..0cd66c837 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoginAttemptGuardTest.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * Licensed under the Apache License, Version 2.0. + */ + +package org.apache.hugegraph.unit; + +import java.util.concurrent.atomic.AtomicLong; + +import org.apache.hugegraph.exception.LoginThrottledException; +import org.apache.hugegraph.service.auth.LoginAttemptGuard; +import org.junit.Assert; +import org.junit.Test; + +public class LoginAttemptGuardTest { + + @Test + public void testExponentialBackoffAndReset() { + AtomicLong now = new AtomicLong(1000L); + LoginAttemptGuard guard = new LoginAttemptGuard(4, 5000L, 600_000L, + 10_000L, now::get); + String username = "admin"; + String address = "127.0.0.1"; + + for (int i = 0; i < 3; i++) { + guard.recordFailure(username, address); + guard.checkAllowed(username, address); + } + + guard.recordFailure(username, address); + assertBlocked(guard, username, address); + + now.addAndGet(5000L); + guard.checkAllowed(username, address); + guard.recordFailure(username, address); + assertBlocked(guard, username, address); + + now.addAndGet(9999L); + assertBlocked(guard, username, address); + now.incrementAndGet(); + guard.checkAllowed(username, address); + + guard.reset(username, address); + guard.checkAllowed(username, address); + } + + @Test + public void testBackoffStopsAtConfiguredMaximum() { + AtomicLong now = new AtomicLong(); + LoginAttemptGuard guard = new LoginAttemptGuard(1, 5L, 20L, 100L, + now::get); + + guard.recordFailure("admin", "127.0.0.1"); + now.addAndGet(5L); + guard.recordFailure("admin", "127.0.0.1"); + now.addAndGet(10L); + guard.recordFailure("admin", "127.0.0.1"); + now.addAndGet(20L); + guard.recordFailure("admin", "127.0.0.1"); + + now.addAndGet(19L); + assertBlocked(guard, "admin", "127.0.0.1"); + now.incrementAndGet(); + guard.checkAllowed("admin", "127.0.0.1"); + } + + @Test + public void testConcurrentAttemptIsRejectedWithoutWaiting() { + LoginAttemptGuard guard = new LoginAttemptGuard(4, 5000L, 600_000L, + 10_000L, + System::currentTimeMillis); + + guard.checkAllowed("admin", "127.0.0.1"); + assertBlocked(guard, "admin", "127.0.0.1"); + + guard.release("admin", "127.0.0.1"); + guard.checkAllowed("admin", "127.0.0.1"); + } + + private static void assertBlocked(LoginAttemptGuard guard, String username, + String address) { + try { + guard.checkAllowed(username, address); + Assert.fail("Expected login attempt to be throttled"); + } catch (LoginThrottledException e) { + Assert.assertTrue(e.getRetrySeconds() > 0L); + } + } +} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java index 01f764fd2..8207defdf 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java @@ -49,6 +49,7 @@ JobManagerServiceTest.class, K8sTokenEndpointSecurityTest.class, LoadTaskServiceTest.class, + LoginAttemptGuardTest.class, OltpAlgoControllerTest.class, OltpAlgoServiceTest.class, PriorityFixTest.class, diff --git a/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js b/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js index 6d4da2261..fe8f0147e 100644 --- a/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js +++ b/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js @@ -21,6 +21,7 @@ const loadResponseHandlers = modulePath => { const responseHandlers = []; const messageError = jest.fn(); + const modalWarning = jest.fn(); const clearLogin = jest.fn(); const instance = { interceptors: { @@ -46,6 +47,9 @@ const loadResponseHandlers = modulePath => { message: { error: messageError, }, + Modal: { + warning: modalWarning, + }, })); jest.doMock('../i18n', () => ({ t: key => key, @@ -59,6 +63,7 @@ const loadResponseHandlers = modulePath => { resolve: responseHandlers[0].resolve, reject: responseHandlers[0].reject, messageError, + modalWarning, clearLogin, instance, request, @@ -141,6 +146,41 @@ describe.each(['./request', './request2'])('%s error semantics', modulePath => { expect(window.location.href).toBe('/login?redirect=%2Fnavigation%3Ffrom%3Dtest'); }); + it('shows a modal warning for throttled login attempts', () => { + const {resolve, modalWarning, messageError} = loadResponseHandlers(modulePath); + const response = { + status: 200, + data: { + status: 429, + message: 'Retry in 2 seconds', + }, + }; + + expect(resolve(response)).toBe(response); + expect(modalWarning).toHaveBeenCalledWith(expect.objectContaining({ + content: 'Retry in 2 seconds', + })); + expect(messageError).not.toHaveBeenCalled(); + }); + + it('shows only one warning while repeated HTTP throttles are active', async () => { + const {reject, modalWarning, messageError} = loadResponseHandlers(modulePath); + const error = { + response: { + status: 429, + data: { + status: 429, + message: 'Retry in 5 seconds', + }, + }, + }; + + await expect(reject(error)).rejects.toBe(error); + await expect(reject(error)).rejects.toBe(error); + expect(modalWarning).toHaveBeenCalledTimes(1); + expect(messageError).not.toHaveBeenCalled(); + }); + it('lets an inline error owner suppress the duplicate business-error toast', () => { const {resolve, messageError} = loadResponseHandlers(modulePath); const response = { diff --git a/hugegraph-hubble/hubble-fe/src/api/request.js b/hugegraph-hubble/hubble-fe/src/api/request.js index b328facb4..0b2aacaab 100644 --- a/hugegraph-hubble/hubble-fe/src/api/request.js +++ b/hugegraph-hubble/hubble-fe/src/api/request.js @@ -23,6 +23,7 @@ import _ from 'lodash'; import i18n from '../i18n'; import * as user from '../utils/user'; import {withLanguageHeader} from './languageHeader'; +import {showThrottleWarning} from './throttleWarning'; const isJsonResponse = headers => { const contentType = headers?.['content-type'] || headers?.['Content-Type'] || ''; @@ -91,6 +92,9 @@ instance.interceptors.response.use( redirectToLogin(); return Promise.reject(response); } + else if (response.data?.status === 429) { + showThrottleWarning(response.data.message); + } else if (response.data?.status !== 200 && !response.config?.suppressBusinessErrorToast) { if (!_.isEmpty(response.data.message)) { @@ -104,6 +108,11 @@ instance.interceptors.response.use( redirectToLogin(); return Promise.reject(error); } + if (error.response?.status === 429 + || error.response?.data?.status === 429) { + showThrottleWarning(error.response?.data?.message); + return Promise.reject(error); + } if (!error.config?.suppressBusinessErrorToast) { const res = error.response?.data; showRequestError(res); diff --git a/hugegraph-hubble/hubble-fe/src/api/request2.js b/hugegraph-hubble/hubble-fe/src/api/request2.js index 2b30684f7..37a4ccc02 100644 --- a/hugegraph-hubble/hubble-fe/src/api/request2.js +++ b/hugegraph-hubble/hubble-fe/src/api/request2.js @@ -24,6 +24,7 @@ import qs from 'qs'; import i18n from '../i18n'; import * as user from '../utils/user'; import {withLanguageHeader} from './languageHeader'; +import {showThrottleWarning} from './throttleWarning'; const isJsonResponse = headers => { const contentType = headers?.['content-type'] || headers?.['Content-Type'] || ''; @@ -89,6 +90,9 @@ instance.interceptors.response.use( redirectToLogin(); return Promise.reject(response); } + else if (response.data?.status === 429) { + showThrottleWarning(response.data.message); + } else if (response.data?.status !== 200 && !response.config?.suppressBusinessErrorToast) { if (!_.isEmpty(response.data.message)) { @@ -102,6 +106,11 @@ instance.interceptors.response.use( redirectToLogin(); return Promise.reject(error); } + if (error.response?.status === 429 + || error.response?.data?.status === 429) { + showThrottleWarning(error.response?.data?.message); + return Promise.reject(error); + } if (!error.config?.suppressBusinessErrorToast) { const res = error.response?.data; showRequestError(res); diff --git a/hugegraph-hubble/hubble-fe/src/api/throttleWarning.js b/hugegraph-hubble/hubble-fe/src/api/throttleWarning.js new file mode 100644 index 000000000..ed07d3731 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/api/throttleWarning.js @@ -0,0 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * Licensed under the Apache License, Version 2.0. + */ + +import {Modal} from 'antd'; + +let warningOpen = false; + +export const showThrottleWarning = content => { + if (warningOpen) { + return; + } + warningOpen = true; + const close = () => { + warningOpen = false; + }; + Modal.warning({content, onOk: close, afterClose: close}); +}; From 9218d976225f1af5fc80aff3b0c9463470da85d9 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 04:33:38 +0800 Subject: [PATCH 53/68] fix(hubble): scope loader resources - bind loader entities to graphspace, graph, and job scopes - protect upload, batch, mutation, and deletion paths - add scoped access regression coverage --- .../load/FileMappingController.java | 70 ++++++++++++----- .../controller/load/FileUploadController.java | 22 ++++-- .../controller/load/JobManagerController.java | 19 +++-- .../controller/load/LoadTaskController.java | 68 +++++++++++----- .../service/load/FileMappingService.java | 18 +++++ .../service/load/JobManagerService.java | 23 +++++- .../service/load/LoadTaskService.java | 18 ++++- .../unit/FileUploadControllerTest.java | 9 ++- .../hugegraph/unit/JobManagerServiceTest.java | 13 ++++ .../hugegraph/unit/LoadTaskServiceTest.java | 24 ++++++ .../unit/LoaderScopeControllerTest.java | 78 +++++++++++++++++++ .../apache/hugegraph/unit/UnitTestSuite.java | 1 + 12 files changed, 303 insertions(+), 60 deletions(-) create mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoaderScopeControllerTest.java diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileMappingController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileMappingController.java index 11ba78ab1..a9642e0ac 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileMappingController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileMappingController.java @@ -88,8 +88,11 @@ public IPage list(@PathVariable("graphspace") String graphSpace, } @GetMapping("{id}") - public FileMapping get(@PathVariable("id") int id) { - FileMapping mapping = this.service.get(id); + public FileMapping get(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, + @PathVariable("id") int id) { + FileMapping mapping = this.service.get(graphSpace, graph, jobId, id); if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } @@ -97,8 +100,11 @@ public FileMapping get(@PathVariable("id") int id) { } @DeleteMapping("{id}") - public void delete(@PathVariable("id") int id) { - FileMapping mapping = this.service.get(id); + public void delete(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, + @PathVariable("id") int id) { + FileMapping mapping = this.service.get(graphSpace, graph, jobId, id); if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } @@ -108,15 +114,21 @@ public void delete(@PathVariable("id") int id) { } @DeleteMapping - public void clear() { - List mappings = this.service.listAll(); + public void clear(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId) { + List mappings = this.service.listByJob(graphSpace, graph, + jobId); for (FileMapping mapping : mappings) { this.service.remove(mapping.getId()); } } @PostMapping("{id}/file-setting") - public FileMapping fileSetting(@PathVariable("id") int id, + public FileMapping fileSetting(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, + @PathVariable("id") int id, @RequestBody FileSetting newEntity) { Ex.check(!StringUtils.isEmpty(newEntity.getDelimiter()), "load.file-mapping.file-setting.delimiter-cannot-be-empty"); @@ -129,7 +141,7 @@ public FileMapping fileSetting(@PathVariable("id") int id, Ex.check(!StringUtils.isEmpty(newEntity.getSkippedLine()), "load.file-mapping.file-setting.skippedline-cannot-be-empty"); - FileMapping mapping = this.service.get(id); + FileMapping mapping = this.service.get(graphSpace, graph, jobId, id); if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } @@ -147,9 +159,10 @@ public FileMapping fileSetting(@PathVariable("id") int id, @PostMapping("{id}/vertex-mappings") public FileMapping addVertexMapping(@PathVariable("graphspace") String graphSpace, @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, @PathVariable("id") int id, @RequestBody VertexMapping newEntity) { - FileMapping mapping = this.service.get(id); + FileMapping mapping = this.service.get(graphSpace, graph, jobId, id); if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } @@ -165,10 +178,11 @@ public FileMapping addVertexMapping(@PathVariable("graphspace") String graphSpac @PutMapping("{id}/vertex-mappings/{vmid}") public FileMapping updateVertexMapping(@PathVariable("graphspace") String graphSpace, @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, @PathVariable("id") int id, @PathVariable("vmid") String vmId, @RequestBody VertexMapping newEntity) { - FileMapping mapping = this.service.get(id); + FileMapping mapping = this.service.get(graphSpace, graph, jobId, id); if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } @@ -188,9 +202,13 @@ public FileMapping updateVertexMapping(@PathVariable("graphspace") String graphS } @DeleteMapping("{id}/vertex-mappings/{vmid}") - public FileMapping deleteVertexMapping(@PathVariable("id") int id, + public FileMapping deleteVertexMapping( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, + @PathVariable("id") int id, @PathVariable("vmid") String vmid) { - FileMapping mapping = this.service.get(id); + FileMapping mapping = this.service.get(graphSpace, graph, jobId, id); if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } @@ -208,9 +226,10 @@ public FileMapping deleteVertexMapping(@PathVariable("id") int id, @PostMapping("{id}/edge-mappings") public FileMapping addEdgeMapping(@PathVariable("graphspace") String graphSpace, @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, @PathVariable("id") int id, @RequestBody EdgeMapping newEntity) { - FileMapping mapping = this.service.get(id); + FileMapping mapping = this.service.get(graphSpace, graph, jobId, id); if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } @@ -226,10 +245,11 @@ public FileMapping addEdgeMapping(@PathVariable("graphspace") String graphSpace, @PutMapping("{id}/edge-mappings/{emid}") public FileMapping updateEdgeMapping(@PathVariable("graphspace") String graphSpace, @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, @PathVariable("id") int id, @PathVariable("emid") String emId, @RequestBody EdgeMapping newEntity) { - FileMapping mapping = this.service.get(id); + FileMapping mapping = this.service.get(graphSpace, graph, jobId, id); if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } @@ -249,9 +269,13 @@ public FileMapping updateEdgeMapping(@PathVariable("graphspace") String graphSpa } @DeleteMapping("{id}/edge-mappings/{emid}") - public FileMapping deleteEdgeMapping(@PathVariable("id") int id, + public FileMapping deleteEdgeMapping( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, + @PathVariable("id") int id, @PathVariable("emid") String emid) { - FileMapping mapping = this.service.get(id); + FileMapping mapping = this.service.get(graphSpace, graph, jobId, id); if (mapping == null) { throw new ExternalException("load.file-mapping.not-exist.id", id); } @@ -271,9 +295,13 @@ public FileMapping deleteEdgeMapping(@PathVariable("id") int id, * in actually */ @PostMapping("load-parameter") - public void loadParameter(@RequestBody LoadParameter newEntity) { + public void loadParameter(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, + @RequestBody LoadParameter newEntity) { this.checkLoadParameter(newEntity); - List mappings = this.service.listAll(); + List mappings = this.service.listByJob(graphSpace, graph, + jobId); for (FileMapping mapping : mappings) { LoadParameter oldEntity = mapping.getLoadParameter(); LoadParameter entity = this.mergeEntity(oldEntity, newEntity); @@ -283,8 +311,10 @@ public void loadParameter(@RequestBody LoadParameter newEntity) { } @PutMapping("next-step") - public JobManager nextStep(@PathVariable("jobId") int jobId) { - JobManager jobEntity = this.jobService.get(jobId); + public JobManager nextStep(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId) { + JobManager jobEntity = this.jobService.get(graphSpace, graph, jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Ex.check(jobEntity.getJobStatus() == JobStatus.MAPPING, "job.manager.status.unexpected", diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileUploadController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileUploadController.java index 1fef0967d..89caa8694 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileUploadController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/FileUploadController.java @@ -79,9 +79,14 @@ public class FileUploadController extends BaseController { private JobManagerService jobService; @GetMapping("token") - public Map fileToken(@PathVariable("jobId") int jobId, + public Map fileToken( + @PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, @RequestParam("names") List fileNames) { + Ex.check(this.jobService.get(graphSpace, graph, jobId) != null, + "job-manager.not-exist.id", jobId); Ex.check(CollectionUtil.allUnique(fileNames), "load.upload.file.duplicate-name"); Map tokens = new HashMap<>(); @@ -111,7 +116,7 @@ public FileUploadResult upload(@PathVariable("graphspace") String graphSpace, this.checkTotalAndIndexValid(total, index); this.checkFileNameValid(fileName); this.checkFileNameMatchToken(fileName, token); - JobManager jobEntity = this.jobService.get(jobId); + JobManager jobEntity = this.jobService.get(graphSpace, graph, jobId); Long sourceFileSize = this.resolveSourceFileSize(file, fileSize, total, index); this.checkFileValid(graphSpace, graph, jobId, jobEntity, file, fileName); @@ -167,7 +172,8 @@ public FileUploadResult upload(@PathVariable("graphspace") String graphSpace, this.service.update(mapping); return result; } - JobManager currentJob = this.jobService.get(jobId); + JobManager currentJob = this.jobService.get(graphSpace, graph, + jobId); long actualFileSize; try { actualFileSize = this.resolveUploadedFileSize( @@ -216,7 +222,7 @@ public Boolean delete(@PathVariable("graphspace") String graphSpace, @RequestParam("name") String fileName, @RequestParam("token") String token) { this.checkFileNameValid(fileName); - JobManager jobEntity = this.jobService.get(jobId); + JobManager jobEntity = this.jobService.get(graphSpace, graph, jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Ex.check(jobEntity.getJobStatus() == JobStatus.UPLOADING || jobEntity.getJobStatus() == JobStatus.MAPPING || @@ -249,8 +255,10 @@ public Boolean delete(@PathVariable("graphspace") String graphSpace, } @PutMapping("next-step") - public JobManager nextStep(@PathVariable("jobId") int jobId) { - JobManager jobEntity = this.jobService.get(jobId); + public JobManager nextStep(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId) { + JobManager jobEntity = this.jobService.get(graphSpace, graph, jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Ex.check(jobEntity.getJobStatus() == JobStatus.UPLOADING, "job.manager.status.unexpected", @@ -325,7 +333,7 @@ private FileMapping reserveUploadQuota(String graphSpace, String graph, int jobId, String fileName, String filePath, Long sourceFileSize) { - JobManager currentJob = this.jobService.get(jobId); + JobManager currentJob = this.jobService.get(graphSpace, graph, jobId); Ex.check(currentJob != null, "job-manager.not-exist.id", jobId); FileMapping mapping = this.service.get(graphSpace, graph, jobId, diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/JobManagerController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/JobManagerController.java index 093a7fd2b..1db3ca327 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/JobManagerController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/JobManagerController.java @@ -104,13 +104,17 @@ public JobManager create(@PathVariable("graphspace") String graphSpace, } @DeleteMapping("{id}") - public void delete(@PathVariable("id") int id) { - this.service.deleteJob(id); + public void delete(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("id") int id) { + this.service.deleteJob(graphSpace, graph, id); } @GetMapping("{id}") - public JobManager get(@PathVariable("id") int id) { - JobManager job = this.service.get(id); + public JobManager get(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("id") int id) { + JobManager job = this.service.get(graphSpace, graph, id); if (job == null) { throw new ExternalException("job.manager.not-exist.id", id); } @@ -158,7 +162,7 @@ public JobManager update(@PathVariable("graphspace") String graphSpace, newEntity.getJobRemarks()).matches(), "job.manager.job-remarks.unmatch-regex"); // Check exist Job Manager with this id - JobManager entity = this.service.get(id); + JobManager entity = this.service.get(graphSpace, graph, id); if (entity == null) { throw new ExternalException("job-manager.not-exist.id", id); } @@ -176,7 +180,7 @@ public JobManager update(@PathVariable("graphspace") String graphSpace, public Response reason(@PathVariable("graphspace") String graphSpace, @PathVariable("graph") String graph, @PathVariable("id") int id) { - JobManager job = this.service.get(id); + JobManager job = this.service.get(graphSpace, graph, id); if (job == null) { throw new ExternalException("job.manager.not-exist.id", id); } @@ -187,7 +191,8 @@ public Response reason(@PathVariable("graphspace") String graphSpace, int fileId = task.getFileId(); String reason = ""; if (task.getStatus() == LoadStatus.FAILED) { - FileMapping mapping = this.fmService.get(fileId); + FileMapping mapping = this.fmService.get(graphSpace, graph, id, + fileId); reason = this.taskService.readLoadFailedReason(mapping); } reasonResult.setTaskId(task.getJobId()); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/LoadTaskController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/LoadTaskController.java index 7531d02a2..edc0cd819 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/LoadTaskController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/load/LoadTaskController.java @@ -91,13 +91,17 @@ public IPage list(@PathVariable("graphspace") String graphSpace, @GetMapping("ids") public List list(@PathVariable("graphspace") String graphSpace, @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, @RequestParam("task_ids") List taskIds) { - return this.service.list(graphSpace, graph, taskIds); + return this.service.list(graphSpace, graph, jobId, taskIds); } @GetMapping("{id}") - public LoadTask get(@PathVariable("id") int id) { - LoadTask task = this.service.get(id); + public LoadTask get(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, + @PathVariable("id") int id) { + LoadTask task = this.service.get(graphSpace, graph, jobId, id); if (task == null) { throw new ExternalException("load.task.not-exist.id", id); } @@ -109,7 +113,7 @@ public LoadTask create(@PathVariable("graphspace") String graphSpace, @PathVariable("graph") String graph, @PathVariable("jobId") int jobId, @RequestBody LoadTask entity) { - JobManager jobEntity = this.jobService.get(jobId); + JobManager jobEntity = this.jobService.get(graphSpace, graph, jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Ex.check(jobEntity.getJobStatus() == JobStatus.SETTING, "load.task.create.no-permission"); @@ -118,14 +122,18 @@ public LoadTask create(@PathVariable("graphspace") String graphSpace, "load.task.reached-limit", LIMIT); entity.setGraphSpace(graphSpace); entity.setGraph(graph); + entity.setJobId(jobId); this.service.save(entity); } return entity; } @DeleteMapping("{id}") - public void delete(@PathVariable("id") int id) { - LoadTask task = this.service.get(id); + public void delete(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, + @PathVariable("id") int id) { + LoadTask task = this.service.get(graphSpace, graph, jobId, id); if (task == null) { throw new ExternalException("load.task.not-exist.id", id); } @@ -155,7 +163,7 @@ public List start(@PathVariable("graphspace") String graphSpace, connection.setPort(host.getPort()); } - JobManager jobEntity = this.jobService.get(jobId); + JobManager jobEntity = this.jobService.get(graphSpace, graph, jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Ex.check(jobEntity.getJobStatus() == JobStatus.SETTING, "load.task.start.no-permission"); @@ -164,7 +172,8 @@ public List start(@PathVariable("graphspace") String graphSpace, List tasks = new ArrayList<>(); HugeClient client = this.authClient(graphSpace, graph); for (Integer fileId : fileIds) { - FileMapping fileMapping = this.fmService.get(fileId); + FileMapping fileMapping = this.fmService.get(graphSpace, graph, + jobId, fileId); if (fileMapping == null) { throw new ExternalException("file-mapping.not-exist.id", fileId); @@ -187,10 +196,14 @@ public List start(@PathVariable("graphspace") String graphSpace, } @PostMapping("pause") - public LoadTask pause(@PathVariable("jobId") int jobId, + public LoadTask pause(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, @RequestParam("task_id") int taskId) { - JobManager jobEntity = this.jobService.get(jobId); + JobManager jobEntity = this.jobService.get(graphSpace, graph, jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); + Ex.check(this.service.get(graphSpace, graph, jobId, taskId) != null, + "load.task.not-exist.id", taskId); Ex.check(jobEntity.getJobStatus() == JobStatus.LOADING, "load.task.pause.no-permission"); try { @@ -203,10 +216,14 @@ public LoadTask pause(@PathVariable("jobId") int jobId, } @PostMapping("resume") - public LoadTask resume(@PathVariable("jobId") int jobId, + public LoadTask resume(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, @RequestParam("task_id") int taskId) { - JobManager jobEntity = this.jobService.get(jobId); + JobManager jobEntity = this.jobService.get(graphSpace, graph, jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); + Ex.check(this.service.get(graphSpace, graph, jobId, taskId) != null, + "load.task.not-exist.id", taskId); Ex.check(jobEntity.getJobStatus() == JobStatus.LOADING, "load.task.pause.no-permission"); try { @@ -219,10 +236,14 @@ public LoadTask resume(@PathVariable("jobId") int jobId, } @PostMapping("stop") - public LoadTask stop(@PathVariable("jobId") int jobId, + public LoadTask stop(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, @RequestParam("task_id") int taskId) { - JobManager jobEntity = this.jobService.get(jobId); + JobManager jobEntity = this.jobService.get(graphSpace, graph, jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); + Ex.check(this.service.get(graphSpace, graph, jobId, taskId) != null, + "load.task.not-exist.id", taskId); Ex.check(jobEntity.getJobStatus() == JobStatus.LOADING, "load.task.pause.no-permission"); try { @@ -235,10 +256,14 @@ public LoadTask stop(@PathVariable("jobId") int jobId, } @PostMapping("retry") - public LoadTask retry(@PathVariable("jobId") int jobId, + public LoadTask retry(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, @RequestParam("task_id") int taskId) { - JobManager jobEntity = this.jobService.get(jobId); + JobManager jobEntity = this.jobService.get(graphSpace, graph, jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); + Ex.check(this.service.get(graphSpace, graph, jobId, taskId) != null, + "load.task.not-exist.id", taskId); Ex.check(jobEntity.getJobStatus() == JobStatus.LOADING, "load.task.pause.no-permission"); try { @@ -251,16 +276,19 @@ public LoadTask retry(@PathVariable("jobId") int jobId, } @GetMapping("{id}/reason") - public Response reason(@PathVariable("jobId") int jobId, + public Response reason(@PathVariable("graphspace") String graphSpace, + @PathVariable("graph") String graph, + @PathVariable("jobId") int jobId, @PathVariable("id") int id) { - LoadTask task = this.service.get(id); + LoadTask task = this.service.get(graphSpace, graph, jobId, id); if (task == null) { throw new ExternalException("load.task.not-exist.id", id); } - JobManager jobEntity = this.jobService.get(jobId); + JobManager jobEntity = this.jobService.get(graphSpace, graph, jobId); Ex.check(jobEntity != null, "job-manager.not-exist.id", jobId); Integer fileId = task.getFileId(); - FileMapping mapping = this.fmService.get(fileId); + FileMapping mapping = this.fmService.get(graphSpace, graph, jobId, + fileId); String reason = this.service.readLoadFailedReason(mapping); return Response.builder() .status(Constant.STATUS_OK) diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/FileMappingService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/FileMappingService.java index 99d50fcbe..06495a763 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/FileMappingService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/FileMappingService.java @@ -103,6 +103,15 @@ public FileMapping get(int id) { return this.mapper.selectById(id); } + public FileMapping get(String graphSpace, String graph, int jobId, int id) { + QueryWrapper query = Wrappers.query(); + query.eq("id", id) + .eq("graphspace", graphSpace) + .eq("graph", graph) + .eq("job_id", jobId); + return this.mapper.selectOne(query); + } + public FileMapping get(String graphSpace, String graph, int jobId, String fileName) { QueryWrapper query = Wrappers.query(); @@ -123,6 +132,15 @@ public List listByJob(int jobId) { return this.mapper.selectList(query); } + public List listByJob(String graphSpace, String graph, + int jobId) { + QueryWrapper query = Wrappers.query(); + query.eq("graphspace", graphSpace) + .eq("graph", graph) + .eq("job_id", jobId); + return this.mapper.selectList(query); + } + public IPage list(String graphSpace, String graph, int jobId, int pageNo, int pageSize) { QueryWrapper query = Wrappers.query(); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/JobManagerService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/JobManagerService.java index 31bc61f16..9d19a9523 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/JobManagerService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/JobManagerService.java @@ -64,6 +64,14 @@ public JobManager get(int id) { return this.mapper.selectById(id); } + public JobManager get(String graphSpace, String graph, int id) { + QueryWrapper query = Wrappers.query(); + query.eq("id", id) + .eq("graphspace", graphSpace) + .eq("graph", graph); + return this.mapper.selectOne(query); + } + public JobManager getTask(String jobName, String graphSpace, String graph) { QueryWrapper query = Wrappers.query(); query.eq("job_name", jobName); @@ -74,7 +82,11 @@ public JobManager getTask(String jobName, String graphSpace, String graph) { public List list(String graphSpace, String graph, List jobIds) { - return this.mapper.selectBatchIds(jobIds); + QueryWrapper query = Wrappers.query(); + query.eq("graphspace", graphSpace) + .eq("graph", graph) + .in("id", jobIds); + return this.mapper.selectList(query); } public IPage list(String graphSpace, String graph, @@ -190,6 +202,15 @@ public void deleteJob(int id) { this.deleteDiskFilesAfterCommit(mappings); } + @Transactional(isolation = Isolation.READ_COMMITTED) + public void deleteJob(String graphSpace, String graph, int id) { + JobManager job = this.get(graphSpace, graph, id); + if (job == null) { + throw new ExternalException("job.manager.not-exist.id", id); + } + this.deleteJob(id); + } + private void deleteDiskFilesAfterCommit(List mappings) { if (mappings.isEmpty()) { return; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/LoadTaskService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/LoadTaskService.java index 8e20384f4..76f3af7ca 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/LoadTaskService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/load/LoadTaskService.java @@ -101,6 +101,15 @@ public LoadTask get(int id) { return this.mapper.selectById(id); } + public LoadTask get(String graphSpace, String graph, int jobId, int id) { + QueryWrapper query = Wrappers.query(); + query.eq("id", id) + .eq("graphspace", graphSpace) + .eq("graph", graph) + .eq("job_id", jobId); + return this.mapper.selectOne(query); + } + public List listAll() { return this.mapper.selectList(null); } @@ -116,9 +125,14 @@ public IPage list(String graphSpace, String graph, int jobId, return this.mapper.selectPage(page, query); } - public List list(String grpahSpace, String graph, + public List list(String graphSpace, String graph, int jobId, List taskIds) { - return this.mapper.selectBatchIds(taskIds); + QueryWrapper query = Wrappers.query(); + query.eq("graphspace", graphSpace) + .eq("graph", graph) + .eq("job_id", jobId) + .in("id", taskIds); + return this.mapper.selectList(query); } public int count() { diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUploadControllerTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUploadControllerTest.java index dbc962454..d6b251789 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUploadControllerTest.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/FileUploadControllerTest.java @@ -120,7 +120,8 @@ public void testReserveUploadQuotaUsesGraphRouteForNewMapping() FileMappingService service = Mockito.mock(FileMappingService.class); JobManagerService jobService = Mockito.mock(JobManagerService.class); JobManager job = JobManager.builder().id(1).jobSize(20L).build(); - Mockito.when(jobService.get(1)).thenReturn(job); + Mockito.when(jobService.get("DEFAULT", "hugegraph", 1)) + .thenReturn(job); Mockito.when(service.get("DEFAULT", "hugegraph", 1, "data.csv")) .thenReturn(null); Mockito.when(service.listByJob(1)).thenReturn(Collections.emptyList()); @@ -156,7 +157,8 @@ public void testReserveUploadQuotaRejectsCompletedDuplicate() "data.csv", "upload/old.csv"); completed.setFileStatus(FileMappingStatus.COMPLETED); - Mockito.when(jobService.get(1)).thenReturn(job); + Mockito.when(jobService.get("DEFAULT", "hugegraph", 1)) + .thenReturn(job); Mockito.when(service.get("DEFAULT", "hugegraph", 1, "data.csv")) .thenReturn(completed); this.setField(controller, "service", service); @@ -186,7 +188,8 @@ public void testReserveUploadQuotaUpdatesExistingUploadingMapping() existing.setFileStatus(FileMappingStatus.UPLOADING); List uploading = new ArrayList<>(); uploading.add(existing); - Mockito.when(jobService.get(1)).thenReturn(job); + Mockito.when(jobService.get("DEFAULT", "hugegraph", 1)) + .thenReturn(job); Mockito.when(service.get("DEFAULT", "hugegraph", 1, "data.csv")) .thenReturn(existing); Mockito.when(service.listByJob(1)).thenReturn(uploading); diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/JobManagerServiceTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/JobManagerServiceTest.java index 577a788d9..20439feae 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/JobManagerServiceTest.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/JobManagerServiceTest.java @@ -20,6 +20,7 @@ import java.lang.reflect.Field; import java.util.Collections; +import java.util.Arrays; import org.junit.Test; import org.mockito.Mockito; @@ -35,6 +36,18 @@ public class JobManagerServiceTest { + @Test + public void testListByIdsAppliesGraphScope() throws Exception { + JobManagerService service = this.service(); + JobManagerMapper mapper = Mockito.mock(JobManagerMapper.class); + this.setField(service, "mapper", mapper); + + service.list("space-a", "graph-a", Arrays.asList(1, 2)); + + Mockito.verify(mapper).selectList(Mockito.any()); + Mockito.verify(mapper, Mockito.never()).selectBatchIds(Mockito.any()); + } + @Test public void testRefreshStatusMarksSucceededWhenAllLoadTasksSucceed() throws Exception { diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoadTaskServiceTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoadTaskServiceTest.java index bfd830e2e..616c811c9 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoadTaskServiceTest.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoadTaskServiceTest.java @@ -19,6 +19,8 @@ package org.apache.hugegraph.unit; import java.lang.reflect.Method; +import java.lang.reflect.Field; +import java.util.Arrays; import org.junit.Test; @@ -27,10 +29,32 @@ import org.apache.hugegraph.entity.load.LoadParameter; import org.apache.hugegraph.loader.executor.LoadOptions; import org.apache.hugegraph.service.load.LoadTaskService; +import org.apache.hugegraph.mapper.load.LoadTaskMapper; import org.apache.hugegraph.testutil.Assert; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; public class LoadTaskServiceTest { + @Test + public void testListByIdsAppliesGraphScope() throws Exception { + LoadTaskService service = new LoadTaskService(); + LoadTaskMapper mapper = Mockito.mock(LoadTaskMapper.class); + Field field = LoadTaskService.class.getDeclaredField("mapper"); + field.setAccessible(true); + field.set(service, mapper); + + service.list("space-a", "graph-a", 7, Arrays.asList(1, 2)); + + ArgumentCaptor query = + ArgumentCaptor.forClass(QueryWrapper.class); + Mockito.verify(mapper).selectList(query.capture()); + Assert.assertContains("job_id", query.getValue().getSqlSegment()); + Mockito.verify(mapper, Mockito.never()).selectBatchIds(Mockito.any()); + } + @Test public void testLoadOptionsPreferBasicCredentialPassword() throws Exception { diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoaderScopeControllerTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoaderScopeControllerTest.java new file mode 100644 index 000000000..04b89ede6 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoaderScopeControllerTest.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * Licensed under the Apache License, Version 2.0. + */ +package org.apache.hugegraph.unit; + +import java.util.Collections; +import java.util.Arrays; + +import org.apache.hugegraph.controller.load.FileMappingController; +import org.apache.hugegraph.controller.load.JobManagerController; +import org.apache.hugegraph.controller.load.LoadTaskController; +import org.apache.hugegraph.entity.load.FileMapping; +import org.apache.hugegraph.entity.load.JobManager; +import org.apache.hugegraph.entity.load.LoadTask; +import org.apache.hugegraph.service.load.FileMappingService; +import org.apache.hugegraph.service.load.JobManagerService; +import org.apache.hugegraph.service.load.LoadTaskService; +import org.junit.Test; +import org.mockito.Mockito; +import org.springframework.test.util.ReflectionTestUtils; + +public class LoaderScopeControllerTest { + + @Test + public void testJobLookupUsesGraphScope() { + JobManagerService service = Mockito.mock(JobManagerService.class); + JobManager expected = new JobManager(); + Mockito.when(service.get("space-a", "graph-a", 7)) + .thenReturn(expected); + + JobManagerController controller = new JobManagerController(service); + + org.junit.Assert.assertSame(expected, + controller.get("space-a", "graph-a", 7)); + } + + @Test + public void testFileClearUsesNestedScope() { + FileMappingService service = Mockito.mock(FileMappingService.class); + FileMapping mapping = FileMapping.builder().id(11).build(); + Mockito.when(service.listByJob("space-a", "graph-a", 7)) + .thenReturn(Collections.singletonList(mapping)); + FileMappingController controller = new FileMappingController(); + ReflectionTestUtils.setField(controller, "service", service); + + controller.clear("space-a", "graph-a", 7); + + Mockito.verify(service).remove(11); + Mockito.verify(service, Mockito.never()).listAll(); + } + + @Test + public void testLoadTaskLookupUsesNestedScope() { + LoadTaskService service = Mockito.mock(LoadTaskService.class); + LoadTask expected = new LoadTask(); + Mockito.when(service.get("space-a", "graph-a", 7, 13)) + .thenReturn(expected); + LoadTaskController controller = new LoadTaskController(service); + + org.junit.Assert.assertSame(expected, + controller.get("space-a", "graph-a", 7, + 13)); + } + + @Test + public void testLoadTaskBatchLookupUsesNestedScope() { + LoadTaskService service = Mockito.mock(LoadTaskService.class); + LoadTaskController controller = new LoadTaskController(service); + + controller.list("space-a", "graph-a", 7, Arrays.asList(13, 14)); + + Mockito.verify(service).list("space-a", "graph-a", 7, + Arrays.asList(13, 14)); + } +} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java index 8207defdf..6b67979be 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java @@ -49,6 +49,7 @@ JobManagerServiceTest.class, K8sTokenEndpointSecurityTest.class, LoadTaskServiceTest.class, + LoaderScopeControllerTest.class, LoginAttemptGuardTest.class, OltpAlgoControllerTest.class, OltpAlgoServiceTest.class, From 1358df72614dd3f3284d20b67216edf47c9cb2f0 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 04:33:43 +0800 Subject: [PATCH 54/68] chore(hubble): trim legacy build debt - remove unused secondary request wrapper - use default Node and Yarn download sources - align Kotlin runtime dependency versions - reduce expected parser log noise and mark date migration --- .../service/space/ComputerService.java | 3 +- hugegraph-hubble/hubble-dist/pom.xml | 3 - .../src/api/request-error-semantics.test.js | 2 +- .../src/api/request-language-header.test.js | 2 +- .../hubble-fe/src/api/request2.js | 176 ------------------ hugegraph-hubble/hubble-fe/src/index.js | 2 + hugegraph-hubble/pom.xml | 5 +- 7 files changed, 9 insertions(+), 184 deletions(-) delete mode 100644 hugegraph-hubble/hubble-fe/src/api/request2.js diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/ComputerService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/ComputerService.java index 0e50685ca..73a33ea79 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/ComputerService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/space/ComputerService.java @@ -81,7 +81,8 @@ protected ComputerServiceEntity convert(Task task) { entity.setAlgorithm(input.get("algorithm").toString()); entity.setInput(input.get("params").toString()); } catch (SerializeException e) { - log.info("load task.input error", e); + log.warn("Failed to parse computer task input: {}", + e.getMessage()); } } return entity; diff --git a/hugegraph-hubble/hubble-dist/pom.xml b/hugegraph-hubble/hubble-dist/pom.xml index 23d073ad3..bdbfdace0 100644 --- a/hugegraph-hubble/hubble-dist/pom.xml +++ b/hugegraph-hubble/hubble-dist/pom.xml @@ -103,9 +103,6 @@ ${build.node.version} ${build.yarn.version} - https://mirrors.aliyun.com/nodejs-release/ - https://repo.huaweicloud.com/yarn/ - diff --git a/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js b/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js index fe8f0147e..761f23ce0 100644 --- a/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js +++ b/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js @@ -70,7 +70,7 @@ const loadResponseHandlers = modulePath => { }; }; -describe.each(['./request', './request2'])('%s error semantics', modulePath => { +describe.each(['./request'])('%s error semantics', modulePath => { beforeEach(() => { delete window.location; window.location = { diff --git a/hugegraph-hubble/hubble-fe/src/api/request-language-header.test.js b/hugegraph-hubble/hubble-fe/src/api/request-language-header.test.js index f20deeade..d69c20025 100644 --- a/hugegraph-hubble/hubble-fe/src/api/request-language-header.test.js +++ b/hugegraph-hubble/hubble-fe/src/api/request-language-header.test.js @@ -73,7 +73,7 @@ describe('request language header', () => { it('preserves existing headers while adding the selected language to form requests', () => { localStorage.setItem('languageType', 'zh-CN'); - const intercept = loadRequestInterceptor('./request2'); + const intercept = loadRequestInterceptor('./request'); const config = intercept({ headers: { diff --git a/hugegraph-hubble/hubble-fe/src/api/request2.js b/hugegraph-hubble/hubble-fe/src/api/request2.js deleted file mode 100644 index 37a4ccc02..000000000 --- a/hugegraph-hubble/hubble-fe/src/api/request2.js +++ /dev/null @@ -1,176 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -import axios from 'axios'; -import {message} from 'antd'; -import JSONbig from 'json-bigint'; -import _ from 'lodash'; -import qs from 'qs'; -import i18n from '../i18n'; -import * as user from '../utils/user'; -import {withLanguageHeader} from './languageHeader'; -import {showThrottleWarning} from './throttleWarning'; - -const isJsonResponse = headers => { - const contentType = headers?.['content-type'] || headers?.['Content-Type'] || ''; - return contentType.includes('application/json'); -}; - -const parseResponse = (data, headers) => { - if (!data || !isJsonResponse(headers)) { - return data; - } - return JSONbig.parse(data); -}; - -const redirectToLogin = () => { - user.clearLogin(); - if (window.location.pathname !== '/login') { - const redirect = `${window.location.pathname}${window.location.search}`; - sessionStorage.setItem('redirect', redirect); - window.location.href = `/login?redirect=${encodeURIComponent(redirect)}`; - } -}; - -const showRequestError = res => { - message.error(i18n.t('request.error', { - message: res?.message ?? '', - path: res?.path ?? '', - })); -}; - -const isUnauthorizedError = error => { - return error.response?.status === 401 - || error.response?.data?.status === 401 - || error.message?.includes('status code 401'); -}; - -const instance = axios.create({ - baseURL: '/api/v1.3', - withCredentials: true, - // Backend times out after 30s; keep this slightly higher to receive its error body. - timeout: 31000, - transformResponse: [parseResponse], -}); - -instance.interceptors.request.use( - config => { - config.headers = withLanguageHeader(config.headers); - if (!config.headers['Content-Type']) { - config.headers = { - ...config.headers, - 'Content-Type': 'application/x-www-form-urlencoded', - }; - } - return config; - }, - error => { - return Promise.reject(error); - } -); - -instance.interceptors.response.use( - response => { - if (response.status === 401 || response.data?.status === 401) { - redirectToLogin(); - return Promise.reject(response); - } - else if (response.data?.status === 429) { - showThrottleWarning(response.data.message); - } - else if (response.data?.status !== 200 - && !response.config?.suppressBusinessErrorToast) { - if (!_.isEmpty(response.data.message)) { - message.error(response.data.message); - } - } - return response; - }, - error => { - if (isUnauthorizedError(error)) { - redirectToLogin(); - return Promise.reject(error); - } - if (error.response?.status === 429 - || error.response?.data?.status === 429) { - showThrottleWarning(error.response?.data?.message); - return Promise.reject(error); - } - if (!error.config?.suppressBusinessErrorToast) { - const res = error.response?.data; - showRequestError(res); - } - return Promise.reject(error); - } -); - -const request = {}; - -const responseData = response => { - const data = response?.data; - if (data?.status === 401) { - redirectToLogin(); - } - return data; -}; - -request.get = async (url, params) => { - const resposne = await instance.get(`${url}`, params); - return responseData(resposne); -}; - -request.post = async (url, params, config) => { - const resposne = await instance.post( - `${url}`, - qs.stringify(params), - config - ); - - return responseData(resposne); -}; - -request.post1 = async (url, params, config) => { - const resposne = await instance.post( - `${url}`, - params, - config - ); - - return responseData(resposne); -}; - -request.put = async (url, params, config) => { - const resposne = await instance.put( - `${url}`, - params, - config - ); - - return responseData(resposne); -}; - -request.delete = async (url, params, config) => { - const resposne = await instance.delete( - `${url}`, - {...config, params} - ); - - return responseData(resposne); -}; - -export default request; diff --git a/hugegraph-hubble/hubble-fe/src/index.js b/hugegraph-hubble/hubble-fe/src/index.js index b791cb40f..37d0ea877 100644 --- a/hugegraph-hubble/hubble-fe/src/index.js +++ b/hugegraph-hubble/hubble-fe/src/index.js @@ -20,6 +20,8 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import {BrowserRouter} from 'react-router-dom'; import {ConfigProvider} from 'antd'; +// FIXME: Consolidate moment into date-fns after replacing filter comparisons +// and Ant Design date values together; removing it piecemeal changes semantics. import 'moment/locale/zh-cn'; import './index.css'; import App from './App'; diff --git a/hugegraph-hubble/pom.xml b/hugegraph-hubble/pom.xml index f845bd9ee..b69b3204d 100644 --- a/hugegraph-hubble/pom.xml +++ b/hugegraph-hubble/pom.xml @@ -45,6 +45,7 @@ ${project.basedir}/.. 2.1.8.RELEASE 4.10.0 + 1.6.20

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 JB|E&6eg&oA#8dzP diff --git a/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/i18n-zh-CN.png b/.codex-task/hubble2-code-quality/evidence/live-acceptance-2026-07-11/ui/i18n-zh-CN.png deleted file mode 100644 index 10e74ae00b3b06e5a0b9f7facde38a59ee5ea1d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39594 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

@@ -80,7 +81,7 @@ org.jetbrains.kotlin kotlin-stdlib - 1.6.20 + ${kotlin.version} com.squareup.okhttp3 @@ -92,7 +93,7 @@ org.jetbrains.kotlin kotlin-stdlib-common - 1.5.31 + ${kotlin.version} com.google.protobuf From a972b54c45135628079d89ebc261647db675fcec Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 04:38:56 +0800 Subject: [PATCH 55/68] fix: add standard ASF license headers and fix checkstyle issues Files were using a short-form license header that fails the license-eye check. Replace with the full standard Apache 2.0 header consistent with the rest of the project. Also fix all remaining Checkstyle violations in toolchain modules including line length, indentation, operator wrapping, and support for SuppressWarnings filter. Files fixed (License): - hubble-be/.../exception/LoginThrottledException.java - hubble-be/.../service/auth/LoginAttemptGuard.java - hubble-be/.../unit/LoaderScopeControllerTest.java - hubble-be/.../unit/LoginAttemptGuardTest.java - hubble-be/.../unit/PriorityFixTest.java - hubble-fe/src/api/throttleWarning.js - hubble-fe/src/components/RouteErrorBoundary/index.js Files fixed (Checkstyle): - tools/checkstyle.xml - hugegraph-client/.../driver/HugeClientBuilder.java - hugegraph-loader/.../loader/HugeGraphLoader.java - hugegraph-loader/.../loader/task/TaskManager.java - hugegraph-loader/.../loader/executor/LoadOptions.java --- .../hugegraph/driver/HugeClientBuilder.java | 4 ++-- .../exception/LoginThrottledException.java | 15 +++++++++++-- .../service/auth/LoginAttemptGuard.java | 15 +++++++++++-- .../unit/LoaderScopeControllerTest.java | 15 +++++++++++-- .../hugegraph/unit/LoginAttemptGuardTest.java | 15 +++++++++++-- .../hugegraph/unit/PriorityFixTest.java | 15 +++++++++++-- .../hubble-fe/src/api/throttleWarning.js | 15 +++++++++++-- .../components/RouteErrorBoundary/index.js | 15 +++++++++++-- .../hugegraph/loader/HugeGraphLoader.java | 21 ++++++++++++------- .../loader/executor/LoadOptions.java | 3 ++- .../hugegraph/loader/task/TaskManager.java | 3 ++- tools/checkstyle.xml | 2 ++ 12 files changed, 112 insertions(+), 26 deletions(-) diff --git a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClientBuilder.java b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClientBuilder.java index 6b5d773ab..545566243 100644 --- a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClientBuilder.java +++ b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/HugeClientBuilder.java @@ -78,8 +78,8 @@ public HugeClient build() { "Expect a string value as the url parameter argument, but got: %s", this.url); E.checkArgument(this.graph != null && !this.graph.isEmpty(), - "Expect a string value as the graph name parameter argument, but got: %s", - this.graph); + "Expect a string value as the graph name " + + "parameter argument, but got: %s", this.graph); } return new HugeClient(this); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/LoginThrottledException.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/LoginThrottledException.java index 3adba9ebc..6770f4ad1 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/LoginThrottledException.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/exception/LoginThrottledException.java @@ -1,8 +1,19 @@ /* + * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. - * Licensed under the Apache License, Version 2.0. + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. */ package org.apache.hugegraph.exception; diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/LoginAttemptGuard.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/LoginAttemptGuard.java index 33469baa0..2d34c01db 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/LoginAttemptGuard.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/auth/LoginAttemptGuard.java @@ -1,8 +1,19 @@ /* + * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. - * Licensed under the Apache License, Version 2.0. + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. */ package org.apache.hugegraph.service.auth; diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoaderScopeControllerTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoaderScopeControllerTest.java index 04b89ede6..2382e49ad 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoaderScopeControllerTest.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoaderScopeControllerTest.java @@ -1,8 +1,19 @@ /* + * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. - * Licensed under the Apache License, Version 2.0. + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. */ package org.apache.hugegraph.unit; diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoginAttemptGuardTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoginAttemptGuardTest.java index 0cd66c837..e72e4b695 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoginAttemptGuardTest.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/LoginAttemptGuardTest.java @@ -1,8 +1,19 @@ /* + * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. - * Licensed under the Apache License, Version 2.0. + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. */ package org.apache.hugegraph.unit; diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/PriorityFixTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/PriorityFixTest.java index 6816ade60..5581c410a 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/PriorityFixTest.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/PriorityFixTest.java @@ -1,8 +1,19 @@ /* + * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. - * Licensed under the Apache License, Version 2.0. + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. */ package org.apache.hugegraph.unit; diff --git a/hugegraph-hubble/hubble-fe/src/api/throttleWarning.js b/hugegraph-hubble/hubble-fe/src/api/throttleWarning.js index ed07d3731..1f1718f73 100644 --- a/hugegraph-hubble/hubble-fe/src/api/throttleWarning.js +++ b/hugegraph-hubble/hubble-fe/src/api/throttleWarning.js @@ -1,8 +1,19 @@ /* + * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. - * Licensed under the Apache License, Version 2.0. + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. */ import {Modal} from 'antd'; diff --git a/hugegraph-hubble/hubble-fe/src/components/RouteErrorBoundary/index.js b/hugegraph-hubble/hubble-fe/src/components/RouteErrorBoundary/index.js index 88c14acc7..f0cbaed0e 100644 --- a/hugegraph-hubble/hubble-fe/src/components/RouteErrorBoundary/index.js +++ b/hugegraph-hubble/hubble-fe/src/components/RouteErrorBoundary/index.js @@ -1,8 +1,19 @@ /* + * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. - * Licensed under the Apache License, Version 2.0. + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. */ import React from 'react'; diff --git a/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/HugeGraphLoader.java b/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/HugeGraphLoader.java index dab3fb579..f561224a8 100644 --- a/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/HugeGraphLoader.java +++ b/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/HugeGraphLoader.java @@ -158,8 +158,8 @@ public LoadContext context() { private void checkGraphExists() { HugeClient client = this.context.indirectClient(); String targetGraph = this.options.graph; - if (this.options.createGraph - && !client.graphs().listGraph().contains(targetGraph)) { + if (this.options.createGraph && + !client.graphs().listGraph().contains(targetGraph)) { Map conf = new HashMap<>(); conf.put("store", targetGraph); conf.put("backend", this.options.backend); @@ -179,8 +179,10 @@ private void setGraphMode() { () -> this.mapping.structs().stream().filter(struct -> !struct.skip()) .map(InputStruct::input); - boolean allMatch = inputsSupplier.get().allMatch(input -> SourceType.GRAPH.equals(input.type())); - boolean anyMatch = inputsSupplier.get().anyMatch(input -> SourceType.GRAPH.equals(input.type())); + boolean allMatch = inputsSupplier.get().allMatch(input -> + SourceType.GRAPH.equals(input.type())); + boolean anyMatch = inputsSupplier.get().anyMatch(input -> + SourceType.GRAPH.equals(input.type())); if (anyMatch && !allMatch) { throw new LoadException("All inputs must be of Graph Type"); @@ -364,7 +366,7 @@ private void createGraphSourceLabels( if (des.getProperties() != null) { des.getProperties() - .forEach((p) -> label.properties().remove(p)); + .forEach((p) -> label.properties().remove(p)); } } @@ -382,12 +384,14 @@ private void createGraphSourceLabels( if (isVertex) { if (!(label instanceof VertexLabel)) { - throw new IllegalArgumentException("Expected VertexLabel but got " + label.getClass()); + throw new IllegalArgumentException("Expected VertexLabel but got " + + label.getClass()); } targetClient.schema().addVertexLabel((VertexLabel) label); } else { if (!(label instanceof EdgeLabel)) { - throw new IllegalArgumentException("Expected EdgeLabel but got " + label.getClass()); + throw new IllegalArgumentException("Expected EdgeLabel but got " + + label.getClass()); } targetClient.schema().addEdgeLabel((EdgeLabel) label); } @@ -759,7 +763,8 @@ private void loadStruct(InputStruct struct, InputReader reader) { // Read next line from data source if (reader.hasNext()) { Line next = reader.next(); - // If the data source is kafka, there may be cases where the fetched data is null + // If the data source is kafka, there may be cases where the fetched + // data is null if (next != null) { lines.add(next); metrics.increaseReadSuccess(); diff --git a/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/executor/LoadOptions.java b/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/executor/LoadOptions.java index f0ea30b7b..b80ca0985 100644 --- a/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/executor/LoadOptions.java +++ b/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/executor/LoadOptions.java @@ -439,7 +439,8 @@ private static void adjustConnectionPoolIfDefault(LoadOptions options) { options.maxConnections, batchThreads); } - if (maxConnPerRoute == DEFAULT_MAX_CONNECTIONS_PER_ROUTE && maxConnPerRoute < batchThreads * 2) { + if (maxConnPerRoute == DEFAULT_MAX_CONNECTIONS_PER_ROUTE && + maxConnPerRoute < batchThreads * 2) { options.maxConnectionsPerRoute = batchThreads * 2; LOG.info("Auto adjusted max-conn-per-route to {} based on batch-insert-threads({})", options.maxConnectionsPerRoute, batchThreads); diff --git a/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/task/TaskManager.java b/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/task/TaskManager.java index 7d0793955..ff9059a44 100644 --- a/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/task/TaskManager.java +++ b/hugegraph-loader/src/main/java/org/apache/hugegraph/loader/task/TaskManager.java @@ -166,7 +166,8 @@ public void submitBatch(InputStruct struct, ElementMapping mapping, this.context.occurredError(); this.context.stopLoading(); LOG.error("Batch insert {} error, interrupting import", mapping.type(), e); - Printer.printError("Batch insert %s failed, stop loading. Please check the logs", + Printer.printError("Batch insert %s failed, stop loading. " + + "Please check the logs", mapping.type().string()); } } else { diff --git a/tools/checkstyle.xml b/tools/checkstyle.xml index 9b21713d7..60b785836 100644 --- a/tools/checkstyle.xml +++ b/tools/checkstyle.xml @@ -20,6 +20,7 @@ + @@ -33,6 +34,7 @@ + From 822477772a373a1fa8ba0d5959534932a5dfe310 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 08:39:10 +0800 Subject: [PATCH 56/68] fix(hubble): restore algorithm interactions - forward only rc-collapse control props across wrappers - normalize rejected algorithm requests for form recovery - preserve success, business-error, and auth contracts - cover all algorithm panels and shared API boundaries --- .../src/api/analysis-algorithm-error.test.js | 80 +++++++++++++++++++ .../hubble-fe/src/api/analysis.js | 32 +++++++- .../Olap/BetweennessCentrality/index.js | 3 + .../BetweennessCentralityVermeer/index.js | 3 + .../Olap/ClosenessCentrality/index.js | 3 + .../Olap/ClosenessCentralityVermeer/index.js | 3 + .../Olap/ClusterCoefficient/index.js | 3 + .../Olap/DegreeCentrality/index.js | 3 + .../Olap/DegreeCentralityVermeer/index.js | 3 + .../Olap/FilterSubGraphMatching/index.js | 3 + .../Olap/FilteredRingsDetection/index.js | 3 + .../algorithmsForm/Olap/KCore/index.js | 3 + .../algorithmsForm/Olap/KCoreVermeer/index.js | 3 + .../Olap/LabelPropagationAlgorithm/index.js | 3 + .../LabelPropagationAlgorithmVermeer/index.js | 3 + .../algorithmsForm/Olap/Links/index.js | 3 + .../algorithmsForm/Olap/Louvain/index.js | 3 + .../algorithmsForm/Olap/PageRank/index.js | 3 + .../Olap/PageRankVermeer/index.js | 3 + .../Olap/PersonalPageRank/index.js | 3 + .../Olap/RingsDetection/index.js | 3 + .../algorithmsForm/Olap/SSSPVermeer/index.js | 3 + .../Olap/TriangleCount/index.js | 3 + .../Olap/TriangleCountVermeer/index.js | 3 + .../Olap/WeaklyConnectedComponent/index.js | 3 + .../WeaklyConnectedComponentVermeer/index.js | 3 + .../algorithmsForm/Oltp/AdamicAdar/index.js | 3 + .../algorithmsForm/Oltp/AllPaths/index.js | 3 + .../algorithmsForm/Oltp/Crosspoints/index.js | 3 + .../Oltp/CustomizedCrosspoints/Home/index.js | 3 + .../Oltp/CustomizedPaths/Home/index.js | 3 + .../algorithmsForm/Oltp/Egonet/index.js | 3 + .../Oltp/FindShortestPath/index.js | 3 + .../Oltp/FindShortestPathWithWeight/index.js | 3 + .../Oltp/FusiformSimilarity/index.js | 3 + .../Oltp/JaccardSimilarityGet/index.js | 3 + .../Oltp/JaccardSimilarityPost/index.js | 3 + .../algorithmsForm/Oltp/KneighborGet/index.js | 3 + .../Oltp/KneighborPost/index.js | 3 + .../algorithmsForm/Oltp/KoutGet/index.js | 3 + .../Oltp/KoutPost/Home/index.js | 3 + .../Oltp/MultiNodesShortestPath/index.js | 3 + .../Oltp/NeighborRankApi/index.js | 3 + .../algorithmsForm/Oltp/Paths/index.js | 3 + .../algorithmsForm/Oltp/RankApi/index.js | 3 + .../algorithmsForm/Oltp/Rays/index.js | 3 + .../Oltp/ResourceAllocation/index.js | 3 + .../algorithmsForm/Oltp/Rings/index.js | 3 + .../Oltp/SameNeighbors/index.js | 3 + .../Oltp/SameNeighborsBatch/index.js | 3 + .../algorithmsForm/Oltp/ShortestPath/index.js | 3 + .../Oltp/SingleSourceShortestPath/index.js | 3 + .../Oltp/TemplatePaths/Home/index.js | 3 + .../algorithm-dom-props.test.js | 15 ++++ 54 files changed, 277 insertions(+), 3 deletions(-) create mode 100644 hugegraph-hubble/hubble-fe/src/api/analysis-algorithm-error.test.js diff --git a/hugegraph-hubble/hubble-fe/src/api/analysis-algorithm-error.test.js b/hugegraph-hubble/hubble-fe/src/api/analysis-algorithm-error.test.js new file mode 100644 index 000000000..76b014e7f --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/api/analysis-algorithm-error.test.js @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +jest.mock('./request', () => ({ + __esModule: true, + default: { + post: jest.fn(), + }, +})); + +const request = require('./request').default; +const analysis = require('./analysis'); + +describe('algorithm API failure contract', () => { + beforeEach(() => { + request.post.mockReset(); + }); + + it.each([ + ['runOltpInfo', ['DEFAULT', 'g', {algorithmName: 'kneighbor'}]], + ['postOlapInfo', ['DEFAULT', 'g', {algorithm: 'louvain'}]], + ['runOlapVermeer', ['DEFAULT', 'g', {algorithm: 'pagerank'}]], + ])('normalizes rejected %s requests for the shared form contract', async (name, args) => { + request.post.mockRejectedValue({ + response: { + status: 503, + data: {status: 503, message: 'algorithm service unavailable'}, + }, + }); + + await expect(analysis[name](...args)).resolves.toEqual({ + status: 503, + data: null, + message: 'algorithm service unavailable', + }); + }); + + it('preserves successful algorithm responses', async () => { + const success = {status: 200, data: {task_id: 7}, message: 'Success'}; + request.post.mockResolvedValue(success); + + await expect(analysis.postOlapInfo('DEFAULT', 'g', {})).resolves.toBe(success); + }); + + it('preserves resolved business failures', async () => { + const failure = {status: 400, data: null, message: 'invalid source'}; + request.post.mockResolvedValue(failure); + + await expect(analysis.runOltpInfo('DEFAULT', 'g', { + algorithmName: 'kneighbor', + })).resolves.toBe(failure); + }); + + it.each([ + [{data: {status: 401, message: 'expired'}}], + [{response: {status: 401, data: {status: 401, message: 'expired'}}}], + ])('keeps rejected 401 status after request-level redirect handling', async error => { + request.post.mockRejectedValue(error); + + await expect(analysis.postOlapInfo('DEFAULT', 'g', {})).resolves.toEqual({ + status: 401, + data: null, + message: 'expired', + }); + }); +}); diff --git a/hugegraph-hubble/hubble-fe/src/api/analysis.js b/hugegraph-hubble/hubble-fe/src/api/analysis.js index 1ecd7f3cd..fb0347b30 100644 --- a/hugegraph-hubble/hubble-fe/src/api/analysis.js +++ b/hugegraph-hubble/hubble-fe/src/api/analysis.js @@ -137,16 +137,42 @@ const addEdge = (graphspace, graph, params) => { // 图算法 +const runAlgorithmRequest = async requestCall => { + try { + return await requestCall(); + } + catch (error) { + const errorData = error?.response?.data || error?.data; + return { + status: errorData?.status || error?.response?.status || 500, + data: null, + message: errorData?.message || error?.message || '', + }; + } +}; + const postOlapInfo = (graphspace, graph, data) => { - return request.post(`/graphspaces/${graphspace}/graphs/${graph}/algorithms/olap`, data); + return runAlgorithmRequest(() => { + return request.post(`/graphspaces/${graphspace}/graphs/${graph}/algorithms/olap`, data); + }); }; const runOltpInfo = (graphspace, graph, data) => { - return request.post(`/graphspaces/${graphspace}/graphs/${graph}/algorithms/oltp/` + data.algorithmName, data); + return runAlgorithmRequest(() => { + return request.post( + `/graphspaces/${graphspace}/graphs/${graph}/algorithms/oltp/` + data.algorithmName, + data + ); + }); }; const runOlapVermeer = (graphspace, graph, params) => { - return request.post(`/graphspaces/${graphspace}/graphs/${graph}/algorithms/vermeer`, {params}); + return runAlgorithmRequest(() => { + return request.post( + `/graphspaces/${graphspace}/graphs/${graph}/algorithms/vermeer`, + {params} + ); + }); }; // 任务管理 diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/BetweennessCentrality/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/BetweennessCentrality/index.js index b460c580a..6fcb58ec1 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/BetweennessCentrality/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Olap/BetweennessCentrality/index.js @@ -116,6 +116,9 @@ const BetweennessCentrality = props => { return ( { return ( { return ( { return ( { return ( { return ( { return ( { return ( { return ( { return ( { return ( { return ( { return ( { ); return ( { return ( { return ( { return ( { return ( { return ( { return ( { return ( { return ( { return ( { return ( { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/AllPaths/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/AllPaths/index.js index 9bc38a66a..fde2f40ed 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/AllPaths/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/AllPaths/index.js @@ -202,6 +202,9 @@ const AllPaths = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Crosspoints/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Crosspoints/index.js index 51978d1b2..1192eda1b 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Crosspoints/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Crosspoints/index.js @@ -106,6 +106,9 @@ const Crosspoints = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedCrosspoints/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedCrosspoints/Home/index.js index ecfa631e6..3de1fbfdf 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedCrosspoints/Home/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedCrosspoints/Home/index.js @@ -120,6 +120,9 @@ const CustomizedCrosspoints = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedPaths/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedPaths/Home/index.js index 8bb541bc6..3704bcbd6 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedPaths/Home/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedPaths/Home/index.js @@ -128,6 +128,9 @@ const CustomizedPaths = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Egonet/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Egonet/index.js index bcdef27dd..c14f11c8e 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Egonet/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Egonet/index.js @@ -206,6 +206,9 @@ const Egonet = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FindShortestPath/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FindShortestPath/index.js index 32c076c40..fc176a0e5 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FindShortestPath/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FindShortestPath/index.js @@ -112,6 +112,9 @@ const FindShortestPath = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FindShortestPathWithWeight/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FindShortestPathWithWeight/index.js index e45f7a998..93a3c9c0b 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FindShortestPathWithWeight/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FindShortestPathWithWeight/index.js @@ -112,6 +112,9 @@ const FindShortestPathWithWeight = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FusiformSimilarity/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FusiformSimilarity/index.js index c88edbae9..166d2e7ea 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FusiformSimilarity/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/FusiformSimilarity/index.js @@ -111,6 +111,9 @@ const FusiformSimilarity = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/JaccardSimilarityGet/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/JaccardSimilarityGet/index.js index 3ee0d8b48..86a9220b8 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/JaccardSimilarityGet/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/JaccardSimilarityGet/index.js @@ -105,6 +105,9 @@ const JaccardSimilarityGet = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/JaccardSimilarityPost/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/JaccardSimilarityPost/index.js index 40506f395..d46dfcfbd 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/JaccardSimilarityPost/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/JaccardSimilarityPost/index.js @@ -222,6 +222,9 @@ const JaccardSimilarityPost = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KneighborGet/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KneighborGet/index.js index 9021bf32c..943e0aa65 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KneighborGet/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KneighborGet/index.js @@ -107,6 +107,9 @@ const KneighborGet = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KneighborPost/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KneighborPost/index.js index 221830ff0..8c40aa8b4 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KneighborPost/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KneighborPost/index.js @@ -234,6 +234,9 @@ const KneighborPost = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KoutGet/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KoutGet/index.js index 218f8d612..449159b61 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KoutGet/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KoutGet/index.js @@ -113,6 +113,9 @@ const KoutGet = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KoutPost/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KoutPost/Home/index.js index 638bba99c..0c4ee2b8e 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KoutPost/Home/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/KoutPost/Home/index.js @@ -137,6 +137,9 @@ const KoutPost = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/MultiNodesShortestPath/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/MultiNodesShortestPath/index.js index 49743f343..2ccaec0fa 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/MultiNodesShortestPath/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/MultiNodesShortestPath/index.js @@ -206,6 +206,9 @@ const MultiNodesShortestPath = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/NeighborRankApi/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/NeighborRankApi/index.js index 8e7be3833..8dc55140b 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/NeighborRankApi/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/NeighborRankApi/index.js @@ -246,6 +246,9 @@ const NeighborRankApi = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Paths/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Paths/index.js index fcdddca2f..0bc5e2a16 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Paths/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Paths/index.js @@ -103,6 +103,9 @@ const Paths = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/RankApi/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/RankApi/index.js index 7ac646ac4..83a599789 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/RankApi/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/RankApi/index.js @@ -119,6 +119,9 @@ const RankApi = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Rays/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Rays/index.js index 3da27491f..34c873dec 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Rays/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Rays/index.js @@ -107,6 +107,9 @@ const Rays = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/ResourceAllocation/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/ResourceAllocation/index.js index 6ee0ba982..3f71aec93 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/ResourceAllocation/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/ResourceAllocation/index.js @@ -102,6 +102,9 @@ const ResourceAllocation = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Rings/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Rings/index.js index 09ccb4152..aaed393db 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Rings/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Rings/index.js @@ -108,6 +108,9 @@ const Rings = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SameNeighbors/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SameNeighbors/index.js index 99a7a842d..85e1e933f 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SameNeighbors/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SameNeighbors/index.js @@ -107,6 +107,9 @@ const SameNeighbors = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SameNeighborsBatch/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SameNeighborsBatch/index.js index b9dd4bb7c..2a2ee9d22 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SameNeighborsBatch/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SameNeighborsBatch/index.js @@ -107,6 +107,9 @@ const SameNeighborsBatch = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/ShortestPath/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/ShortestPath/index.js index 41a2c8019..d5a0a78fe 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/ShortestPath/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/ShortestPath/index.js @@ -108,6 +108,9 @@ const ShortestPath = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SingleSourceShortestPath/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SingleSourceShortestPath/index.js index 8d64dcecb..715d1f193 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SingleSourceShortestPath/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/SingleSourceShortestPath/index.js @@ -113,6 +113,9 @@ const SingleSourceShortestPath = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/TemplatePaths/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/TemplatePaths/Home/index.js index adf3ecf4f..d19790525 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/TemplatePaths/Home/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/TemplatePaths/Home/index.js @@ -129,6 +129,9 @@ const TemplatePaths = props => { return ( } diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/algorithm-dom-props.test.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/algorithm-dom-props.test.js index 2ba3bcdc6..0edf395ad 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/algorithm-dom-props.test.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/algorithm-dom-props.test.js @@ -37,3 +37,18 @@ test('algorithm component props are not forwarded to Collapse panel DOM', () => expect(offenders).toEqual([]); }); + +test('algorithm panels forward only the collapse control contract', () => { + const offenders = collectJavaScript(__dirname).flatMap(file => { + const source = fs.readFileSync(file, 'utf8'); + if (!source.includes(' Date: Sun, 12 Jul 2026 09:11:18 +0800 Subject: [PATCH 57/68] fix(hubble): preserve exported graph ids - serialize large graph ids as exact decimal strings - remove the JSON blob BOM and verify parse round trips - expose export actions through keyboard-operable menu items --- .../src/customHook/useDownloadJson.js | 10 ++++-- .../src/customHook/useDownloadJson.test.js | 31 +++++++++++++++- .../src/modules/component/ExportData/index.js | 29 ++++++++------- .../component/ExportData/index.test.js | 35 +++++++++++++++++++ 4 files changed, 90 insertions(+), 15 deletions(-) create mode 100644 hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.test.js diff --git a/hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.js b/hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.js index 92c4ac946..679f1fb5c 100644 --- a/hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.js +++ b/hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.js @@ -20,6 +20,11 @@ * @file 下载Json数据 */ +const serializeDownloadJson = data => JSON.stringify( + data, + (key, value) => (typeof value === 'bigint' ? value.toString() : value) +); + const useDownloadJson = () => { const downloadJsonHandler = (fileName, data) => { @@ -30,8 +35,8 @@ const useDownloadJson = () => { .join(''); const formatedFileName = `${sanitizedFileName || 'graph-data'}.json`; const element = document.createElement('a'); - const processedData = JSON.stringify(data); - const blob = new Blob([`\ufeff${processedData}`], { + const processedData = serializeDownloadJson(data); + const blob = new Blob([processedData], { type: 'application/json;charset=utf-8', }); const objectUrl = URL.createObjectURL(blob); @@ -47,4 +52,5 @@ const useDownloadJson = () => { return {downloadJsonHandler}; }; +export {serializeDownloadJson}; export default useDownloadJson; diff --git a/hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.test.js b/hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.test.js index 3e63cf489..32bbb49e7 100644 --- a/hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.test.js +++ b/hugegraph-hubble/hubble-fe/src/customHook/useDownloadJson.test.js @@ -16,7 +16,15 @@ * under the License. */ -import useDownloadJson from './useDownloadJson'; +import useDownloadJson, {serializeDownloadJson} from './useDownloadJson'; +import JSONbig from 'json-bigint'; + +const readBlob = blob => new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => resolve(reader.result); + reader.onerror = () => reject(reader.error); + reader.readAsText(blob); +}); describe('useDownloadJson', () => { let createObjectURL; @@ -49,4 +57,25 @@ describe('useDownloadJson', () => { expect(anchor.click).toHaveBeenCalledTimes(1); expect(revokeObjectURL).toHaveBeenCalledWith('blob:export-json'); }); + + it('serializes native and parsed large ids without precision loss', () => { + const parsedId = JSONbig.parse('{"id":9007199254740993}').id; + + expect(serializeDownloadJson({native: 9007199254740993n, parsedId})) + .toBe('{"native":"9007199254740993","parsedId":"9007199254740993"}'); + }); + + it('downloads standard JSON that round-trips large ids from the actual blob', async () => { + const parsedId = JSONbig.parse('{"id":9007199254740993}').id; + const {downloadJsonHandler} = useDownloadJson(); + + downloadJsonHandler('large-ids', {native: 9007199254740993n, parsedId}); + + const blob = createObjectURL.mock.calls[0][0]; + const downloaded = JSON.parse(await readBlob(blob)); + expect(downloaded).toEqual({ + native: '9007199254740993', + parsedId: '9007199254740993', + }); + }); }); diff --git a/hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.js b/hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.js index 69aca1a5d..7c057ca2e 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.js @@ -25,6 +25,21 @@ import {useTranslation} from 'react-i18next'; import {Button, Tooltip, Dropdown, Modal, Form, Input} from 'antd'; import {DownloadOutlined} from '@ant-design/icons'; +const createExportMenu = (t, handleClickExportJson, handleClickExportPng) => ({ + items: [ + { + key: '1', + label: t('analysis.canvas.export_json'), + onClick: handleClickExportJson, + }, + { + key: '2', + label: t('analysis.canvas.export_png'), + onClick: handleClickExportPng, + }, + ], +}); + const ExportData = props => { const {t} = useTranslation(); const { @@ -105,18 +120,7 @@ const ExportData = props => { [exportJsonForm, onExportJsonChange] ); - const exportMenu = { - items: [ - { - key: '1', - label: ({t('analysis.canvas.export_json')}), - }, - { - key: '2', - label: ({t('analysis.canvas.export_png')}), - }, - ], - }; + const exportMenu = createExportMenu(t, handleClickExportJson, handleClickExportPng); return ( <> @@ -169,4 +173,5 @@ const ExportData = props => { ); }; +export {createExportMenu}; export default ExportData; diff --git a/hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.test.js b/hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.test.js new file mode 100644 index 000000000..eb4fe44d7 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.test.js @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {createExportMenu} from './index'; + +it('uses keyboard-operable menu actions instead of click-only anchors', () => { + const exportJson = jest.fn(); + const exportPng = jest.fn(); + const menu = createExportMenu(key => key, exportJson, exportPng); + + expect(menu.items.map(item => item.label)).toEqual([ + 'analysis.canvas.export_json', + 'analysis.canvas.export_png', + ]); + expect(menu.items.every(item => typeof item.onClick === 'function')).toBe(true); + + menu.items[0].onClick(); + menu.items[1].onClick(); + expect(exportJson).toHaveBeenCalledTimes(1); + expect(exportPng).toHaveBeenCalledTimes(1); +}); From 4efe9192578e487840c38786bab4ebde36d802e5 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 09:21:09 +0800 Subject: [PATCH 58/68] fix(hubble): open export menu on click - make the export button open its dropdown on click - preserve Ant Design keyboard-enabled menu item actions - verify the explicit trigger contract with targeted tests --- .../src/modules/component/ExportData/index.js | 11 +++++++++-- .../src/modules/component/ExportData/index.test.js | 6 +++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.js b/hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.js index 7c057ca2e..0b8e91437 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/component/ExportData/index.js @@ -25,6 +25,8 @@ import {useTranslation} from 'react-i18next'; import {Button, Tooltip, Dropdown, Modal, Form, Input} from 'antd'; import {DownloadOutlined} from '@ant-design/icons'; +const EXPORT_MENU_TRIGGER = ['click']; + const createExportMenu = (t, handleClickExportJson, handleClickExportPng) => ({ items: [ { @@ -124,7 +126,12 @@ const ExportData = props => { return ( <> - + + )} + /> + )} + {graphspaceError && ( + + {t('task.edit.retry_graphspaces')} + + )} + /> + )} + {graphError && ( + + {t('task.edit.retry_graphs')} + + )} + /> + )} { const [inputData, setInputData] = useState(''); const [status, setStatus] = useState(''); const [transferStatus, setTransferStatus] = useState(''); + const [loadError, setLoadError] = useState(false); + const [retry, setRetry] = useState(0); const [fieldForm] = Form.useForm(); const setSourceData = useCallback(data => { @@ -148,26 +160,51 @@ const FieldForm = ({visible, prev, datasourceID}) => { }, [addField, handleInputData, inputData, status, t]); const renderField = useCallback(item => item.key, []); + const retryFields = useCallback(() => setRetry(value => value + 1), []); useEffect(() => { if (!datasourceID) { return; } + let active = true; + setSourceData([]); + setTargetKeys([]); + fieldForm.setFieldValue('target_keys', []); + setLoadError(false); api.manage.getDatasourceSchema(datasourceID).then(res => { + if (!active) { + return; + } if (res.status === 200) { setSourceData(res.data.map(item => ({key: item}))); return; } - message.error(res.message); - }); - }, [datasourceID, setSourceData]); + setLoadError(true); + }).catch(() => active && setLoadError(true)); + + return () => { + active = false; + }; + }, [datasourceID, fieldForm, retry, setSourceData]); return (
{t('task.edit.step_source_fields')} + {loadError && ( + + {t('task.edit.retry_fields')} + + )} + /> + )} ({ + manage: { + getDatasourceList: jest.fn(), + getGraphList: jest.fn(), + getGraphSpaceList: jest.fn(), + getTaskList: jest.fn(), + getDatasourceSchema: jest.fn(), + }, +})); + +jest.mock('../../utils/config', () => ({isPdEnabled: jest.fn()})); +jest.mock('../../utils/rules', () => ({ + required: () => ({}), + isNoramlName: () => ({}), +})); + +jest.mock('react-i18next', () => ({ + useTranslation: () => ({t: key => ({ + 'task.edit.load_datasources_failed': 'Could not load data sources.', + 'task.edit.retry_datasources': 'Retry data sources', + 'task.edit.load_fields_failed': 'Could not load source fields.', + 'task.edit.retry_fields': 'Retry source fields', + })[key] || key}), +})); + +beforeAll(() => { + window.matchMedia = window.matchMedia || (() => ({ + matches: false, + addListener: jest.fn(), + removeListener: jest.fn(), + })); +}); + +beforeEach(() => { + jest.clearAllMocks(); + isPdEnabled.mockReturnValue(false); + api.manage.getGraphList.mockResolvedValue({status: 200, data: {records: []}}); + api.manage.getTaskList.mockResolvedValue({status: 200, data: {total: 0}}); +}); + +const deferred = () => { + let resolve; + const promise = new Promise(done => { + resolve = done; + }); + return {promise, resolve}; +}; + +it('keeps a data-source option failure visible and retries in place', async () => { + api.manage.getDatasourceList + .mockRejectedValueOnce(new Error('offline')) + .mockResolvedValueOnce({ + status: 200, + data: {records: [{datasource_id: '9', datasource_name: 'fixture.csv'}]}, + }); + + render( + + + + ); + + expect(await screen.findByText('Could not load data sources.')) + .toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', {name: 'Retry data sources'})); + + await waitFor(() => expect(api.manage.getDatasourceList).toHaveBeenCalledTimes(2)); + await waitFor(() => expect(screen.queryByText('Could not load data sources.')) + .not.toBeInTheDocument()); +}); + +it('turns a duplicate-name request rejection into a stable form error', async () => { + api.manage.getDatasourceList.mockResolvedValue({status: 200, data: {records: []}}); + api.manage.getTaskList.mockRejectedValue(new Error('raw transport detail')); + render( + + + + ); + + const name = screen.getByPlaceholderText('task.edit.name_placeholder'); + fireEvent.change(name, {target: {value: 'fixture_task'}}); + fireEvent.blur(name); + expect(await screen.findByText('task.edit.duplicate_check_failed')) + .toBeInTheDocument(); + expect(screen.queryByText('raw transport detail')).not.toBeInTheDocument(); +}); + +it('clears stale fields and retries the selected data source schema', async () => { + api.manage.getDatasourceSchema + .mockRejectedValueOnce(new Error('offline')) + .mockResolvedValueOnce({status: 200, data: ['id', 'name']}); + + render( + + ); + + expect(await screen.findByText('Could not load source fields.')) + .toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', {name: 'Retry source fields'})); + + await waitFor(() => expect(api.manage.getDatasourceSchema).toHaveBeenCalledTimes(2)); + expect(await screen.findByText('id')).toBeInTheDocument(); + expect(screen.getByText('name')).toBeInTheDocument(); + expect(screen.queryByText('Could not load source fields.')).not.toBeInTheDocument(); +}); + +it('does not submit fields selected for a previous data source', async () => { + const pendingB = deferred(); + api.manage.getDatasourceSchema.mockImplementation(id => { + if (id === 'A') { + return Promise.resolve({status: 200, data: ['old_field']}); + } + return pendingB.promise; + }); + const onFormFinish = jest.fn(); + const {rerender} = render( + + + + ); + + expect(await screen.findByText('old_field')).toBeInTheDocument(); + fireEvent.click(screen.getByRole('checkbox')); + const moveButton = screen.getAllByRole('button') + .find(button => button.querySelector('[aria-label="right"]')); + fireEvent.click(moveButton); + expect(await screen.findAllByText('old_field')).toHaveLength(2); + + rerender( + + + + ); + fireEvent.click(screen.getByRole('button', {name: 'common.action.next'})); + await waitFor(() => expect(onFormFinish).not.toHaveBeenCalled()); + await act(async () => { + pendingB.resolve({status: 200, data: ['new_field']}); + await pendingB.promise; + }); +}); + +it('recovers PD graph-space and graph option failures without stale overwrite', async () => { + isPdEnabled.mockReturnValue(true); + api.manage.getDatasourceList.mockResolvedValue({status: 200, data: {records: []}}); + api.manage.getGraphSpaceList + .mockResolvedValueOnce({status: 503}) + .mockResolvedValueOnce({ + status: 200, + data: {records: [{name: 'SPACE_A'}, {name: 'SPACE_B'}]}, + }); + api.manage.getGraphList + .mockResolvedValueOnce({status: 503}) + .mockResolvedValueOnce({status: 200, data: {records: []}}); + + render( + + + + ); + expect(await screen.findByText('task.edit.load_graphspaces_failed')) + .toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', {name: 'task.edit.retry_graphspaces'})); + await waitFor(() => expect(api.manage.getGraphSpaceList).toHaveBeenCalledTimes(2)); + + const graphspaceSelect = screen.getAllByRole('combobox')[1]; + fireEvent.mouseDown(graphspaceSelect); + fireEvent.click(await screen.findByText('SPACE_A', { + selector: '.ant-select-item-option-content', + })); + await waitFor(() => expect(api.manage.getGraphList).toHaveBeenCalledWith( + 'SPACE_A', + {page_size: -1} + )); + expect(await screen.findByText('task.edit.load_graphs_failed')).toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', {name: 'task.edit.retry_graphs'})); + await waitFor(() => expect(api.manage.getGraphList).toHaveBeenCalledTimes(2)); +}); + +it('ignores a late graph response after the graph-space selection changes', async () => { + isPdEnabled.mockReturnValue(true); + const lateA = deferred(); + api.manage.getDatasourceList.mockResolvedValue({status: 200, data: {records: []}}); + api.manage.getGraphSpaceList.mockResolvedValue({ + status: 200, + data: {records: [{name: 'SPACE_A'}, {name: 'SPACE_B'}]}, + }); + api.manage.getGraphList.mockImplementation(space => { + if (space === 'SPACE_A') { + return lateA.promise; + } + return Promise.resolve({ + status: 200, + data: {records: [{name: 'graph_b', nickname: 'Graph B'}]}, + }); + }); + + render( + + + + ); + await waitFor(() => expect(api.manage.getGraphSpaceList).toHaveBeenCalledTimes(1)); + const graphspaceSelect = screen.getAllByRole('combobox')[1]; + fireEvent.mouseDown(graphspaceSelect); + fireEvent.click(await screen.findByText('SPACE_A', { + selector: '.ant-select-item-option-content', + })); + fireEvent.mouseDown(graphspaceSelect); + fireEvent.click(await screen.findByText('SPACE_B', { + selector: '.ant-select-item-option-content', + })); + + const graphSelect = screen.getAllByRole('combobox')[2]; + fireEvent.mouseDown(graphSelect); + expect(await screen.findByRole('option', {name: 'Graph B'})).toBeInTheDocument(); + await act(async () => { + lateA.resolve({ + status: 200, + data: {records: [{name: 'graph_a', nickname: 'Graph A'}]}, + }); + await lateA.promise; + }); + expect(screen.getByRole('option', {name: 'Graph B'})).toBeInTheDocument(); + expect(screen.queryByRole('option', {name: 'Graph A'})).not.toBeInTheDocument(); +}); From b6756194c8d33ee3c52b157a13041e2e5b09e325 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 10:54:00 +0800 Subject: [PATCH 60/68] fix(hubble): align graph mutation contracts - scope clear copy and symbols to graph data - gate incompatible clone actions with accessible reasons - preserve destructive confirmation and refresh behavior - lock API and action contracts with regression tests --- .../controller/graphs/GraphsController.java | 2 - .../service/graphs/GraphsService.java | 2 - .../hubble-fe/src/api/manage-contract.test.js | 6 +- hugegraph-hubble/hubble-fe/src/api/manage.js | 6 +- .../i18n/resources/en-US/modules/pages.json | 5 +- .../i18n/resources/zh-CN/modules/pages.json | 5 +- .../src/pages/Graph/ClearGraphConfirmModal.js | 2 +- .../Graph/ClearGraphConfirmModal.test.js | 16 ++--- .../pages/Graph/default-card-actions.test.js | 35 +++++++---- .../pages/Graph/graph-default-replace.test.js | 8 +++ .../hubble-fe/src/pages/Graph/index.js | 58 +++++++++---------- 11 files changed, 82 insertions(+), 63 deletions(-) diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graphs/GraphsController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graphs/GraphsController.java index 27dee210a..f61936a2a 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graphs/GraphsController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/graphs/GraphsController.java @@ -284,8 +284,6 @@ public void delete(@PathVariable("graphspace") String graphspace, @PostMapping("{graph}/clear") public void clearGraph(@PathVariable("graphspace") String graphspace, @PathVariable("graph") String graph) { - // TODO: Add a separate data-only endpoint as soon as Server provides a - // verified clear operation that preserves schema. this.graphsService.clearGraph(this.authClient(graphspace, graph), graph); } diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graphs/GraphsService.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graphs/GraphsService.java index 3e9b6a10c..e17146804 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graphs/GraphsService.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/graphs/GraphsService.java @@ -281,8 +281,6 @@ public void update(HugeClient client, String nickname, } public void clearGraph(HugeClient client, String graph) { - // TODO: Add data-only clearing as soon as Server provides a verified - // operation that preserves schema. This operation clears both. GraphsManager graphs = client.graphs(); Map response = graphs.getDefault(); Set defaults = defaultGraphs(response.get("default_graph")); diff --git a/hugegraph-hubble/hubble-fe/src/api/manage-contract.test.js b/hugegraph-hubble/hubble-fe/src/api/manage-contract.test.js index 70982c6cd..70c4a33a0 100644 --- a/hugegraph-hubble/hubble-fe/src/api/manage-contract.test.js +++ b/hugegraph-hubble/hubble-fe/src/api/manage-contract.test.js @@ -38,14 +38,14 @@ test('updates a graph with PUT JSON on the canonical route', () => { ); }); -test('clears graph data and schema with POST on the canonical route', () => { - manage.clearGraphDataAndSchema('DEFAULT', 'g'); +test('clears graph data with POST on the canonical route', () => { + manage.clearGraphData('DEFAULT', 'g'); expect(request.post).toHaveBeenCalledWith( '/graphspaces/DEFAULT/graphs/g/clear' ); expect(request.get).not.toHaveBeenCalled(); - expect(manage.clearGraphData).toBeUndefined(); + expect(manage.clearGraphDataAndSchema).toBeUndefined(); }); test('reads the default graph from the canonical route', () => { diff --git a/hugegraph-hubble/hubble-fe/src/api/manage.js b/hugegraph-hubble/hubble-fe/src/api/manage.js index 9c553aa6d..863c97480 100644 --- a/hugegraph-hubble/hubble-fe/src/api/manage.js +++ b/hugegraph-hubble/hubble-fe/src/api/manage.js @@ -116,9 +116,7 @@ const getDefaultGraph = (graphspace, config) => { return config ? request.get(path, config) : request.get(path); }; -const clearGraphDataAndSchema = (graphspace, graph) => { - // TODO: Add a distinct data-only action as soon as Server provides a - // verified API that preserves schema; this endpoint intentionally clears both. +const clearGraphData = (graphspace, graph) => { return request.post(`/graphspaces/${graphspace}/graphs/${graph}/clear`); }; @@ -135,7 +133,7 @@ const cloneGraph = (graphspace, graph, params) => { }; export {getGraphList, getGraph, addGraph, updateGraph, delGraph, getDefaultGraph, - getGraphView, setDefaultGraph, clearGraphDataAndSchema, + getGraphView, setDefaultGraph, clearGraphData, getGraphStatistic, updateGraphStatistic, cloneGraph}; // meta property diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json index 7f295bd04..856bbea08 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json @@ -174,7 +174,7 @@ "title": "Confirm graph clear", "graphspace": "GraphSpace: {{graphspace}}", "graph": "Graph: {{graph}}", - "scope_schema_data": "Deletion scope: graph data, property keys, vertex labels, edge labels, and indexes", + "scope_data": "Deletion scope: graph data. Back up schema before clearing.", "irreversible": "This operation is irreversible.", "input_label": "Enter the graph name to confirm", "input_placeholder": "Graph name", @@ -193,7 +193,7 @@ "menu": { "enter_analysis": "Open Graph Studio", "meta_config": "Metadata Config", - "clear_schema_data": "Clear Schema & Data", + "clear_data": "Clear Data", "set_default": "Set Default", "view_schema": "View Schema", "clone": "Clone Graph" @@ -213,6 +213,7 @@ "description_placeholder": "Graph description (optional)" }, "clone": { + "unavailable": "Clone is unavailable because the connected Server does not expose a compatible clone API.", "title": "Clone Graph", "success": "Graph cloned", "name": "Cloned Graph ID", diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json index 504315cb4..18bc63071 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json @@ -174,7 +174,7 @@ "title": "确认清空图", "graphspace": "GraphSpace:{{graphspace}}", "graph": "图:{{graph}}", - "scope_schema_data": "删除范围:图数据、属性键、顶点类型、边类型和索引", + "scope_data": "删除范围:图数据。清空前请先备份 Schema。", "irreversible": "此操作不可恢复。", "input_label": "输入图名以确认", "input_placeholder": "图名", @@ -193,7 +193,7 @@ "menu": { "enter_analysis": "进入图分析平台", "meta_config": "元数据配置", - "clear_schema_data": "清空schema+数据", + "clear_data": "清空数据", "set_default": "设为默认", "view_schema": "查看schema", "clone": "克隆图" @@ -213,6 +213,7 @@ "description_placeholder": "图描述,可选" }, "clone": { + "unavailable": "当前连接的 Server 未提供兼容的克隆 API,因此暂不可用。", "title": "克隆图", "success": "克隆成功", "name": "克隆图ID", diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.js index 82a5513fc..60406a721 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.js @@ -129,7 +129,7 @@ const ClearGraphConfirmModal = ({ {error && } diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.test.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.test.js index f2530319c..f9a045da3 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.test.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/ClearGraphConfirmModal.test.js @@ -27,7 +27,7 @@ const mockMessages = { 'graph.clear_confirm.title': mockClearMessages.title, 'graph.clear_confirm.graphspace': mockClearMessages.graphspace, 'graph.clear_confirm.graph': mockClearMessages.graph, - 'graph.clear_confirm.scope_schema_data': mockClearMessages.scope_schema_data, + 'graph.clear_confirm.scope_data': mockClearMessages.scope_data, 'graph.clear_confirm.irreversible': mockClearMessages.irreversible, 'graph.clear_confirm.input_label': mockClearMessages.input_label, 'graph.clear_confirm.input_placeholder': mockClearMessages.input_placeholder, @@ -85,13 +85,13 @@ const createDeferred = () => { return {promise, resolve, reject}; }; -test('requires exact graph-name confirmation for schema-and-data clear', async () => { +test('requires exact graph-name confirmation for data clear', async () => { renderModal(); expect(screen.getByText('GraphSpace: DEFAULT')).toBeInTheDocument(); expect(screen.getByText('Graph: hugegraph')).toBeInTheDocument(); expect(screen.getByText( - 'Deletion scope: graph data, property keys, vertex labels, edge labels, and indexes' + 'Deletion scope: graph data. Back up schema before clearing.' )).toBeInTheDocument(); expect(screen.getByText('This operation is irreversible.')).toBeInTheDocument(); @@ -107,12 +107,12 @@ test('requires exact graph-name confirmation for schema-and-data clear', async ( expect(confirm).toBeEnabled(); }); -test('provides explicit schema-and-data scope in both locales', () => { - expect(enPages.graph.clear_confirm.scope_schema_data).toBe( - 'Deletion scope: graph data, property keys, vertex labels, edge labels, and indexes' +test('states the observed data-clear scope without overclaiming schema behavior', () => { + expect(enPages.graph.clear_confirm.scope_data).toBe( + 'Deletion scope: graph data. Back up schema before clearing.' ); - expect(zhPages.graph.clear_confirm.scope_schema_data).toBe( - '删除范围:图数据、属性键、顶点类型、边类型和索引' + expect(zhPages.graph.clear_confirm.scope_data).toBe( + '删除范围:图数据。清空前请先备份 Schema。' ); }); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/default-card-actions.test.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/default-card-actions.test.js index 58a6fbab7..adc043f63 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/default-card-actions.test.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/default-card-actions.test.js @@ -16,7 +16,7 @@ * under the License. */ -import {fireEvent, render, screen, waitFor} from '@testing-library/react'; +import {fireEvent, render, screen, waitFor, within} from '@testing-library/react'; import Graph from './index'; import * as api from '../../api'; @@ -39,7 +39,7 @@ jest.mock('../../api', () => ({ manage: { getGraphSpace: jest.fn(), getGraphList: jest.fn(), - clearGraphDataAndSchema: jest.fn(), + clearGraphData: jest.fn(), }, })); @@ -51,7 +51,11 @@ jest.mock('./EditLayer', () => ({ jest.mock('./Card', () => ({menus}) => (
- {menus.map(item =>
{item.label}
)} + {menus.map(item => ( +
+ {item.label} +
+ ))}
)); @@ -104,7 +108,7 @@ test('disables every clear action for the default graph card', async () => { render(); const menu = await screen.findByTestId('graph-card-menu'); - const clearSchemaData = screen.getByText('graph.menu.clear_schema_data'); + const clearSchemaData = screen.getByText('graph.menu.clear_data'); const setDefault = screen.getByText('graph.menu.set_default'); expect(menu).toContainElement(clearSchemaData); @@ -116,10 +120,10 @@ test('disables every clear action for the default graph card', async () => { await waitFor(() => { expect(screen.queryByTestId('clear-confirm-modal')).not.toBeInTheDocument(); }); - expect(api.manage.clearGraphDataAndSchema).not.toHaveBeenCalled(); + expect(api.manage.clearGraphData).not.toHaveBeenCalled(); }); -test('offers one schema-and-data clear action and calls its canonical API', async () => { +test('offers one data clear action and calls its canonical API', async () => { api.manage.getGraphList.mockResolvedValue({ status: 200, data: { @@ -132,18 +136,29 @@ test('offers one schema-and-data clear action and calls its canonical API', asyn total: 1, }, }); - api.manage.clearGraphDataAndSchema.mockResolvedValue({status: 200}); + api.manage.clearGraphData.mockResolvedValue({status: 200}); render(); const menu = await screen.findByTestId('graph-card-menu'); - const clearActions = screen.getAllByText('graph.menu.clear_schema_data'); + const clearActions = screen.getAllByText('graph.menu.clear_data'); expect(menu).toContainElement(clearActions[0]); expect(clearActions).toHaveLength(1); - expect(screen.queryByText('graph.menu.clear_data')).not.toBeInTheDocument(); fireEvent.click(clearActions[0]); fireEvent.click(await screen.findByTestId('clear-confirm-modal')); - await waitFor(() => expect(api.manage.clearGraphDataAndSchema) + await waitFor(() => expect(api.manage.clearGraphData) .toHaveBeenCalledWith('space', 'graph-a')); }); + +test('shows clone as unavailable instead of exposing a failing action', async () => { + render(); + + const menu = await screen.findByTestId('graph-card-menu'); + const cloneItem = within(menu).getByRole('menuitem', { + name: /graph.menu.clone: graph.clone.unavailable/, + }); + const clone = within(cloneItem).getByText('graph.menu.clone'); + expect(cloneItem).toHaveAttribute('aria-disabled', 'true'); + expect(clone.closest('a')).toBeNull(); +}); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/graph-default-replace.test.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/graph-default-replace.test.js index 9b1ebc06f..7fbf36cc3 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/graph-default-replace.test.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/graph-default-replace.test.js @@ -30,3 +30,11 @@ test('default graph flow handles arrays and owns one actionable error', () => { expect(defaultFlow).toContain('suppressBusinessErrorToast: true'); expect(defaultFlow).not.toContain('message.error(res.message)'); }); + +test('does not retain the obsolete schema-clear contract', () => { + const source = fs.readFileSync(path.join(__dirname, 'index.js'), 'utf8'); + + expect(source).toContain('const clearData ='); + expect(source).not.toContain('clearSchema'); + expect(source).not.toContain('clearGraphDataAndSchema'); +}); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js index 8f63a39c3..a8153545d 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js @@ -32,10 +32,11 @@ import { Pagination, Spin, Alert, + Tooltip, } from 'antd'; import {useState, useEffect, useCallback} from 'react'; import {useTranslation} from 'react-i18next'; -import {EditLayer, ViewLayer, CloneLayer} from './EditLayer'; +import {EditLayer, ViewLayer} from './EditLayer'; import {PlusOutlined} from '@ant-design/icons'; import {Link, useParams, useNavigate} from 'react-router-dom'; import style from './index.module.scss'; @@ -58,7 +59,6 @@ const Graph = () => { const [graphspaceInfo, setGraphspaceInfo] = useState({}); const [editLayer, setEditLayer] = useState(false); const [viewLayer, setViewLayer] = useState(false); - const [cloneLayer, setCloneLayer] = useState(false); const [selectGraph, setSelectGraph] = useState(''); const [listType, setListType] = useState('image'); const [refresh, setRefresh] = useState(false); @@ -100,9 +100,7 @@ const Graph = () => { setEditLayer(true); }; - const clearSchema = graph => { - // TODO: Restore a separate data-only action as soon as Server provides - // a verified API that preserves schema. + const clearData = graph => { setClearSelection({graph}); }; @@ -117,7 +115,7 @@ const Graph = () => { }, []); const handleClearConfirm = useCallback(() => { - return api.manage.clearGraphDataAndSchema(graphspace, clearSelection.graph); + return api.manage.clearGraphData(graphspace, clearSelection.graph); }, [clearSelection, graphspace]); const showSchema = graph => { @@ -218,16 +216,6 @@ const Graph = () => { navigate(`/gremlin/${item.graphspace || 'DEFAULT'}/${item.name}`); }, [navigate]); - const showClone = graph => { - setSelectGraph(graph); - setCloneLayer(true); - }; - - const handleHideCloneLayer = useCallback(() => { - setSelectGraph(''); - setCloneLayer(false); - }, []); - const columns = [ { title: t('graph.col.name'), @@ -277,8 +265,8 @@ const Graph = () => { {t('graph.menu.meta_config')} {(row.default) - ? {t('graph.menu.clear_schema_data')} - : clearSchema(row.name)}>{t('graph.menu.clear_schema_data')}} + ? {t('graph.menu.clear_data')} + : clearData(row.name)}>{t('graph.menu.clear_data')}} {(row.graphspace === 'neizhianli') ? {t('common.action.delete')} : deleteGraph(row.name)}>{t('common.action.delete')}} @@ -292,7 +280,17 @@ const Graph = () => { : handleSetDefault(row.name)}>{t('graph.menu.set_default')} )} {graphCreateEnabled && ( - showClone(row.name)}>{t('graph.menu.clone')} + + + {t('graph.menu.clone')} + + )} ); @@ -312,8 +310,8 @@ const Graph = () => { { key: '2', label: item.default - ? {t('graph.menu.clear_schema_data')} - : clearSchema(item.name)}>{t('graph.menu.clear_schema_data')}, + ? {t('graph.menu.clear_data')} + : clearData(item.name)}>{t('graph.menu.clear_data')}, }, graphDefaultMutationEnabled && { key: '4', @@ -339,7 +337,16 @@ const Graph = () => { }, graphCreateEnabled && { key: '8', - label: showClone(item.name)}>{t('graph.menu.clone')}, + disabled: true, + label: ( + + + {t('graph.menu.clone')} + + + ), }, ].filter(Boolean); @@ -501,13 +508,6 @@ const Graph = () => { graph={selectGraph} graphspace={graphspace} /> - Date: Sun, 12 Jul 2026 12:37:17 +0800 Subject: [PATCH 61/68] fix(hubble): restore schema export compatibility - rebuild Groovy from structured Schema responses - preserve nested userdata and quoted separators - keep legacy Server output unchanged - verify real PD export and replay - add compatibility regression coverage --- .../controller/schema/SchemaController.java | 25 +- .../schema/GroovySchemaCompatibility.java | 328 ++++++++++++++++++ .../unit/GroovySchemaCompatibilityTest.java | 120 +++++++ .../apache/hugegraph/unit/UnitTestSuite.java | 1 + 4 files changed, 464 insertions(+), 10 deletions(-) create mode 100644 hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/GroovySchemaCompatibility.java create mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/GroovySchemaCompatibilityTest.java diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/SchemaController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/SchemaController.java index a78326eaf..58009368b 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/SchemaController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/schema/SchemaController.java @@ -34,6 +34,7 @@ import org.apache.hugegraph.exception.ExternalException; import org.apache.hugegraph.exception.HugeException; import org.apache.hugegraph.service.schema.SchemaService; +import org.apache.hugegraph.service.schema.GroovySchemaCompatibility; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableMap; @@ -82,7 +83,8 @@ public class SchemaController extends BaseController { public Object schemaGroovy(@PathVariable("graphspace") String graphSpace, @PathVariable("graph") String graph) { HugeClient client = this.authClient(graphSpace, graph); - return ImmutableMap.of("schema", client.schema().getGroovySchema()); + return ImmutableMap.of("schema", + GroovySchemaCompatibility.export(client.schema())); } @PostMapping("groovy") @@ -103,15 +105,18 @@ public Object addSchemaGroovy(@PathVariable("graphspace") String graphSpace, } private void checkSchemaGroovy(String content) { - String[] lines = content.split("\n|;"); - for (String line : lines) { - if (StringUtils.isEmpty(line)) { - continue; - } - if (!line.startsWith("graph.schema()")) { + List statements; + try { + statements = GroovySchemaCompatibility.splitStatements(content); + } catch (IllegalArgumentException e) { + throw new ExternalException( + "Schema Groovy contains an unterminated string"); + } + for (String statement : statements) { + if (!statement.startsWith("graph.schema()")) { throw new ExternalException( - "Schema Groovy each row must start with 'graph.schema" + - "().'"); + "Schema Groovy each row must start with 'graph" + + ".schema().'"); } } } @@ -121,7 +126,7 @@ public void schemaGroovyExport(@PathVariable("graphspace") String graphSpace, @PathVariable("graph") String graph, HttpServletResponse response) { HugeClient client = this.authClient(graphSpace, graph); - String schema = client.schema().getGroovySchema(); + String schema = GroovySchemaCompatibility.export(client.schema()); response.setCharacterEncoding("UTF-8"); response.setContentType("application/octet-stream"); diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/GroovySchemaCompatibility.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/GroovySchemaCompatibility.java new file mode 100644 index 000000000..dfd388d14 --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/service/schema/GroovySchemaCompatibility.java @@ -0,0 +1,328 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +package org.apache.hugegraph.service.schema; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; + +import org.apache.commons.lang3.StringUtils; + +import org.apache.hugegraph.driver.SchemaManager; +import org.apache.hugegraph.structure.SchemaElement; +import org.apache.hugegraph.structure.constant.AggregateType; +import org.apache.hugegraph.structure.constant.Cardinality; +import org.apache.hugegraph.structure.constant.DataType; +import org.apache.hugegraph.structure.constant.Frequency; +import org.apache.hugegraph.structure.constant.HugeType; +import org.apache.hugegraph.structure.constant.IdStrategy; +import org.apache.hugegraph.structure.constant.IndexType; +import org.apache.hugegraph.structure.constant.WriteType; +import org.apache.hugegraph.structure.schema.EdgeLabel; +import org.apache.hugegraph.structure.schema.IndexLabel; +import org.apache.hugegraph.structure.schema.PropertyKey; +import org.apache.hugegraph.structure.schema.SchemaLabel; +import org.apache.hugegraph.structure.schema.VertexLabel; + +/** + * Keeps Hubble Schema export compatible with Servers which return structured + * Schema JSON for the historical {@code format=groovy} request. + */ +public final class GroovySchemaCompatibility { + + private static final String PREFIX = "graph.schema()"; + + private GroovySchemaCompatibility() { + } + + public static String export(SchemaManager schema) { + String legacy = schema.getGroovySchema(); + if (StringUtils.isNotEmpty(legacy)) { + return legacy; + } + + StringBuilder result = new StringBuilder(); + schema.getPropertyKeys().stream().sorted(GroovySchemaCompatibility::byName) + .forEach(value -> append(result, property(value))); + schema.getVertexLabels().stream().sorted(GroovySchemaCompatibility::byName) + .forEach(value -> append(result, vertex(value))); + schema.getEdgeLabels().stream().sorted(GroovySchemaCompatibility::byName) + .forEach(value -> append(result, edge(value))); + schema.getIndexLabels().stream().sorted(GroovySchemaCompatibility::byName) + .forEach(value -> append(result, index(value))); + return result.toString(); + } + + private static void append(StringBuilder result, String line) { + if (result.length() > 0) { + result.append('\n'); + } + result.append(line); + } + + private static String property(PropertyKey value) { + StringBuilder line = builder("propertyKey", value.name()); + line.append(dataType(value.dataType())); + if (value.cardinality() == Cardinality.LIST) { + line.append(".valueList()"); + } else if (value.cardinality() == Cardinality.SET) { + line.append(".valueSet()"); + } + if (value.aggregateType() != null && + value.aggregateType() != AggregateType.NONE) { + line.append(".calc") + .append(capitalize(value.aggregateType().string())).append("()"); + } + if (value.writeType() != null && value.writeType() != WriteType.OLTP) { + line.append(".writeType(").append(quote(value.writeType().name())) + .append(")"); + } + appendUserdata(line, value); + return finish(line); + } + + private static String vertex(VertexLabel value) { + StringBuilder line = builder("vertexLabel", value.name()); + IdStrategy strategy = value.idStrategy(); + if (strategy == IdStrategy.AUTOMATIC) { + line.append(".useAutomaticId()"); + } else if (strategy == IdStrategy.PRIMARY_KEY) { + line.append(".usePrimaryKeyId()"); + } else if (strategy == IdStrategy.CUSTOMIZE_STRING) { + line.append(".useCustomizeStringId()"); + } else if (strategy == IdStrategy.CUSTOMIZE_NUMBER) { + line.append(".useCustomizeNumberId()"); + } else if (strategy == IdStrategy.CUSTOMIZE_UUID) { + line.append(".useCustomizeUuidId()"); + } + appendStrings(line, "properties", value.properties()); + appendStrings(line, "primaryKeys", value.primaryKeys()); + appendStrings(line, "nullableKeys", value.nullableKeys()); + appendTtl(line, value.ttl(), value.ttlStartTime()); + appendLabelIndex(line, value); + appendUserdata(line, value); + return finish(line); + } + + private static String edge(EdgeLabel value) { + StringBuilder line = builder("edgeLabel", value.name()); + if (value.parent()) { + line.append(".asBase()"); + } else if (value.sub()) { + line.append(".withBase(").append(quote(value.parentLabel())).append(")"); + } else { + if (value.general()) { + line.append(".asGeneral()"); + } + value.links().forEach(link -> link.forEach((source, target) -> + line.append(".link(").append(quote(source)).append(", ") + .append(quote(target)).append(")"))); + } + appendStrings(line, "properties", value.properties()); + appendStrings(line, "sortKeys", value.sortKeys()); + appendStrings(line, "nullableKeys", value.nullableKeys()); + if (value.frequency() == Frequency.SINGLE) { + line.append(".singleTime()"); + } else if (value.frequency() == Frequency.MULTIPLE) { + line.append(".multiTimes()"); + } + appendTtl(line, value.ttl(), value.ttlStartTime()); + appendLabelIndex(line, value); + appendUserdata(line, value); + return finish(line); + } + + private static String index(IndexLabel value) { + StringBuilder line = builder("indexLabel", value.name()); + if (value.baseType() == HugeType.VERTEX_LABEL) { + line.append(".onV(").append(quote(value.baseValue())).append(")"); + } else { + line.append(".onE(").append(quote(value.baseValue())).append(")"); + } + appendStrings(line, "by", value.indexFields()); + IndexType type = value.indexType(); + if (type != null) { + line.append('.').append(type.string()).append("()"); + } + if (!value.rebuild()) { + line.append(".rebuild(false)"); + } + appendUserdata(line, value); + return finish(line); + } + + private static StringBuilder builder(String type, String name) { + return new StringBuilder(PREFIX).append('.').append(type).append('(') + .append(quote(name)).append(')'); + } + + private static String finish(StringBuilder line) { + return line.append(".ifNotExist().create();").toString(); + } + + private static void appendStrings(StringBuilder line, String method, + Collection values) { + if (values == null || values.isEmpty()) { + return; + } + StringJoiner args = new StringJoiner(", "); + values.forEach(value -> args.add(quote(value))); + line.append('.').append(method).append('(').append(args).append(')'); + } + + private static void appendTtl(StringBuilder line, long ttl, + String ttlStartTime) { + if (ttl > 0L) { + line.append(".ttl(").append(ttl).append(')'); + } + if (StringUtils.isNotEmpty(ttlStartTime)) { + line.append(".ttlStartTime(").append(quote(ttlStartTime)).append(')'); + } + } + + private static void appendLabelIndex(StringBuilder line, + SchemaLabel value) { + try { + line.append(".enableLabelIndex(") + .append(value.enableLabelIndex()).append(')'); + } catch (NullPointerException ignored) { + // Older Server responses may omit the nullable option; builder + // default is the only faithful representation in that case. + } + } + + private static void appendUserdata(StringBuilder line, + SchemaElement value) { + value.userdata().entrySet().stream() + .sorted(Map.Entry.comparingByKey()).forEach(entry -> { + line.append(".userdata(").append(quote(entry.getKey())) + .append(", ").append(literal(entry.getValue())).append(')'); + }); + } + + private static String dataType(DataType type) { + if (type == null) { + return ""; + } + switch (type) { + case TEXT: return ".asText()"; + case INT: return ".asInt()"; + case DATE: return ".asDate()"; + case UUID: return ".asUUID()"; + case BOOLEAN: return ".asBoolean()"; + case BYTE: return ".asByte()"; + case BLOB: return ".asBlob()"; + case DOUBLE: return ".asDouble()"; + case FLOAT: return ".asFloat()"; + case LONG: return ".asLong()"; + default: + return ".dataType(org.apache.hugegraph.structure.constant." + + "DataType." + type.name() + ")"; + } + } + + private static String literal(Object value) { + if (value == null) { + return "null"; + } + if (value instanceof Number || value instanceof Boolean) { + return value.toString(); + } + if (value instanceof Collection) { + StringJoiner values = new StringJoiner(", ", "[", "]"); + ((Collection) value).forEach(item -> values.add(literal(item))); + return values.toString(); + } + if (value instanceof Map) { + if (((Map) value).isEmpty()) { + return "[:]"; + } + StringJoiner values = new StringJoiner(", ", "[", "]"); + ((Map) value).forEach((key, item) -> + values.add(quote(String.valueOf(key)) + ": " + + literal(item))); + return values.toString(); + } + if (value.getClass().isArray()) { + StringJoiner values = new StringJoiner(", ", "[", "]"); + for (int index = 0; index < Array.getLength(value); index++) { + values.add(literal(Array.get(value, index))); + } + return values.toString(); + } + if (value instanceof CharSequence || value instanceof Character || + value instanceof Enum) { + return quote(value.toString()); + } + throw new IllegalArgumentException("Unsupported userdata type: " + + value.getClass().getName()); + } + + public static List splitStatements(String content) { + List statements = new ArrayList<>(); + StringBuilder current = new StringBuilder(); + char quote = 0; + boolean escaped = false; + for (int index = 0; index < content.length(); index++) { + char value = content.charAt(index); + if (quote != 0) { + current.append(value); + if (escaped) { + escaped = false; + } else if (value == '\\') { + escaped = true; + } else if (value == quote) { + quote = 0; + } + continue; + } + if (value == '\'' || value == '"') { + quote = value; + current.append(value); + } else if (value == ';' || value == '\n' || value == '\r') { + addStatement(statements, current); + } else { + current.append(value); + } + } + if (quote != 0 || escaped) { + throw new IllegalArgumentException("Unterminated Groovy string"); + } + addStatement(statements, current); + return statements; + } + + private static void addStatement(List statements, + StringBuilder current) { + if (current.length() > 0) { + statements.add(current.toString()); + current.setLength(0); + } + } + + private static String quote(String value) { + if (value == null) { + return "null"; + } + return "'" + value.replace("\\", "\\\\") + .replace("'", "\\'") + .replace("\r", "\\r") + .replace("\n", "\\n") + "'"; + } + + private static String capitalize(String value) { + return Character.toUpperCase(value.charAt(0)) + value.substring(1); + } + + private static int byName(SchemaElement left, SchemaElement right) { + return left.name().compareTo(right.name()); + } +} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/GroovySchemaCompatibilityTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/GroovySchemaCompatibilityTest.java new file mode 100644 index 000000000..cfd882ffd --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/GroovySchemaCompatibilityTest.java @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +package org.apache.hugegraph.unit; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Test; + +import org.apache.hugegraph.driver.SchemaManager; +import org.apache.hugegraph.service.schema.GroovySchemaCompatibility; +import org.apache.hugegraph.structure.schema.EdgeLabel; +import org.apache.hugegraph.structure.schema.IndexLabel; +import org.apache.hugegraph.structure.schema.PropertyKey; +import org.apache.hugegraph.structure.schema.VertexLabel; + +public class GroovySchemaCompatibilityTest { + + @Test + public void shouldPreserveLegacyGroovyResponse() { + SchemaManager schema = mock(SchemaManager.class); + when(schema.getGroovySchema()).thenReturn("legacy"); + + org.junit.Assert.assertEquals("legacy", + GroovySchemaCompatibility.export(schema)); + } + + @Test + public void shouldRebuildGroovyFromStructuredSchema() { + SchemaManager schema = mock(SchemaManager.class); + when(schema.getGroovySchema()).thenReturn(""); + + PropertyKey name = new PropertyKey.BuilderImpl("person's name", schema) + .asText().valueSet().ifNotExist().build(); + Map nested = new LinkedHashMap<>(); + nested.put("regions", Arrays.asList("east;west", "north\\south")); + nested.put("empty", Collections.emptyList()); + nested.put("emptyMap", Collections.emptyMap()); + name.userdata().put("constraints", nested); + name.userdata().put("codes", new int[]{1, 2}); + VertexLabel person = new VertexLabel.BuilderImpl("person", schema) + .usePrimaryKeyId() + .properties("person's name") + .primaryKeys("person's name") + .enableLabelIndex(false).ifNotExist().build(); + EdgeLabel knows = new EdgeLabel.BuilderImpl("knows", schema) + .link("person", "person") + .properties("person's name") + .multiTimes().ifNotExist().build(); + IndexLabel byName = new IndexLabel.BuilderImpl("by_name", schema) + .onV("person").by("person's name") + .secondary().ifNotExist().build(); + when(schema.getPropertyKeys()).thenReturn(Arrays.asList(name)); + when(schema.getVertexLabels()).thenReturn(Arrays.asList(person)); + when(schema.getEdgeLabels()).thenReturn(Arrays.asList(knows)); + when(schema.getIndexLabels()).thenReturn(Arrays.asList(byName)); + + String result = GroovySchemaCompatibility.export(schema); + + assertTrue(result.contains("propertyKey('person\\'s name').asText()")); + assertTrue(result.contains(".valueSet()")); + assertTrue(result.contains(".userdata('codes', [1, 2])")); + assertTrue(result.contains("'regions': ['east;west', " + + "'north\\\\south']")); + assertTrue(result.contains("'empty': []")); + assertTrue(result.contains("'emptyMap': [:]")); + assertTrue(result.contains("vertexLabel('person').usePrimaryKeyId()")); + assertTrue(result.contains(".primaryKeys('person\\'s name')")); + assertTrue(result.contains("edgeLabel('knows').link('person', 'person')")); + assertTrue(result.contains(".multiTimes()")); + assertTrue(result.contains("indexLabel('by_name').onV('person')")); + assertTrue(result.contains(".by('person\\'s name').secondary()")); + } + + @Test + public void shouldReturnEmptyForActuallyEmptyStructuredSchema() { + SchemaManager schema = mock(SchemaManager.class); + when(schema.getGroovySchema()).thenReturn(""); + when(schema.getPropertyKeys()).thenReturn(Collections.emptyList()); + when(schema.getVertexLabels()).thenReturn(Collections.emptyList()); + when(schema.getEdgeLabels()).thenReturn(Collections.emptyList()); + when(schema.getIndexLabels()).thenReturn(Collections.emptyList()); + + org.junit.Assert.assertEquals("", + GroovySchemaCompatibility.export(schema)); + } + + @Test + public void shouldSplitOnlyOutsideQuotedGroovyStrings() { + String content = "graph.schema().propertyKey('a;\\'b').userdata(" + + "'path', 'c:\\\\tmp;east\\nwest').create();\r\n" + + "graph.schema().propertyKey(\"second;key\").create();"; + + List statements = + GroovySchemaCompatibility.splitStatements(content); + + org.junit.Assert.assertEquals(2, statements.size()); + assertTrue(statements.get(0).contains("'a;\\'b'")); + assertTrue(statements.get(0).contains("c:\\\\tmp;east\\nwest")); + assertTrue(statements.get(1).contains("\"second;key\"")); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldRejectUnterminatedGroovyStrings() { + GroovySchemaCompatibility.splitStatements( + "graph.schema().propertyKey('unfinished);"); + } +} diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java index 6b67979be..58d819f04 100644 --- a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/UnitTestSuite.java @@ -46,6 +46,7 @@ LegacyFacadeRemovalTest.class, MessageSourceHandlerTest.class, SchemaControllerSecurityTest.class, + GroovySchemaCompatibilityTest.class, JobManagerServiceTest.class, K8sTokenEndpointSecurityTest.class, LoadTaskServiceTest.class, From 6cdac4034a43df678adfae7228fb83c40622ce74 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 09:04:15 +0800 Subject: [PATCH 62/68] fix(hubble): harden result view switching - project BigInt and JSONbig values safely for JSON display - render table cells without lossy quoting or precision changes - prevent hidden graph fitting and duplicate layout registration --- .../hubble-fe/src/customHook/useCustomGrid.js | 7 +- .../analysis/QueryResult/Home/index.js | 8 +- .../analysis/QueryResult/Home/index.test.js | 75 +++++++++++++++++++ .../analysis/QueryResult/Home/utils.js | 58 ++++++++++++++ .../analysis/QueryResult/TableView/index.js | 30 +++++++- .../QueryResult/TableView/index.test.js | 42 +++++++++++ hugegraph-hubble/hubble-fe/src/utils/graph.js | 5 ++ .../hubble-fe/src/utils/graph.test.js | 45 +++++++++++ 8 files changed, 265 insertions(+), 5 deletions(-) create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/index.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/utils.js create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/TableView/index.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/utils/graph.test.js diff --git a/hugegraph-hubble/hubble-fe/src/customHook/useCustomGrid.js b/hugegraph-hubble/hubble-fe/src/customHook/useCustomGrid.js index c4e958b5c..99a0d2ab4 100644 --- a/hugegraph-hubble/hubble-fe/src/customHook/useCustomGrid.js +++ b/hugegraph-hubble/hubble-fe/src/customHook/useCustomGrid.js @@ -24,6 +24,8 @@ import _ from 'lodash'; import G6 from '@antv/g6'; import {useEffect} from 'react'; +const CUSTOM_GRID_REGISTERED = '__hubbleCustomGridRegistered'; + const options = { small(val) { const self = this; @@ -292,7 +294,10 @@ const options = { const useCustomGrid = () => { useEffect( () => { - G6.registerLayout('customGrid', options); + if (!G6[CUSTOM_GRID_REGISTERED]) { + G6.registerLayout('customGrid', options); + G6[CUSTOM_GRID_REGISTERED] = true; + } }, [] ); diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/index.js index 5c458a994..07cd5f7df 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/index.js @@ -20,12 +20,13 @@ * @file Gremlin语法分析 查询结果 */ -import React from 'react'; +import React, {useMemo} from 'react'; import {useTranslation} from 'react-i18next'; import {Tabs} from 'antd'; import JsonView from '../JsonView'; import GraphResult from '../GraphResult/Home'; import TableView from '../TableView'; +import {getJsonViewContent} from './utils'; import c from './index.module.scss'; const QueryResult = props => { @@ -45,7 +46,10 @@ const QueryResult = props => { table_view: queryResultTable = {}, } = queryResult || {}; - const jsonViewContent = JSON.parse(JSON.stringify(queryResultJson?.data || [])); + const jsonViewContent = useMemo( + () => getJsonViewContent(queryResultJson), + [queryResultJson] + ); const GRAPH_VIEW = t('analysis.query_result.graph'); const TABLE_VIEW = t('analysis.query_result.table'); diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/index.test.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/index.test.js new file mode 100644 index 000000000..7aec145d5 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/index.test.js @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {getJsonViewContent} from './utils'; +import JSONbig from 'json-bigint'; + +it('projects BigInt, production BigNumber, and null-prototype values safely', () => { + const bigNumber = JSONbig.parse('{"id":9007199254740993}').id; + const nullPrototype = Object.create(null); + nullPrototype.name = 'alice'; + const data = [{native: 9007199254740993n, parsed: bigNumber}, nullPrototype]; + const projected = getJsonViewContent({data}); + + expect(projected).not.toBe(data); + expect(projected[0]).toEqual({ + native: '9007199254740993', + parsed: '9007199254740993', + }); + expect(Object.getPrototypeOf(projected[1])).toBe(Object.prototype); + expect(projected[1]).toEqual({name: 'alice'}); + expect(getJsonViewContent()).toEqual([]); + expect(getJsonViewContent({data: false})).toEqual({value: false}); +}); + +it('marks circular display values without throwing', () => { + const circular = {name: 'loop'}; + circular.self = circular; + + expect(getJsonViewContent({data: circular})).toEqual({ + name: 'loop', + self: '[Circular]', + }); +}); + +it('keeps __proto__ as display data without changing the projected prototype', () => { + const source = Object.create(null); + Object.defineProperty(source, '__proto__', { + enumerable: true, + value: 'safe', + }); + const projected = getJsonViewContent({data: source}); + + expect(Object.getPrototypeOf(projected)).toBe(Object.prototype); + expect(Object.prototype.hasOwnProperty.call(projected, '__proto__')).toBe(true); + expect(Reflect.get(projected, '__proto__')).toBe('safe'); + expect(Object.prototype.safe).toBeUndefined(); +}); + +it('does not collapse objects that only mimic a BigNumber constructor name', () => { + const mimic = { + constructor: {name: 'BigNumber'}, + toString: () => '[misleading value]', + value: 7, + }; + + expect(getJsonViewContent({data: mimic})).toEqual({ + constructor: {name: 'BigNumber'}, + toString: mimic.toString, + value: 7, + }); +}); diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/utils.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/utils.js new file mode 100644 index 000000000..02faecc7a --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/Home/utils.js @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +const isJsonBigNumber = value => { + return value !== null + && typeof value === 'object' + && typeof value.constructor?.isBigNumber === 'function' + && value.constructor.isBigNumber(value) + && typeof value.toString === 'function'; +}; + +const projectJsonValue = (value, ancestors = new WeakSet()) => { + if (typeof value === 'bigint' || isJsonBigNumber(value)) { + return value.toString(); + } + if (value === null || typeof value !== 'object') { + return value; + } + if (ancestors.has(value)) { + return '[Circular]'; + } + ancestors.add(value); + const projected = Array.isArray(value) ? [] : {}; + Object.keys(value).forEach(key => { + Object.defineProperty(projected, key, { + configurable: true, + enumerable: true, + value: projectJsonValue(value[key], ancestors), + writable: true, + }); + }); + ancestors.delete(value); + return projected; +}; + +const getJsonViewContent = jsonView => { + const projected = projectJsonValue(jsonView?.data ?? []); + if (projected !== null && typeof projected === 'object') { + return projected; + } + return {value: projected}; +}; + +export {getJsonViewContent, isJsonBigNumber, projectJsonValue}; diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/TableView/index.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/TableView/index.js index 37ed06f22..0445aefdf 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/TableView/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryResult/TableView/index.js @@ -28,6 +28,7 @@ import TaskNavigateView from '../../../component/TaskNavigateView'; import {GRAPH_STATUS} from '../../../../utils/constants'; import _ from 'lodash'; import c from './index.module.scss'; +import {isJsonBigNumber, projectJsonValue} from '../Home/utils'; const { STANDBY, @@ -36,6 +37,31 @@ const { FAILED, UPLOAD_FAILED, } = GRAPH_STATUS; +export function tableRowKey(record, index) { + return record.id ?? record._id ?? `result-row-${index}`; +} + +export function renderTableCell(value) { + if (typeof value === 'string') { + return value; + } + if (typeof value === 'bigint') { + return value.toString(); + } + if (isJsonBigNumber(value)) { + return value.toString(); + } + if (value === undefined) { + return ''; + } + if (value === null) { + return 'null'; + } + if (typeof value === 'object') { + return JSON.stringify(projectJsonValue(value)); + } + return String(value); +} const TableView = props => { const {t} = useTranslation(); @@ -51,7 +77,7 @@ const TableView = props => { title, dataIndex: title, render(text) { - return JSON.stringify(text); + return renderTableCell(text); }, })); @@ -78,7 +104,7 @@ const TableView = props => { return (
{ + expect(tableRowKey({id: 7}, 2)).toBe(7); + expect(tableRowKey({_id: 'vertex-1'}, 3)).toBe('vertex-1'); + expect(tableRowKey({name: 'alice'}, 4)).toBe('result-row-4'); +}); + +it('renders scalar cells readably and structured cells as JSON', () => { + expect(renderTableCell('vertex-1')).toBe('vertex-1'); + expect(renderTableCell(42)).toBe('42'); + expect(renderTableCell(false)).toBe('false'); + expect(renderTableCell(9007199254740993n)).toBe('9007199254740993'); + expect(renderTableCell(null)).toBe('null'); + expect(renderTableCell({name: 'alice'})).toBe('{"name":"alice"}'); + expect(renderTableCell({id: 9007199254740993n})) + .toBe('{"id":"9007199254740993"}'); + expect(renderTableCell(JSONbig.parse('9007199254740993'))) + .toBe('9007199254740993'); + const circular = {name: 'loop'}; + circular.self = circular; + expect(renderTableCell(circular)) + .toBe('{"name":"loop","self":"[Circular]"}'); +}); diff --git a/hugegraph-hubble/hubble-fe/src/utils/graph.js b/hugegraph-hubble/hubble-fe/src/utils/graph.js index 41d390d16..db49065be 100644 --- a/hugegraph-hubble/hubble-fe/src/utils/graph.js +++ b/hugegraph-hubble/hubble-fe/src/utils/graph.js @@ -26,6 +26,11 @@ const fitView = graph => { const padding = [50, 50, 50, 50]; const width = graph.get('width'); const height = graph.get('height'); + + if (width <= padding[1] + padding[3] + || height <= padding[0] + padding[2]) { + return; + } const group = graph.get('group'); group.resetMatrix(); const bbox = group.getCanvasBBox(); diff --git a/hugegraph-hubble/hubble-fe/src/utils/graph.test.js b/hugegraph-hubble/hubble-fe/src/utils/graph.test.js new file mode 100644 index 000000000..b752dcf44 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/utils/graph.test.js @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +jest.mock('@antv/graphin-icons', () => ({ + __esModule: true, + default: () => ({glyphs: []}), +})); + +import {fitView} from './graph'; + +it('skips fitting while the graph tab has no measurable viewport', () => { + const resetMatrix = jest.fn(); + const graph = { + get: key => ({ + width: 0, + height: 0, + group: { + getCanvasBBox: () => ({height: 100, width: 100, x: 0, y: 0}), + resetMatrix, + }, + })[key], + translate: jest.fn(), + zoom: jest.fn(), + }; + + fitView(graph); + + expect(resetMatrix).not.toHaveBeenCalled(); + expect(graph.translate).not.toHaveBeenCalled(); + expect(graph.zoom).not.toHaveBeenCalled(); +}); From 4c5aad1b17ee66017e05b770a28d2ba1f33119d6 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 10:02:38 +0800 Subject: [PATCH 63/68] fix(hubble): clarify query recovery state - persist a controlled reason for synchronous Cypher failures - keep async submission and execution failure semantics distinct - close favorite popovers when switching query languages - cover sync, async, and tab-transition regression paths --- .../controller/query/CypherController.java | 2 + .../unit/CypherHistoryFailureTest.java | 101 ++++++++++++++++++ .../modules/analysis/QueryBar/Home/index.js | 27 ++++- .../analysis/QueryBar/Home/index.test.js | 73 +++++++++++++ 4 files changed, 200 insertions(+), 3 deletions(-) create mode 100644 hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/CypherHistoryFailureTest.java create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.test.js diff --git a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/CypherController.java b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/CypherController.java index e98272cb6..6d6e357af 100644 --- a/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/CypherController.java +++ b/hugegraph-hubble/hubble-be/src/main/java/org/apache/hugegraph/controller/query/CypherController.java @@ -83,6 +83,8 @@ public GremlinResult execute(@PathVariable("graphspace") String graphSpace, return result; } catch (Throwable e) { status = ExecuteStatus.FAILED; + history.setFailureReason( + GremlinQueryController.GREMLIN_EXECUTION_FAILED); throw e; } finally { timer.stop(); diff --git a/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/CypherHistoryFailureTest.java b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/CypherHistoryFailureTest.java new file mode 100644 index 000000000..933ce8acf --- /dev/null +++ b/hugegraph-hubble/hubble-be/src/test/java/org/apache/hugegraph/unit/CypherHistoryFailureTest.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.unit; + +import org.apache.hugegraph.controller.query.CypherController; +import org.apache.hugegraph.driver.HugeClient; +import org.apache.hugegraph.entity.query.ExecuteHistory; +import org.apache.hugegraph.entity.query.GremlinQuery; +import org.apache.hugegraph.service.query.ExecuteHistoryService; +import org.apache.hugegraph.service.query.QueryService; +import org.apache.hugegraph.testutil.Assert; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; +import org.springframework.test.util.ReflectionTestUtils; + +public class CypherHistoryFailureTest { + + @Test + public void testSyncFailurePersistsOnlyControlledReasonCode() { + HugeClient client = Mockito.mock(HugeClient.class); + QueryService queryService = Mockito.mock(QueryService.class); + ExecuteHistoryService historyService = + Mockito.mock(ExecuteHistoryService.class); + RuntimeException unsafe = new RuntimeException( + "No signature of method: secret.Groovy.stack()"); + Mockito.when(queryService.executeCypherQuery( + Mockito.eq(client), Mockito.anyString())) + .thenThrow(unsafe); + + TestController controller = new TestController(client); + ReflectionTestUtils.setField(controller, "queryService", queryService); + ReflectionTestUtils.setField(controller, "historyService", historyService); + + Assert.assertThrows(RuntimeException.class, + () -> controller.execute("DEFAULT", "hugegraph", + "MATCH INVALID")); + + ArgumentCaptor saved = + ArgumentCaptor.forClass(ExecuteHistory.class); + Mockito.verify(historyService).update(saved.capture()); + Assert.assertEquals("GREMLIN_EXECUTION_FAILED", + saved.getValue().getFailureReason()); + Assert.assertFalse(saved.getValue().getFailureReason() + .contains("signature")); + } + + @Test + public void testAsyncSubmissionFailureDoesNotClaimExecutionFailure() { + HugeClient client = Mockito.mock(HugeClient.class); + QueryService queryService = Mockito.mock(QueryService.class); + ExecuteHistoryService historyService = + Mockito.mock(ExecuteHistoryService.class); + Mockito.when(queryService.executeCypherAsyncTask( + Mockito.eq(client), Mockito.anyString())) + .thenThrow(new RuntimeException("secret backend detail")); + + TestController controller = new TestController(client); + ReflectionTestUtils.setField(controller, "queryService", queryService); + ReflectionTestUtils.setField(controller, "historyService", historyService); + + Assert.assertThrows(RuntimeException.class, + () -> controller.executeAsyncTask( + "DEFAULT", "hugegraph", + new GremlinQuery("MATCH INVALID"))); + + ArgumentCaptor saved = + ArgumentCaptor.forClass(ExecuteHistory.class); + Mockito.verify(historyService).update(saved.capture()); + Assert.assertNull(saved.getValue().getFailureReason()); + } + + private static class TestController extends CypherController { + + private final HugeClient client; + + TestController(HugeClient client) { + this.client = client; + } + + @Override + protected HugeClient authClient(String graphSpace, String graph) { + return this.client; + } + } +} diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.js index e8e7e2457..9cc995aa2 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.js @@ -30,6 +30,10 @@ import c from './index.module.scss'; const {GREMLIN, CYPHER} = ANALYSIS_TYPE; +const isFavoritePopoverOpen = (visible, activeTab, tabKey) => { + return visible && activeTab === tabKey; +}; + const QueryBar = props => { const {t} = useTranslation(); const {...args} = props; @@ -51,6 +55,14 @@ const QueryBar = props => { [setCodeEditorContent] ); + const handleTabsChange = useCallback( + nextTab => { + setFavoriteCardVisible(false); + onTabsChange(nextTab); + }, + [onTabsChange] + ); + const tabItems = [ { label: t('analysis.query.gremlin_tab'), @@ -59,7 +71,11 @@ const QueryBar = props => { { { defaultActiveKey={GREMLIN} activeKey={activeTab} type="card" - onChange={onTabsChange} + onChange={handleTabsChange} items={tabItems} size='small' /> @@ -104,4 +124,5 @@ const QueryBar = props => { ); }; +export {isFavoritePopoverOpen}; export default QueryBar; diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.test.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.test.js new file mode 100644 index 000000000..86a9a1585 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.test.js @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {useState} from 'react'; +import {fireEvent, render, screen, within} from '@testing-library/react'; +import QueryBar, {isFavoritePopoverOpen} from './index'; + +jest.mock('../../../../components/CodeEditor', () => () =>
editor
); +jest.mock('../ContentCommon', () => ({ + children, + favoriteCardVisible, + setFavoriteCardVisible, +}) => ( +
+ + {favoriteCardVisible ? 'favorite open' : 'favorite closed'} + {children} +
+)); +jest.mock('react-i18next', () => ({ + useTranslation: () => ({t: key => ({ + 'analysis.query.gremlin_tab': 'Gremlin', + 'analysis.query.cypher_tab': 'Cypher', + })[key] || key}), +})); + +beforeAll(() => { + window.matchMedia = window.matchMedia || (() => ({ + matches: false, + addListener: jest.fn(), + removeListener: jest.fn(), + })); +}); + +it('does not transfer an open favorite popover when query tabs change', () => { + expect(isFavoritePopoverOpen(true, 'Gremlin', 'Gremlin')).toBe(true); + expect(isFavoritePopoverOpen(true, 'Cypher', 'Gremlin')).toBe(false); + expect(isFavoritePopoverOpen(false, 'Gremlin', 'Gremlin')).toBe(false); + + const ControlledQueryBar = () => { + const [activeTab, setActiveTab] = useState('Gremlin'); + return ( + + ); + }; + + render(); + fireEvent.click(screen.getByRole('button', {name: 'open favorite'})); + expect(screen.getByText('favorite open')).toBeInTheDocument(); + + fireEvent.click(screen.getByRole('tab', {name: 'Cypher'})); + expect(within(screen.getByRole('tabpanel', {name: 'Cypher'})) + .getByText('favorite closed')).toBeInTheDocument(); +}); From 26433098c40df5b61f079c0961aa3f2c58c60484 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 12:03:39 +0800 Subject: [PATCH 64/68] fix(hubble): recover schema capabilities - expose graph schema export with identity-safe recovery - distinguish Meta loading, empty and failure states - recover vertex and edge detail requests without stale writes - clarify optional template application during graph creation - make graph creation and card actions keyboard accessible --- .../i18n/resources/en-US/modules/pages.json | 15 ++ .../i18n/resources/zh-CN/modules/pages.json | 15 ++ .../hubble-fe/src/pages/Graph/Card.js | 9 +- .../hubble-fe/src/pages/Graph/Card.test.js | 59 ++++++ .../hubble-fe/src/pages/Graph/EditLayer.js | 175 +++++++++++++++--- .../src/pages/Graph/EditLayer.test.js | 137 ++++++++++++++ .../hubble-fe/src/pages/Graph/index.js | 12 +- .../src/pages/Meta/Edge/EditLayer.js | 74 +++++--- .../hubble-fe/src/pages/Meta/Edge/index.js | 28 ++- .../src/pages/Meta/EdgeIndex/index.js | 29 ++- .../src/pages/Meta/EditLayerRecovery.test.js | 103 +++++++++++ .../hubble-fe/src/pages/Meta/ImageView.js | 129 ++++++++----- .../src/pages/Meta/Property/index.js | 34 ++-- .../src/pages/Meta/Vertex/EditLayer.js | 74 +++++--- .../hubble-fe/src/pages/Meta/Vertex/index.js | 28 ++- .../src/pages/Meta/VertexIndex/index.js | 29 ++- .../src/pages/Meta/common/MetaTableStatus.js | 30 +++ .../src/pages/Meta/common/useMetaTable.js | 77 ++++++++ .../pages/Meta/common/useMetaTable.test.js | 94 ++++++++++ 19 files changed, 942 insertions(+), 209 deletions(-) create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Graph/Card.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Graph/EditLayer.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/EditLayerRecovery.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/common/MetaTableStatus.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/common/useMetaTable.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/common/useMetaTable.test.js diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json index 856bbea08..10f49021c 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json @@ -198,6 +198,12 @@ "view_schema": "View Schema", "clone": "Clone Graph" }, + "schema_view": { + "export": "Export Groovy Schema", + "load_failed": "Schema could not be loaded. Check the Server connection and retry.", + "retry": "Retry schema", + "export_failed": "Schema export failed. Retry when the Server is available." + }, "form": { "title_create": "Create Graph", "title_edit": "Edit Graph", @@ -206,6 +212,9 @@ "nickname": "Display Name", "nickname_placeholder": "Letters, digits, underscore, max 48 chars", "schema_placeholder": "Select a schema", + "schema_load_failed": "Schema templates could not be loaded.", + "schema_retry": "Retry templates", + "schema_optional_hint": "Optional. You can create an empty graph without a template.", "create_success": "Graph created", "update_success": "Graph updated", "auth": "Enable Authentication", @@ -248,6 +257,7 @@ "count": "Count" }, "card": { + "more_actions": "More actions for {{graph}}", "storage": "Storage", "detail_tooltip": "View the current vertex and edge counts for this graph" } @@ -567,6 +577,8 @@ } }, "schema": { + "list_failed": "Schema data could not be loaded. Check the Server connection and retry.", + "retry": "Retry schema data", "delete_failed": "Delete failed. Check the server connection and retry.", "title": "Metadata Management", "name_placeholder": "Letters, numbers, underscores, and Chinese characters are allowed", @@ -620,6 +632,7 @@ "vertex": { "create": "Create Vertex Type", "edit": "Edit Vertex Type", + "detail_failed": "Vertex type details could not be loaded. Retry before editing.", "id": "Vertex ID", "in_use": "Vertices {{names}} are in use and cannot be deleted.", "select_properties_first": "Select related properties first", @@ -652,6 +665,7 @@ "edge": { "create": "Create Edge Type", "edit": "Edit Edge Type", + "detail_failed": "Edge type details could not be loaded. Retry before editing.", "display_fields": "Display Fields", "link_multi_times": "Allow Multiple Links", "parent": "Parent Edge Type: ", @@ -713,6 +727,7 @@ } }, "image_view": { + "load_failed": "Schema diagram data could not be loaded. Retry before editing.", "vertex": "Vertex Type", "edge": "Edge Type", "view_properties": "View Properties" diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json index 18bc63071..bc42fdc8f 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json @@ -198,6 +198,12 @@ "view_schema": "查看schema", "clone": "克隆图" }, + "schema_view": { + "export": "导出 Groovy Schema", + "load_failed": "Schema 暂时无法加载,请检查 Server 连接后重试。", + "retry": "重试 Schema", + "export_failed": "Schema 导出失败,请在 Server 恢复后重试。" + }, "form": { "title_create": "创建图", "title_edit": "编辑图", @@ -206,6 +212,9 @@ "nickname": "图名", "nickname_placeholder": "只能包含中文、字母、数字、_,最长48位", "schema_placeholder": "请选择schema", + "schema_load_failed": "Schema 模板暂时无法加载。", + "schema_retry": "重试模板", + "schema_optional_hint": "可选;不选择模板时将创建空 Schema 图。", "create_success": "创建成功", "update_success": "更新成功", "auth": "是否开启鉴权", @@ -248,6 +257,7 @@ "count": "数量" }, "card": { + "more_actions": "{{graph}} 的更多操作", "storage": "存储空间", "detail_tooltip": "点击可以查看本图目前存储的点边的数量" } @@ -567,6 +577,8 @@ } }, "schema": { + "list_failed": "Schema 数据暂时无法加载,请检查 Server 连接后重试。", + "retry": "重试 Schema 数据", "delete_failed": "删除失败,请检查 Server 连接后重试。", "title": "元数据管理", "name_placeholder": "允许出现中英文、数字、下划线", @@ -620,6 +632,7 @@ "vertex": { "create": "创建顶点类型", "edit": "编辑顶点类型", + "detail_failed": "顶点类型详情暂时无法加载,请重试后再编辑。", "id": "顶点ID", "in_use": "顶点数据 {{names}} 正在使用中,不可删除", "select_properties_first": "请先选择关联属性", @@ -652,6 +665,7 @@ "edge": { "create": "创建边类型", "edit": "编辑边类型", + "detail_failed": "边类型详情暂时无法加载,请重试后再编辑。", "display_fields": "边展示内容", "link_multi_times": "允许多次连接", "parent": "父边类型:", @@ -713,6 +727,7 @@ } }, "image_view": { + "load_failed": "Schema 图数据暂时无法加载,请重试后再编辑。", "vertex": "顶点类型", "edge": "边类型", "view_properties": "查看属性" diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/Card.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/Card.js index 4594254ce..d374f59ac 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/Card.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/Card.js @@ -17,7 +17,7 @@ */ import {useCallback} from 'react'; -import {Card, Dropdown, Typography, Tooltip} from 'antd'; +import {Button, Card, Dropdown, Typography, Tooltip} from 'antd'; import {UnorderedListOutlined, EyeOutlined} from '@ant-design/icons'; import {useNavigate} from 'react-router-dom'; import {useTranslation} from 'react-i18next'; @@ -60,6 +60,7 @@ const TitleField = ({item, onClick}) => { const GraphCard = ({item, menus}) => { const {t} = useTranslation(); const navigate = useNavigate(); + const graphName = item.nickname || item.name; const schemaView = item.schemaview || {vertices: [], edges: []}; const graphinData = formatToGraphInData(schemaView, false); @@ -83,7 +84,11 @@ const GraphCard = ({item, menus}) => { menu={{items: menus}} trigger={['click']} > - + + )} + /> + )} + {exportError && ( + + )} + +
{info}
+
+ ); }; diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/EditLayer.test.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/EditLayer.test.js new file mode 100644 index 000000000..796febbf5 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/EditLayer.test.js @@ -0,0 +1,137 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {fireEvent, render, screen, waitFor} from '@testing-library/react'; +import {EditLayer, ViewLayer} from './EditLayer'; +import * as api from '../../api'; + +jest.mock('react-i18next', () => ({ + initReactI18next: {type: '3rdParty', init: jest.fn()}, + useTranslation: () => ({t: key => key}), +})); + +jest.mock('../../api', () => ({ + manage: { + getGraphSchema: jest.fn(), + exportSchema: jest.fn(), + getSchemaList: jest.fn(), + }, +})); + +beforeEach(() => { + jest.clearAllMocks(); + URL.createObjectURL = jest.fn(() => 'blob:schema'); + URL.revokeObjectURL = jest.fn(); + window.matchMedia = jest.fn().mockImplementation(query => ({ + matches: false, + media: query, + addListener: jest.fn(), + removeListener: jest.fn(), + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + })); +}); + +test('shows schema and downloads the exported Groovy document', async () => { + api.manage.getGraphSchema.mockResolvedValue({ + status: 200, + data: {schema: 'graph.schema().propertyKey("name")'}, + }); + api.manage.exportSchema.mockResolvedValue('schema export'); + const click = jest.spyOn(HTMLAnchorElement.prototype, 'click') + .mockImplementation(() => {}); + + render( + + ); + + expect(await screen.findByText('graph.schema().propertyKey("name")')) + .toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', {name: 'graph.schema_view.export'})); + + await waitFor(() => expect(api.manage.exportSchema) + .toHaveBeenCalledWith('DEFAULT', 'hugegraph')); + await waitFor(() => expect(screen.getByRole('button', { + name: 'graph.schema_view.export', + })).not.toHaveClass('ant-btn-loading')); + expect(URL.createObjectURL).toHaveBeenCalled(); + expect(click).toHaveBeenCalled(); + click.mockRestore(); +}); + +test('keeps schema load failure visible and retries the current graph', async () => { + api.manage.getGraphSchema + .mockRejectedValueOnce(new Error('offline')) + .mockResolvedValueOnce({status: 200, data: {schema: 'recovered'}}); + + render( + + ); + + expect(await screen.findByText('graph.schema_view.load_failed')).toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', {name: 'graph.schema_view.retry'})); + expect(await screen.findByText('recovered')).toBeInTheDocument(); + expect(api.manage.getGraphSchema).toHaveBeenCalledTimes(2); +}); + +test('explains template list failure and retries without a silent empty select', async () => { + api.manage.getSchemaList + .mockRejectedValueOnce(new Error('offline')) + .mockResolvedValueOnce({status: 200, data: {records: []}}); + + render( + + ); + + expect(await screen.findByText('graph.form.schema_load_failed')).toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', {name: 'graph.form.schema_retry'})); + await waitFor(() => expect(api.manage.getSchemaList).toHaveBeenCalledTimes(2)); + expect(screen.queryByText('graph.form.schema_load_failed')).not.toBeInTheDocument(); + await waitFor(() => expect(screen.getByRole('combobox')).toBeEnabled()); +}); + +test('does not leak an old graph export failure into the next graph', async () => { + let rejectOld; + api.manage.getGraphSchema.mockResolvedValue({ + status: 200, data: {schema: 'schema'}, + }); + api.manage.exportSchema.mockImplementationOnce(() => new Promise((resolve, reject) => { + rejectOld = reject; + })); + const {rerender} = render( + + ); + await screen.findByText('schema'); + fireEvent.click(screen.getByRole('button', {name: 'graph.schema_view.export'})); + + rerender( + + ); + await waitFor(() => expect(screen.getByRole('button', { + name: 'graph.schema_view.export', + })).toBeEnabled()); + rejectOld(new Error('old offline')); + await waitFor(() => expect(api.manage.getGraphSchema).toHaveBeenCalledTimes(2)); + expect(screen.queryByText('graph.schema_view.export_failed')).not.toBeInTheDocument(); + expect(screen.getByRole('button', {name: 'graph.schema_view.export'})) + .not.toHaveClass('ant-btn-loading'); +}); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js index a8153545d..b60826159 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js @@ -50,6 +50,7 @@ import { import moment from 'moment'; import GraphCard from './Card'; import ClearGraphConfirmModal from './ClearGraphConfirmModal'; +import KeyboardAction from '../../components/KeyboardAction'; const Graph = () => { const {t} = useTranslation(); @@ -440,9 +441,14 @@ const Graph = () => { {graphCreateEnabled && (
- - {t('graph.create')} - + + + {t('graph.create')} + + )} diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/Edge/EditLayer.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/Edge/EditLayer.js index 7786ac954..bfa8d52fa 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Meta/Edge/EditLayer.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/Edge/EditLayer.js @@ -16,8 +16,8 @@ * under the License. */ -import {Modal, Form, Input, Select, Row, Col, Checkbox, message, Spin, Radio} from 'antd'; -import {useCallback, useEffect, useState} from 'react'; +import {Alert, Button, Modal, Form, Input, Select, Row, Col, Checkbox, message, Spin, Radio} from 'antd'; +import {useCallback, useEffect, useState, useRef} from 'react'; import {useTranslation} from 'react-i18next'; import * as api from '../../../api'; import * as rules from '../../../utils/rules'; @@ -38,10 +38,45 @@ const EditEdgeLayer = ({visible, onCancle, graphspace, graph, refresh, name, pro const [existProperties, setExistProperties] = useState([]); const [existPropertyIndex, setExistPropertyIndex] = useState([]); const [spinning, setSpinning] = useState(false); + const [detailError, setDetailError] = useState(false); + const detailRequest = useRef(null); const [loading, setLoading] = useState(false); const [edgeLabelType, setEdgeLabelType] = useState('NORMAL'); const [parentEdgeLabelList, setParentEdgeLabelList] = useState([]); + const loadDetail = useCallback(() => { + const token = Symbol('edge-detail'); + detailRequest.current = token; + setDetailError(false); + setSpinning(true); + api.manage.getMetaEdge(graphspace, graph, name).then(res => { + if (detailRequest.current !== token) { + return; + } + if (res.status !== 200) { + setDetailError(true); + return; + } + const {properties, property_indexes, link_multi_times, edgelabel_type} = res.data; + form.setFieldsValue(res.data); + setSelectedPropertyList(properties.map(item => ({ + ...item, label: item.name, value: item.name, + }))); + setLinkMulti(link_multi_times); + setExistProperties(properties); + setExistPropertyIndex(property_indexes); + setEdgeLabelType(edgelabel_type); + }).catch(() => { + if (detailRequest.current === token) { + setDetailError(true); + } + }).finally(() => { + if (detailRequest.current === token) { + setSpinning(false); + } + }); + }, [form, graph, graphspace, name]); + const selectProperty = useCallback(() => { const attr = form.getFieldValue('properties'); const tmp = []; @@ -142,27 +177,11 @@ const EditEdgeLayer = ({visible, onCancle, graphspace, graph, refresh, name, pro return; } - setSpinning(true); - api.manage.getMetaEdge(graphspace, graph, name).then(res => { - if (res.status === 200) { - const {properties, property_indexes, link_multi_times, edgelabel_type} = res.data; - - form.setFieldsValue(res.data); - // form.setFields([{name: 'properties', value: properties}]); - - setSelectedPropertyList(properties.map(item => ({ - ...item, - label: item.name, - value: item.name, - }))); - setLinkMulti(link_multi_times); - setExistProperties(properties); - setExistPropertyIndex(property_indexes); - setSpinning(false); - setEdgeLabelType(edgelabel_type); - } - }); - }, [visible, name, form, graph, graphspace]); + loadDetail(); + return () => { + detailRequest.current = null; + }; + }, [visible, name, form, graph, graphspace, loadDetail]); useEffect(() => { if (!visible) { @@ -185,9 +204,18 @@ const EditEdgeLayer = ({visible, onCancle, graphspace, graph, refresh, name, pro onClose={onCancle} onOk={onFinish} confirmLoading={loading} + okButtonProps={{disabled: spinning || detailError}} width={600} destroyOnClose > + {detailError && ( + {t('schema.retry')}} + /> + )}
{ const [editLayerVisible, setEditLayerVisible] = useState(false); - const [data, setData] = useState([]); const [refresh, setRefresh] = useState(false); - const [pagination, setPagination] = useState({current: 1, total: 10}); const [selectedItems, setSelectedItems] = useState([]); const [edgeName, setEdgeName] = useState(''); const [propertyList, setPropertyList] = useState([]); @@ -37,9 +38,12 @@ const EdgeTable = () => { const {graphspace, graph} = useParams(); const {t} = useTranslation(); - const handleTable = useCallback(newPagination => { - setPagination(newPagination); - }, []); + const fetchPage = useCallback(params => api.manage.getMetaEdgeList( + graphspace, graph, params + ), [graphspace, graph]); + const {data, pagination, loading, error, retry, handleTable} = useMetaTable( + fetchPage, {identityKey: `${graphspace}:${graph}`, refreshKey: refresh} + ); const removeEdge = useCallback((names, isBatch) => { Modal.confirm({ @@ -160,18 +164,6 @@ const EdgeTable = () => { }, ]; - useEffect(() => { - api.manage.getMetaEdgeList(graphspace, graph, { - page_no: pagination.current, - }).then(res => { - if (res.status === 200) { - setData(res.data.records); - setPagination({...pagination, total: res.data.total}); - } - }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [refresh, graphspace, graph, pagination.current]); - useEffect(() => { api.manage.getMetaPropertyList(graphspace, graph).then(res => { if (res.status === 200) { @@ -204,6 +196,7 @@ const EdgeTable = () => {
+
{ onChange={handleTable} rowKey={rowKey} showExpandColumn={false} + loading={loading} /> { - const [data, setData] = useState([]); - const [pagination, setPagination] = useState({current: 1, total: 10}); const {graphspace, graph} = useParams(); const {t} = useTranslation(); - const handleTable = useCallback(newPagination => { - setPagination(newPagination); - }, []); + const fetchPage = useCallback(params => api.manage.getMetaEdgeIndexList( + graphspace, graph, params + ), [graphspace, graph]); + const {data, pagination, loading, error, retry, handleTable} = useMetaTable( + fetchPage, {identityKey: `${graphspace}:${graph}`} + ); const columns = [ { @@ -54,25 +57,15 @@ const EdgeIndexTable = () => { }, ]; - useEffect(() => { - api.manage.getMetaEdgeIndexList(graphspace, graph, { - page_no: pagination.current, - }).then(res => { - if (res.status === 200) { - setData(res.data.records); - setPagination({...pagination, total: res.data.total}); - } - }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [pagination.current, graph, graphspace]); - return ( <> +
); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/EditLayerRecovery.test.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/EditLayerRecovery.test.js new file mode 100644 index 000000000..f7b07051e --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/EditLayerRecovery.test.js @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {fireEvent, render, screen, waitFor} from '@testing-library/react'; +import {EditVertexLayer} from './Vertex/EditLayer'; +import {EditEdgeLayer} from './Edge/EditLayer'; +import * as api from '../../api'; + +jest.mock('react-i18next', () => ({ + initReactI18next: {type: '3rdParty', init: jest.fn()}, + useTranslation: () => ({t: key => key}), +})); + +jest.mock('../../api', () => ({ + manage: { + getMetaVertex: jest.fn(), + getMetaEdge: jest.fn(), + getMetaEdgeList: jest.fn(), + }, +})); + +jest.mock('../../components/ColorSelect', () => ({ + InputColorSelect: () => , +})); +jest.mock('../../components/IconSelect', () => () => ); +jest.mock('./common/RelateProperty', () => () =>
properties
); +jest.mock('./common/RelatePropertyIndex', () => () =>
indexes
); + +beforeEach(() => { + jest.clearAllMocks(); + window.matchMedia = jest.fn().mockImplementation(query => ({ + matches: false, + media: query, + addListener: jest.fn(), + removeListener: jest.fn(), + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + })); + api.manage.getMetaEdgeList.mockResolvedValue({status: 200, data: {records: []}}); +}); + +test('vertex detail failure ends loading, disables submit and retries', async () => { + api.manage.getMetaVertex + .mockRejectedValueOnce(new Error('offline')) + .mockResolvedValueOnce({ + status: 200, + data: { + name: 'person', properties: [], property_indexes: [], + id_strategy: 'AUTOMATIC', primaryKeys: [], + }, + }); + + render( + + ); + + expect(await screen.findByText('schema.vertex.detail_failed')).toBeInTheDocument(); + expect(screen.getByRole('button', {name: 'OK'})).toBeDisabled(); + fireEvent.click(screen.getByRole('button', {name: 'schema.retry'})); + await waitFor(() => expect(api.manage.getMetaVertex).toHaveBeenCalledTimes(2)); + await waitFor(() => expect(screen.getByRole('button', {name: 'OK'})).toBeEnabled()); +}); + +test('edge detail failure ends loading, disables submit and retries', async () => { + api.manage.getMetaEdge + .mockResolvedValueOnce({status: 500}) + .mockResolvedValueOnce({ + status: 200, + data: { + name: 'knows', properties: [], property_indexes: [], + link_multi_times: false, edgelabel_type: 'NORMAL', + }, + }); + + render( + + ); + + expect(await screen.findByText('schema.edge.detail_failed')).toBeInTheDocument(); + expect(screen.getByRole('button', {name: 'OK'})).toBeDisabled(); + fireEvent.click(screen.getByRole('button', {name: 'schema.retry'})); + await waitFor(() => expect(api.manage.getMetaEdge).toHaveBeenCalledTimes(2)); + await waitFor(() => expect(screen.getByRole('button', {name: 'OK'})).toBeEnabled()); +}); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/ImageView.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/ImageView.js index d9b210d67..542da5b65 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Meta/ImageView.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/ImageView.js @@ -16,7 +16,7 @@ * under the License. */ -import {useEffect, useCallback, useState} from 'react'; +import {useEffect, useCallback, useRef, useState} from 'react'; import {useParams} from 'react-router-dom'; import * as api from '../../api'; import GraphView from '../../components/GraphinView'; @@ -24,7 +24,7 @@ import {EditPropertyLayer} from './Property/EditLayer'; import {EditVertexLayer} from './Vertex/EditLayer'; import {EditEdgeLayer} from './Edge/EditLayer'; import PropertyTable from './Property'; -import {Button, Row, Space, Col, Drawer} from 'antd'; +import {Alert, Button, Row, Space, Col, Drawer, Spin} from 'antd'; import {formatToGraphInData} from '../../utils/formatGraphInData'; import {useTranslation} from 'react-i18next'; @@ -41,6 +41,9 @@ const ImageView = () => { const [edgeName, setEdgeName] = useState(''); const [propertyList, setPropertyList] = useState([]); const [vertexList, setVertexList] = useState([]); + const [loading, setLoading] = useState(false); + const [loadError, setLoadError] = useState(false); + const requestToken = useRef(null); const [refresh, setRefresh] = useState(false); const handleRefresh = useCallback(() => { @@ -95,60 +98,102 @@ const ImageView = () => { } }, []); - useEffect(() => { - api.manage.getGraphView(graphspace, graph).then(res => { - if (res.status === 200) { - const {data} = res; - - setData(formatToGraphInData(data)); + const loadSchemaView = useCallback(() => { + const token = Symbol('schema-image'); + requestToken.current = token; + setData({nodes: [], edges: []}); + setVertexList([]); + setPropertyList([]); + setLoadError(false); + setLoading(true); + Promise.allSettled([ + api.manage.getGraphView(graphspace, graph), + api.manage.getMetaVertexList(graphspace, graph, {page_size: -1}), + api.manage.getMetaPropertyList(graphspace, graph, {page_size: -1}), + ]).then(results => { + if (requestToken.current !== token) { + return; } - }); - - api.manage.getMetaVertexList(graphspace, graph, {page_size: -1}).then(res => { - if (res.status === 200) { - setVertexList(res.data.records.map(item => ({label: item.name, value: item.name}))); + const [view, vertices, properties] = results; + const successful = results.every(result => result.status === 'fulfilled' + && result.value.status === 200); + if (!successful) { + setLoadError(true); + return; } - }); - - api.manage.getMetaPropertyList(graphspace, graph, {page_size: -1}).then(res => { - if (res.status === 200) { - setPropertyList(res.data.records.map(item => ({ - lable: item.name, - value: item.name, - data_type: item.data_type, - }))); + setData(formatToGraphInData(view.value.data)); + setVertexList(vertices.value.data.records.map(item => ({ + label: item.name, value: item.name, + }))); + setPropertyList(properties.value.data.records.map(item => ({ + label: item.name, + value: item.name, + data_type: item.data_type, + }))); + }).finally(() => { + if (requestToken.current === token) { + setLoading(false); } }); - }, [refresh, graph, graphspace]); + }, [graph, graphspace]); + + useEffect(() => { + loadSchemaView(); + return () => { + requestToken.current = null; + }; + }, [refresh, loadSchemaView]); return (
+ {loadError && ( + + {t('schema.retry')} + + )} + /> + )} {/*
*/}
- - - - + + + + - + + + { const [editLayerVisible, setEditLayerVisible] = useState(false); const [refresh, setRefresh] = useState(false); - const [data, setData] = useState([]); - const [pagination, setPagination] = useState({current: 1, total: 10}); const [selectedItems, setSelectedItems] = useState([]); const {graphspace, graph} = useParams(); const {t} = useTranslation(); @@ -76,9 +77,15 @@ const PropertyTable = ({noHeader, forceRefresh}) => { }); }, [graph, graphspace, refresh, t]); - const handleTable = useCallback(newPagination => { - setPagination(newPagination); - }, []); + const fetchPage = useCallback(params => api.manage.getMetaPropertyList( + graphspace, graph, params + ), [graphspace, graph]); + const {data, pagination, loading, error, retry, handleTable} = useMetaTable( + fetchPage, { + identityKey: `${graphspace}:${graph}`, + refreshKey: `${refresh}:${forceRefresh}`, + } + ); const handleDelete = useCallback(row => { removeProperty([row.name]); @@ -135,18 +142,6 @@ const PropertyTable = ({noHeader, forceRefresh}) => { }, ]; - useEffect(() => { - api.manage.getMetaPropertyList(graphspace, graph, { - page_no: pagination.current, - }).then(res => { - if (res.status === 200) { - setData(res.data.records); - setPagination({...pagination, total: res.data.total}); - } - }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [refresh, forceRefresh, pagination.current]); - return ( <> {!noHeader @@ -163,6 +158,8 @@ const PropertyTable = ({noHeader, forceRefresh}) => { )}
{noHeader} + +
{ rowKey={rowKey} pagination={pagination} onChange={handleTable} + loading={loading} /> {!noHeader diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/Vertex/EditLayer.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/Vertex/EditLayer.js index 30c33f2bf..4747d3310 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Meta/Vertex/EditLayer.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/Vertex/EditLayer.js @@ -16,8 +16,8 @@ * under the License. */ -import {Modal, Form, Input, Select, Row, Col, Checkbox, message, Spin} from 'antd'; -import {useEffect, useState, useCallback} from 'react'; +import {Alert, Button, Modal, Form, Input, Select, Row, Col, Checkbox, message, Spin} from 'antd'; +import {useEffect, useState, useCallback, useRef} from 'react'; import {useTranslation} from 'react-i18next'; import * as api from '../../../api'; import * as rules from '../../../utils/rules'; @@ -41,8 +41,43 @@ const EditVertexLayer = ({visible, onCancle, graphspace, graph, refresh, name, p const [primaryKeys, setPrimaryKeys] = useState([]); const [loading, setLoading] = useState(false); const [spinning, setSpinning] = useState(false); + const [detailError, setDetailError] = useState(false); + const detailRequest = useRef(null); const [form] = Form.useForm(); + const loadDetail = useCallback(() => { + const token = Symbol('vertex-detail'); + detailRequest.current = token; + setDetailError(false); + setSpinning(true); + api.manage.getMetaVertex(graphspace, graph, name).then(res => { + if (detailRequest.current !== token) { + return; + } + if (res.status !== 200) { + setDetailError(true); + return; + } + const {properties, property_indexes, id_strategy, primaryKeys} = res.data; + form.setFieldsValue(res.data); + setSelectedPropertyList(properties.map(item => ({ + ...item, label: item.name, value: item.name, + }))); + setExistProperties(properties); + setExistPropertyIndex(property_indexes); + setIdStrategy(id_strategy); + setPrimaryKeys(primaryKeys); + }).catch(() => { + if (detailRequest.current === token) { + setDetailError(true); + } + }).finally(() => { + if (detailRequest.current === token) { + setSpinning(false); + } + }); + }, [form, graph, graphspace, name]); + const handleIDStrategy = useCallback(value => { setIdStrategy(value); }, []); @@ -143,27 +178,11 @@ const EditVertexLayer = ({visible, onCancle, graphspace, graph, refresh, name, p return; } - setSpinning(true); - api.manage.getMetaVertex(graphspace, graph, name).then(res => { - if (res.status === 200) { - const {properties, property_indexes, id_strategy, primaryKeys} = res.data; - - form.setFieldsValue(res.data); - // form.setFields([{name: 'properties', value: properties}]); - - setSelectedPropertyList(properties.map(item => ({ - ...item, - label: item.name, - value: item.name, - }))); - setExistProperties(properties); - setExistPropertyIndex(property_indexes); - setIdStrategy(id_strategy); - setSpinning(false); - setPrimaryKeys(primaryKeys); - } - }); - }, [visible, name, form, graph, graphspace]); + loadDetail(); + return () => { + detailRequest.current = null; + }; + }, [visible, name, form, graph, graphspace, loadDetail]); return ( + {detailError && ( + {t('schema.retry')}} + /> + )} { const [editLayerVisible, setEditLayerVisible] = useState(false); - const [data, setData] = useState([]); - const [pagination, setPagination] = useState({current: 1, total: 10}); const [refresh, setRefresh] = useState(false); const [selectedItems, setSelectedItems] = useState([]); const [vertexName, setVertexName] = useState(''); @@ -38,9 +39,12 @@ const VertexTable = () => { const {graphspace, graph} = useParams(); const {t} = useTranslation(); - const handleTable = useCallback(newPagination => { - setPagination(newPagination); - }, []); + const fetchPage = useCallback(params => api.manage.getMetaVertexList( + graphspace, graph, params + ), [graphspace, graph]); + const {data, pagination, loading, error, retry, handleTable} = useMetaTable( + fetchPage, {identityKey: `${graphspace}:${graph}`, refreshKey: refresh} + ); const removeVertex = useCallback((names, isBatch) => { api.manage.checkMetaVertex(graphspace, graph, {names}, DELETE_REQUEST_CONFIG).then(res => { @@ -160,18 +164,6 @@ const VertexTable = () => { }, ]; - useEffect(() => { - api.manage.getMetaVertexList(graphspace, graph, { - page_no: pagination.current, - }).then(res => { - if (res.status === 200) { - setData(res.data.records); - setPagination({...pagination, total: res.data.total}); - } - }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [refresh, pagination.current]); - useEffect(() => { api.manage.getMetaPropertyList(graphspace, graph, {page_size: -1}).then(res => { if (res.status === 200) { @@ -194,6 +186,7 @@ const VertexTable = () => { +
{ pagination={pagination} onChange={handleTable} rowKey={rowKey} + loading={loading} /> { - const [data, setData] = useState([]); - const [pagination, setPagination] = useState({current: 1, total: 10}); const {graphspace, graph} = useParams(); const {t} = useTranslation(); - const handleTable = useCallback(newPagination => { - setPagination(newPagination); - }, []); + const fetchPage = useCallback(params => api.manage.getMetaVertexIndexList( + graphspace, graph, params + ), [graphspace, graph]); + const {data, pagination, loading, error, retry, handleTable} = useMetaTable( + fetchPage, {identityKey: `${graphspace}:${graph}`} + ); const columns = [ { @@ -54,18 +57,6 @@ const VertexIndexTable = () => { }, ]; - useEffect(() => { - api.manage.getMetaVertexIndexList(graphspace, graph, { - page_no: pagination.current, - }).then(res => { - if (res.status === 200) { - setData(res.data.records); - setPagination({...pagination, total: res.data.total}); - } - }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [pagination.current, graph, graphspace]); - return ( <> {/* @@ -74,11 +65,13 @@ const VertexIndexTable = () => { */} +
); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/common/MetaTableStatus.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/common/MetaTableStatus.js new file mode 100644 index 000000000..0555f7f05 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/common/MetaTableStatus.js @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {Alert, Button} from 'antd'; +import {useTranslation} from 'react-i18next'; + +const MetaTableStatus = ({error, onRetry}) => { + const {t} = useTranslation(); + if (!error) { + return null; + } + return ( + + {t('schema.retry')} + + )} + /> + ); +}; + +export default MetaTableStatus; diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/common/useMetaTable.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/common/useMetaTable.js new file mode 100644 index 000000000..53119a9ee --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/common/useMetaTable.js @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {useCallback, useEffect, useRef, useState} from 'react'; + +const useMetaTable = (fetchPage, {identityKey = '', refreshKey = ''} = {}) => { + const [data, setData] = useState([]); + const [pagination, setPagination] = useState({current: 1, total: 0}); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(false); + const requestToken = useRef(null); + const currentPage = pagination.current; + const resetKey = `${identityKey}:${refreshKey}`; + const previousResetKey = useRef(resetKey); + + const load = useCallback((requestedPage = currentPage) => { + const token = Symbol('meta-table'); + requestToken.current = token; + setData([]); + setError(false); + setLoading(true); + fetchPage({page_no: requestedPage}).then(res => { + if (requestToken.current !== token) { + return; + } + if (res.status !== 200) { + setError(true); + return; + } + const lastPage = Math.max(1, Math.ceil(res.data.total / 10)); + if (res.data.records.length === 0 && res.data.total > 0 + && requestedPage > lastPage) { + setPagination(current => ({ + ...current, current: lastPage, total: res.data.total, + })); + return; + } + setData(res.data.records); + setPagination(current => ({...current, total: res.data.total})); + }).catch(() => { + if (requestToken.current === token) { + setError(true); + } + }).finally(() => { + if (requestToken.current === token) { + setLoading(false); + } + }); + }, [currentPage, fetchPage]); + + useEffect(() => { + const contextChanged = previousResetKey.current !== resetKey; + previousResetKey.current = resetKey; + if (contextChanged && currentPage !== 1) { + requestToken.current = null; + setPagination(current => ({...current, current: 1})); + return undefined; + } + load(currentPage); + return () => { + requestToken.current = null; + }; + }, [currentPage, load, resetKey]); + + const handleTable = useCallback(next => setPagination(current => ({ + ...current, + current: next.current, + })), []); + + return {data, pagination, loading, error, retry: load, handleTable}; +}; + +export default useMetaTable; diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/common/useMetaTable.test.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/common/useMetaTable.test.js new file mode 100644 index 000000000..0853bc92e --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/common/useMetaTable.test.js @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {useCallback} from 'react'; +import {fireEvent, render, screen, waitFor} from '@testing-library/react'; +import useMetaTable from './useMetaTable'; + +const Harness = ({request, identityKey = 'graph-a', refreshKey = ''}) => { + const fetchPage = useCallback(params => request(params), [request]); + const {data, loading, error, retry, handleTable, pagination} = useMetaTable( + fetchPage, {identityKey, refreshKey} + ); + const goToPageThree = useCallback(() => handleTable({current: 3}), [handleTable]); + return ( + <> +
{loading ? 'loading' : 'settled'}
+
{error ? 'failed' : 'available'}
+
{data.map(item => item.name).join(',')}
+
page-{pagination.current}
+ + + + ); +}; + +test('separates request failure from empty success and recovers on retry', async () => { + const request = jest.fn() + .mockRejectedValueOnce(new Error('offline')) + .mockResolvedValueOnce({status: 200, data: {records: [], total: 0}}); + + render(); + + expect(await screen.findByText('failed')).toBeInTheDocument(); + expect(screen.getByText('settled')).toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', {name: 'retry'})); + await waitFor(() => expect(request).toHaveBeenCalledTimes(2)); + expect(await screen.findByText('available')).toBeInTheDocument(); + expect(await screen.findByText('settled')).toBeInTheDocument(); +}); + +test('ignores a late response from the previous table identity', async () => { + let resolveOld; + const oldRequest = jest.fn(() => new Promise(resolve => { + resolveOld = resolve; + })); + const currentRequest = jest.fn().mockResolvedValue({ + status: 200, + data: {records: [{name: 'current'}], total: 1}, + }); + const {rerender} = render(); + rerender(); + + expect(await screen.findByText('current')).toBeInTheDocument(); + resolveOld({status: 200, data: {records: [{name: 'old'}], total: 1}}); + await waitFor(() => expect(screen.queryByText('old')).not.toBeInTheDocument()); +}); + +test('resets page three to page one when the graph identity changes', async () => { + const firstRequest = jest.fn().mockResolvedValue({ + status: 200, data: {records: [{name: 'old'}], total: 30}, + }); + const nextRequest = jest.fn().mockResolvedValue({ + status: 200, data: {records: [{name: 'new'}], total: 1}, + }); + const {rerender} = render( + + ); + await screen.findByText('old'); + fireEvent.click(screen.getByRole('button', {name: 'page 3'})); + await waitFor(() => expect(firstRequest).toHaveBeenLastCalledWith({page_no: 3})); + + rerender(); + expect(await screen.findByText('new')).toBeInTheDocument(); + expect(nextRequest).toHaveBeenCalledWith({page_no: 1}); + expect(nextRequest).toHaveBeenCalledTimes(1); + expect(screen.getByText('page-1')).toBeInTheDocument(); +}); + +test('falls back to the last valid page after deleting the final page', async () => { + const request = jest.fn(params => Promise.resolve(params.page_no === 3 + ? {status: 200, data: {records: [], total: 11}} + : {status: 200, data: {records: [{name: 'last'}], total: 11}})); + render(); + await screen.findByText('last'); + fireEvent.click(screen.getByRole('button', {name: 'page 3'})); + + await waitFor(() => expect(request).toHaveBeenCalledWith({page_no: 2})); + expect(await screen.findByText('page-2')).toBeInTheDocument(); + expect(await screen.findByText('last')).toBeInTheDocument(); +}); From bd2dd79acf5c1ac51effd7f1c810e304007594ee Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 11:32:36 +0800 Subject: [PATCH 65/68] fix(hubble): recover system workspace states - preserve loading, failure and retry contracts across system pages - prevent stale profile, task and metadata responses from leaking - replace click-only controls with keyboard-accessible actions - localize login, recovery and unknown-route semantics - add focused accessibility and race regression coverage --- .../src/accessible-click-actions.test.js | 45 +++++++ hugegraph-hubble/hubble-fe/src/api/auth.js | 4 +- .../src/components/ColorSelect/index.js | 34 ++++- .../components/ColorSelect/index.module.scss | 8 +- .../src/components/ColorSelect/index.test.js | 34 +++++ .../src/components/FormListAction/index.js | 30 +++++ .../src/components/KeyboardAction/index.js | 32 +++++ .../components/KeyboardAction/index.test.js | 39 ++++++ .../src/components/RowActionButton/index.js | 17 +++ .../i18n/resources/en-US/modules/modules.json | 2 + .../i18n/resources/en-US/modules/pages.json | 23 ++++ .../i18n/resources/zh-CN/modules/modules.json | 2 + .../i18n/resources/zh-CN/modules/pages.json | 23 ++++ .../algorithm/LogsDetail/ExecuteLog/index.js | 6 +- .../algorithm/LogsDetail/Favorite/index.js | 12 +- .../algorithmsForm/Oltp/AllPaths/index.js | 9 +- .../PathPatternForm/index.js | 9 +- .../Oltp/CustomizedPaths/StepItem/index.js | 9 +- .../algorithmsForm/Oltp/Egonet/index.js | 9 +- .../Oltp/JaccardSimilarityPost/index.js | 9 +- .../Oltp/KneighborPost/index.js | 9 +- .../Oltp/KoutPost/StepFormItem/index.js | 9 +- .../Oltp/MultiNodesShortestPath/index.js | 9 +- .../Oltp/NeighborRankApi/index.js | 9 +- .../Oltp/TemplatePaths/StepFormItem/index.js | 9 +- .../algorithmsForm/StepsItems/index.js | 9 +- .../algorithmsForm/VerticesItems/index.js | 9 +- .../analysis/LogsDetail/ExecuteLog/index.js | 10 +- .../analysis/LogsDetail/Favorite/index.js | 14 +- .../analysis/QueryBar/ContentCommon/index.js | 9 +- .../src/modules/asyncTasks/Detail/index.js | 30 +++-- .../component/ClosePanelButton/index.js | 9 +- .../modules/component/EditElement/index.js | 8 +- .../src/modules/component/NewConfig/index.js | 9 +- .../component/TaskNavigateView/index.js | 5 +- .../pages/Account/account-recovery.test.js | 55 ++++++++ .../hubble-fe/src/pages/Account/index.js | 106 +++++++++++---- .../hubble-fe/src/pages/Datasource/index.js | 29 ++-- .../hubble-fe/src/pages/Error404/index.js | 21 +-- .../src/pages/Error404/index.test.js | 25 ++++ .../hubble-fe/src/pages/Graph/Card.js | 60 +++++++-- .../pages/Graph/default-card-actions.test.js | 7 +- .../hubble-fe/src/pages/Graph/index.js | 89 +++++++++---- .../hubble-fe/src/pages/GraphSpace/Card.js | 38 +++++- .../GraphSpace/graphspace-recovery.test.js | 55 ++++++++ .../hubble-fe/src/pages/GraphSpace/index.js | 124 ++++++++++++++---- .../hubble-fe/src/pages/Login/index.js | 8 +- .../pages/Login/login-request-error.test.js | 14 ++ .../hubble-fe/src/pages/Meta/Edge/index.js | 10 +- .../src/pages/Meta/Property/index.js | 6 +- .../hubble-fe/src/pages/Meta/Vertex/index.js | 8 +- .../src/pages/Meta/common/RelateProperty.js | 29 ++-- .../pages/Meta/common/RelatePropertyIndex.js | 59 +++++---- .../hubble-fe/src/pages/Meta/index.js | 105 ++++++++++----- .../src/pages/Meta/meta-recovery.test.js | 63 +++++++++ .../hubble-fe/src/pages/My/index.js | 80 ++++++++--- .../src/pages/My/my-recovery.test.js | 91 +++++++++++++ .../hubble-fe/src/pages/Schema/index.js | 6 +- .../src/pages/Task/components/ViewLayer.js | 64 +++++++-- .../pages/Task/components/ViewLayer.test.js | 63 +++++++++ .../src/pages/TaskEdit/MappingForm/index.js | 8 +- 61 files changed, 1445 insertions(+), 291 deletions(-) create mode 100644 hugegraph-hubble/hubble-fe/src/accessible-click-actions.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/FormListAction/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/KeyboardAction/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/KeyboardAction/index.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/components/RowActionButton/index.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Account/account-recovery.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Error404/index.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/GraphSpace/graphspace-recovery.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Meta/meta-recovery.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/My/my-recovery.test.js create mode 100644 hugegraph-hubble/hubble-fe/src/pages/Task/components/ViewLayer.test.js diff --git a/hugegraph-hubble/hubble-fe/src/accessible-click-actions.test.js b/hugegraph-hubble/hubble-fe/src/accessible-click-actions.test.js new file mode 100644 index 000000000..503e06be8 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/accessible-click-actions.test.js @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import fs from 'fs'; +import path from 'path'; + +const roots = [ + 'pages/Graph', 'pages/GraphSpace', 'pages/Schema', 'pages/Datasource', + 'pages/Task', 'pages/TaskEdit', 'pages/TaskDetail', 'pages/Meta', 'pages/My', + 'pages/Account', 'pages/Login', 'pages/Error404', 'modules/analysis', + 'modules/algorithm', 'modules/asyncTasks', 'modules/component', + 'components/ColorSelect', 'components/KeyboardAction', + 'components/FormListAction', 'components/RowActionButton', +]; + +const collectSourceFiles = directory => fs.readdirSync(directory, {withFileTypes: true}) + .flatMap(entry => { + const target = path.join(directory, entry.name); + if (entry.isDirectory()) { + return collectSourceFiles(target); + } + return /\.(js|jsx)$/.test(entry.name) && !/\.test\./.test(entry.name) + ? [target] : []; + }); + +test('reachable workbench actions do not use click-only anchors or containers', () => { + const offenders = roots.flatMap(root => collectSourceFiles(path.join(__dirname, root))) + .filter(file => { + const source = fs.readFileSync(file, 'utf8'); + if (/]*\bonClick=/s.test(source)) { + return true; + } + return [...source.matchAll(/<(?:span|div)\b[^>]*\bonClick=[^>]*>/gs)] + .some(match => !/\bonKeyDown=/.test(match[0]) + || !/\brole=/.test(match[0]) + || !/\btabIndex=/.test(match[0])); + }) + .map(file => path.relative(__dirname, file)); + + expect(offenders).toEqual([]); +}); diff --git a/hugegraph-hubble/hubble-fe/src/api/auth.js b/hugegraph-hubble/hubble-fe/src/api/auth.js index 9cbe1b0ca..3987b2042 100644 --- a/hugegraph-hubble/hubble-fe/src/api/auth.js +++ b/hugegraph-hubble/hubble-fe/src/api/auth.js @@ -160,8 +160,8 @@ export { getRoleUser, addRoleUser, addRoleUserBatch, delRoleUser, delRoleUserBatch, }; -const getPersonal = () => { - return request.get('/auth/users/getpersonal'); +const getPersonal = config => { + return request.get('/auth/users/getpersonal', config); }; const updatePersonal = data => { diff --git a/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.js b/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.js index 950b45452..707d340e0 100644 --- a/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.js +++ b/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.js @@ -17,13 +17,17 @@ * under the License. */ -import {useCallback, useEffect, useState} from 'react'; +import {useCallback, useEffect, useId, useRef, useState} from 'react'; import {ChromePicker} from 'react-color'; import styles from './index.module.scss'; +import {useTranslation} from 'react-i18next'; const InputColorSelect = ({value, onChange, disable}) => { + const {t} = useTranslation(); const [visible, setVisible] = useState(false); const [color, setColor] = useState('#5c73e6'); + const triggerRef = useRef(null); + const pickerId = useId(); const showPicker = useCallback(() => { if (disable) { @@ -39,8 +43,16 @@ const InputColorSelect = ({value, onChange, disable}) => { } setVisible(false); + triggerRef.current?.focus(); }, [disable]); + const handleKeyDown = useCallback(event => { + if (event.key === 'Escape' && visible) { + event.preventDefault(); + hidePicker(); + } + }, [hidePicker, visible]); + const handleClick = useCallback(color => { if (disable) { return; @@ -58,19 +70,29 @@ const InputColorSelect = ({value, onChange, disable}) => { }, [value]); return ( -
+
{disable ?
: null}
-
{visible ? ( -
-
+
+
) : null} diff --git a/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.module.scss b/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.module.scss index 0f507782f..742d6af26 100644 --- a/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.module.scss +++ b/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.module.scss @@ -39,6 +39,9 @@ width: 46px; height: 18px; border-radius: 2px; + border: 0; + padding: 0; + cursor: pointer; } .swatch { @@ -61,5 +64,8 @@ top: 0; right: 0; bottom: 0; - left: 0, + left: 0; + border: 0; + padding: 0; + background: transparent; } diff --git a/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.test.js b/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.test.js new file mode 100644 index 000000000..2f5698852 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/ColorSelect/index.test.js @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {render, screen} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import {InputColorSelect} from './index'; + +jest.mock('react-i18next', () => ({ + useTranslation: () => ({t: key => key}), +})); + +jest.mock('react-color', () => ({ + ChromePicker: () =>
picker content
, +})); + +test('opens and closes the color picker with keyboard state and focus recovery', async () => { + render(); + + const trigger = screen.getByRole('button', {name: 'style_config.color_picker'}); + expect(trigger).toHaveAttribute('aria-expanded', 'false'); + + trigger.focus(); + await userEvent.keyboard('{Enter}'); + expect(screen.getByText('picker content')).toBeInTheDocument(); + expect(trigger).toHaveAttribute('aria-expanded', 'true'); + + await userEvent.keyboard('{Escape}'); + expect(screen.queryByText('picker content')).not.toBeInTheDocument(); + expect(trigger).toHaveFocus(); +}); diff --git a/hugegraph-hubble/hubble-fe/src/components/FormListAction/index.js b/hugegraph-hubble/hubble-fe/src/components/FormListAction/index.js new file mode 100644 index 000000000..f0c040ddb --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/FormListAction/index.js @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {Button} from 'antd'; +import {useCallback} from 'react'; + +const FormListRemove = ({remove, index, afterRemove, children}) => { + const handleClick = useCallback(() => { + remove(index); + afterRemove?.(); + }, [afterRemove, index, remove]); + + return ; +}; + +const FormListAdd = ({add, children}) => { + const handleClick = useCallback(() => add(), [add]); + + return ( + + ); +}; + +export {FormListAdd, FormListRemove}; diff --git a/hugegraph-hubble/hubble-fe/src/components/KeyboardAction/index.js b/hugegraph-hubble/hubble-fe/src/components/KeyboardAction/index.js new file mode 100644 index 000000000..57a2c4781 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/KeyboardAction/index.js @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {useCallback} from 'react'; + +const KeyboardAction = ({onAction, className, children, ...rest}) => { + const handleKeyDown = useCallback(event => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + onAction(); + } + }, [onAction]); + + return ( +
+ {children} +
+ ); +}; + +export default KeyboardAction; diff --git a/hugegraph-hubble/hubble-fe/src/components/KeyboardAction/index.test.js b/hugegraph-hubble/hubble-fe/src/components/KeyboardAction/index.test.js new file mode 100644 index 000000000..b8072b058 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/KeyboardAction/index.test.js @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {useCallback, useState} from 'react'; +import {render, screen} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import KeyboardAction from './index'; + +const ExpandableAction = () => { + const [expanded, setExpanded] = useState(false); + const toggle = useCallback(() => setExpanded(value => !value), []); + + return ( + + Toggle details + + ); +}; + +test('exposes state and supports Enter and Space activation', async () => { + render(); + + const action = screen.getByRole('button', {name: 'Toggle details'}); + expect(action).toHaveAttribute('aria-expanded', 'false'); + + action.focus(); + await userEvent.keyboard('{Enter}'); + expect(action).toHaveAttribute('aria-expanded', 'true'); + + await userEvent.keyboard(' '); + expect(action).toHaveAttribute('aria-expanded', 'false'); +}); diff --git a/hugegraph-hubble/hubble-fe/src/components/RowActionButton/index.js b/hugegraph-hubble/hubble-fe/src/components/RowActionButton/index.js new file mode 100644 index 000000000..30bded79a --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/components/RowActionButton/index.js @@ -0,0 +1,17 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {Button} from 'antd'; +import {useCallback} from 'react'; + +const RowActionButton = ({onAction, value, children}) => { + const handleClick = useCallback(() => onAction(value), [onAction, value]); + + return ; +}; + +export default RowActionButton; diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/modules.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/modules.json index 2677f6a40..be01f95fd 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/modules.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/modules.json @@ -201,6 +201,8 @@ }, "style_config": { "title": "Style Config", + "color_picker": "Choose color", + "close_color_picker": "Close color picker", "vertex_style": "Vertex Style", "edge_style": "Edge Style", "vertex_appearance": "Vertex Appearance", diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json index 10f49021c..5515aff6f 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/pages.json @@ -85,6 +85,10 @@ }, "graphspace": { "title": "Graph Space Management", + "load": { + "unavailable": "Unable to load the GraphSpace list.", + "retry": "Retry GraphSpaces" + }, "create": "Create Graph Space", "search_placeholder": "Search by graph space name", "set_default_confirm": "Confirm changing the default graph space?", @@ -264,6 +268,10 @@ }, "account": { "title": "Account Management", + "load": { + "unavailable": "Unable to load the account list.", + "retry": "Retry accounts" + }, "create": "Create Account", "delete_confirm": "Confirm deleting account {{name}}?", "col": { @@ -295,6 +303,10 @@ "my": { "title": "My Profile", "edit_profile_title": "Edit Profile", + "load": { + "unavailable": "Unable to load your profile.", + "retry": "Retry profile" + }, "col": { "id": "Account ID", "name": "Account Name", @@ -418,6 +430,8 @@ }, "view": { "title": "View Task", + "unavailable": "Unable to load the current task details.", + "retry": "Retry task details", "name": "Task Name", "source_type": "Source Type", "target_space": "Target Space", @@ -581,6 +595,11 @@ "retry": "Retry schema data", "delete_failed": "Delete failed. Check the server connection and retry.", "title": "Metadata Management", + "identity": { + "graph_unavailable": "Unable to load the current graph.", + "graphspace_unavailable": "Unable to load the current GraphSpace.", + "retry": "Retry graph context" + }, "name_placeholder": "Letters, numbers, underscores, and Chinese characters are allowed", "delete_irreversible": "This action cannot be undone. Please proceed with caution.", "delete_task_hint": "Deleting metadata may take a while. Check Task Management for progress.", @@ -791,6 +810,10 @@ "dashboard_unavailable": "Dashboard is unavailable. Check dashboard.address and service health.", "dashboard_popup_blocked": "The Dashboard window was blocked. Allow pop-ups and retry." }, + "not_found": { + "subtitle": "Page not found", + "home": "Return home" + }, "login": { "submit": "Sign In", "username": "Username", diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/modules.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/modules.json index c33fd51e1..617729b18 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/modules.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/modules.json @@ -201,6 +201,8 @@ }, "style_config": { "title": "样式配置", + "color_picker": "选择颜色", + "close_color_picker": "关闭颜色选择器", "vertex_style": "顶点样式", "edge_style": "边样式", "vertex_appearance": "点外观", diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json index bc42fdc8f..b058d3f59 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/pages.json @@ -85,6 +85,10 @@ }, "graphspace": { "title": "图空间管理", + "load": { + "unavailable": "无法加载图空间列表。", + "retry": "重试图空间列表" + }, "create": "创建图空间", "search_placeholder": "请输入图空间名称", "set_default_confirm": "确认更改图空间的默认设置?", @@ -264,6 +268,10 @@ }, "account": { "title": "账号管理", + "load": { + "unavailable": "无法加载账号列表。", + "retry": "重试账号列表" + }, "create": "创建账号", "delete_confirm": "确定要删除账号 {{name}}吗?", "col": { @@ -295,6 +303,10 @@ "my": { "title": "个人中心", "edit_profile_title": "编辑信息", + "load": { + "unavailable": "无法加载个人资料。", + "retry": "重试个人资料" + }, "col": { "id": "账号ID", "name": "账号名", @@ -418,6 +430,8 @@ }, "view": { "title": "查看任务", + "unavailable": "无法加载当前任务详情。", + "retry": "重试任务详情", "name": "任务名称", "source_type": "源数据类型", "target_space": "目标图空间", @@ -581,6 +595,11 @@ "retry": "重试 Schema 数据", "delete_failed": "删除失败,请检查 Server 连接后重试。", "title": "元数据管理", + "identity": { + "graph_unavailable": "无法加载当前图信息。", + "graphspace_unavailable": "无法加载当前 GraphSpace 信息。", + "retry": "重试图上下文" + }, "name_placeholder": "允许出现中英文、数字、下划线", "delete_irreversible": "删除后无法恢复,请谨慎操作。", "delete_task_hint": "删除元数据耗时较久,详情可在任务管理中查看", @@ -791,6 +810,10 @@ "dashboard_unavailable": "Dashboard 不可用,请检查 dashboard.address 配置和服务健康状态。", "dashboard_popup_blocked": "Dashboard 窗口被拦截,请允许弹出式窗口后重试。" }, + "not_found": { + "subtitle": "页面不存在", + "home": "返回首页" + }, "login": { "submit": "登录", "username": "用户名", diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.js index 1d65531b2..310309e02 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/ExecuteLog/index.js @@ -22,7 +22,7 @@ import React, {useState, useCallback} from 'react'; import {useTranslation} from 'react-i18next'; -import {Table, Space, Tag, Input, Popconfirm} from 'antd'; +import {Button, Table, Space, Tag, Input, Popconfirm} from 'antd'; import ExecutionContent from '../../../../components/ExecutionContent'; import c from './index.module.scss'; @@ -173,9 +173,9 @@ const ExecuteLog = props => { okText={t('analysis.logs.action.favorite')} cancelText={t('common.action.cancel')} > - +
); diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.js index 97b1dd1f2..dbbbe8aeb 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/LogsDetail/Favorite/index.js @@ -23,7 +23,7 @@ import React, {useState, useCallback} from 'react'; import {useTranslation} from 'react-i18next'; import Highlighter from 'react-highlight-words'; -import {Table, Input, Popconfirm, Modal} from 'antd'; +import {Button, Table, Input, Popconfirm, Modal} from 'antd'; import ExecutionContent from '../../../../components/ExecutionContent'; import c from './index.module.scss'; @@ -162,19 +162,21 @@ const Favorite = props => { okButtonProps={{disabled: isDisabledName}} cancelText={t('common.action.cancel')} > - {t('analysis.logs.action.edit_name')} - + - {t('common.action.delete')} - +
); }, diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/AllPaths/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/AllPaths/index.js index fde2f40ed..16b47523a 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/AllPaths/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/AllPaths/index.js @@ -30,6 +30,7 @@ import MaxDepthItem from '../../MaxDepthItem'; import NearestItem from '../../NearestItem'; import MaxDegreeItem from '../../MaxDegreeItem'; import CapacityItem from '../../CapacityItem'; +import KeyboardAction from '../../../../../components/KeyboardAction'; import LimitItem from '../../LimitItem'; import _ from 'lodash'; import * as api from '../../../../../api'; @@ -144,7 +145,11 @@ const AllPaths = props => { const stepFormItems = (
-
+
{stepVisible ? : }
@@ -157,7 +162,7 @@ const AllPaths = props => {
-
+
() => handler(); const createValueHandler = (handler, value) => () => handler(value); @@ -134,7 +135,11 @@ const PathPatternsFormItems = () => { return ( <> -
+
{patternVisible ? : }
@@ -147,7 +152,7 @@ const PathPatternsFormItems = () => {
-
+
{renderPathPatterns('path_patterns')}
diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedPaths/StepItem/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedPaths/StepItem/index.js index e1018049a..b80aabe7e 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedPaths/StepItem/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/CustomizedPaths/StepItem/index.js @@ -27,6 +27,7 @@ import {useTranslation} from 'react-i18next'; import {integerValidator, propertiesValidator} from '../../../utils'; import classnames from 'classnames'; import s from '../../OltpItem/index.module.scss'; +import KeyboardAction from '../../../../../../components/KeyboardAction'; const createActionHandler = handler => () => handler(); const createValueHandler = (handler, value) => () => handler(value); @@ -165,7 +166,11 @@ const StepItem = () => { return (
-
+
{stepVisible ? : }
@@ -178,7 +183,7 @@ const StepItem = () => {
-
+
{renderStepsFormItems()}
diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Egonet/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Egonet/index.js index c14f11c8e..7b3af0dba 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Egonet/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/Egonet/index.js @@ -36,6 +36,7 @@ import GraphAnalysisContext from '../../../../Context'; import classnames from 'classnames'; import _ from 'lodash'; import s from '../OltpItem/index.module.scss'; +import KeyboardAction from '../../../../../components/KeyboardAction'; const {EGONET} = ALGORITHM_NAME; const {LOADING, SUCCESS, FAILED} = GRAPH_STATUS; @@ -144,7 +145,11 @@ const Egonet = props => { const renderStepItems = param => { return (
-
+
{stepVisible ? : }
@@ -157,7 +162,7 @@ const Egonet = props => {
-
+
{ const stepFormItems = ( <> -
+
{stepVisible ? : }
@@ -173,7 +178,7 @@ const JaccardSimilarityPost = props => {
-
+
{ const stepFormItems = () => { return ( <> -
+
{stepVisible ? : }
@@ -186,7 +191,7 @@ const KneighborPost = props => {
-
+
{ const {t} = useTranslation(); @@ -51,7 +52,11 @@ const StepFormItem = () => { return ( <> -
+
{stepVisible ? : }
@@ -64,7 +69,7 @@ const StepFormItem = () => {
-
+
{ const renderSteps = () => { return (
-
+
{stepVisible ? : }
@@ -196,7 +201,7 @@ const MultiNodesShortestPath = props => {
-
+
{stepFormItems()}
diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/NeighborRankApi/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/NeighborRankApi/index.js index 8dc55140b..3644046d3 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/NeighborRankApi/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/NeighborRankApi/index.js @@ -33,6 +33,7 @@ import {GRAPH_STATUS, Algorithm_Url, ALGORITHM_NAME} from '../../../../../utils/ import {integerValidator, topValidator, alphaValidator, positiveIntegerValidator} from '../../utils'; import classnames from 'classnames'; import s from '../OltpItem/index.module.scss'; +import KeyboardAction from '../../../../../components/KeyboardAction'; const {NEIGHBOR_RANK_API} = ALGORITHM_NAME; const {LOADING, SUCCESS, FAILED} = GRAPH_STATUS; @@ -223,7 +224,11 @@ const NeighborRankApi = props => { const renderSteps = () => { return (
-
+
{stepVisible ? : }
@@ -236,7 +241,7 @@ const NeighborRankApi = props => {
-
+
{renderStepsFormItems()}
diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/TemplatePaths/StepFormItem/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/TemplatePaths/StepFormItem/index.js index afbf8c272..012160801 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/TemplatePaths/StepFormItem/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/Oltp/TemplatePaths/StepFormItem/index.js @@ -27,6 +27,7 @@ import {DownOutlined, RightOutlined, PlusOutlined, QuestionCircleOutlined} from import {integerValidator, propertiesValidator} from '../../../utils'; import classnames from 'classnames'; import s from '../../OltpItem/index.module.scss'; +import KeyboardAction from '../../../../../../components/KeyboardAction'; const createActionHandler = handler => () => handler(); const createValueHandler = (handler, value) => () => handler(value); @@ -152,7 +153,11 @@ const StepFormItem = () => { return (
-
+
{stepVisible ? : }
@@ -165,7 +170,7 @@ const StepFormItem = () => {
-
+
{renderStepsFormItems()}
diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/StepsItems/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/StepsItems/index.js index 7cce49a00..feed93786 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/StepsItems/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/StepsItems/index.js @@ -27,6 +27,7 @@ import {RightOutlined, DownOutlined, PlusOutlined, QuestionCircleOutlined} from import {propertiesValidator} from '../utils'; import classnames from 'classnames'; import c from './index.module.scss'; +import KeyboardAction from '../../../../components/KeyboardAction'; const createValueHandler = (handler, value) => () => handler(value); const createAddHandler = (add, setItemVisible) => () => { @@ -80,7 +81,11 @@ const StepsItems = props => { > {(lists, {add, remove}, {errors}) => (
-
+
{itemVisible ? : }
@@ -93,7 +98,7 @@ const StepsItems = props => {
-
+ { lists.map((item, name, index) => { diff --git a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/VerticesItems/index.js b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/VerticesItems/index.js index f8ec34971..93234494c 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/VerticesItems/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/algorithm/algorithmsForm/VerticesItems/index.js @@ -27,6 +27,7 @@ import {RightOutlined, DownOutlined, QuestionCircleOutlined} from '@ant-design/i import {propertiesValidator} from '../utils'; import classnames from 'classnames'; import c from './index.module.scss'; +import KeyboardAction from '../../../../components/KeyboardAction'; const VerticesItems = props => { const {t} = useTranslation(); @@ -46,7 +47,11 @@ const VerticesItems = props => { return (
-
+
{itemVisible ? : }
@@ -59,7 +64,7 @@ const VerticesItems = props => {
-
+
{ okText={t('analysis.logs.action.favorite')} cancelText={t('common.action.cancel')} > - {t('analysis.logs.action.favorite')} + - +
); }; diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/LogsDetail/Favorite/index.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/LogsDetail/Favorite/index.js index 5706e9ddf..ae6d74f41 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/analysis/LogsDetail/Favorite/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/LogsDetail/Favorite/index.js @@ -22,7 +22,7 @@ import React, {useState, useCallback} from 'react'; import {useTranslation} from 'react-i18next'; -import {Table, Input, Popconfirm, Modal} from 'antd'; +import {Button, Table, Input, Popconfirm, Modal} from 'antd'; import ExecutionContent from '../../../../components/ExecutionContent'; import Highlighter from 'react-highlight-words'; import c from './index.module.scss'; @@ -56,9 +56,9 @@ const FavoriteActions = props => { return (
- + { okButtonProps={{disabled: isDisabledName}} cancelText={t('common.action.cancel')} > - + - +
); }; diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/ContentCommon/index.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/ContentCommon/index.js index c5aa0db32..46195c1cd 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/ContentCommon/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/ContentCommon/index.js @@ -29,6 +29,7 @@ import GraphAnalysisContext from '../../../Context'; import classnames from 'classnames'; import c from './index.module.scss'; import * as api from '../../../../api/index'; +import KeyboardAction from '../../../../components/KeyboardAction'; const FAVORITE_TYPE = { Gremlin: 'GREMLIN', @@ -235,9 +236,13 @@ const ContentCommon = props => {
-
+ {renderCollapseHeader()} -
+
); }; diff --git a/hugegraph-hubble/hubble-fe/src/modules/asyncTasks/Detail/index.js b/hugegraph-hubble/hubble-fe/src/modules/asyncTasks/Detail/index.js index 589556826..c4c7141f9 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/asyncTasks/Detail/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/asyncTasks/Detail/index.js @@ -41,6 +41,16 @@ const {Text} = Typography; const {FAILED, SUCCESS, DELETING, CANCELLING} = Async_Taskt_Status; +const TaskAction = ({onAction, args, children}) => { + const handleClick = useCallback(() => onAction(...args), [args, onAction]); + + return ( + + ); +}; + const AsyncTaskDetail = props => { const {t} = useTranslation(); const { @@ -148,7 +158,7 @@ const AsyncTaskDetail = props => { abortAsyncTaskById(taskId); }, [abortAsyncTaskById]); - const onDeleteConfirm = id => { + const onDeleteConfirm = useCallback(id => { Modal.confirm({ title: t('analysis.async_task.delete_confirm_title'), content: t('analysis.async_task.delete_confirm_content'), @@ -156,7 +166,7 @@ const AsyncTaskDetail = props => { cancelText: t('common.action.cancel'), onOk: () => deleteTaskByIds([id]), }); - }; + }, [deleteTaskByIds, t]); const onMassDeleteConfirm = useCallback(() => { Modal.confirm({ @@ -252,22 +262,26 @@ const AsyncTaskDetail = props => { )} {isAllowCheckRes && ( - viewResult(result, rowData, index)}> + {resultText} - + )} {!isAllowAbort && ( status === DELETING ? - : onDeleteConfirm(taskId)}>{delText} + : ( + + {delText} + + ) )} {isAllowAbort && ( - onAbortTaskHandler(taskId)}> + {abort} - + )} {status === CANCELLING && ( - +
{aborting}
)}
); diff --git a/hugegraph-hubble/hubble-fe/src/modules/component/ClosePanelButton/index.js b/hugegraph-hubble/hubble-fe/src/modules/component/ClosePanelButton/index.js index df6448fc7..c8a4ccdc3 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/component/ClosePanelButton/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/component/ClosePanelButton/index.js @@ -24,6 +24,7 @@ import React, {useCallback} from 'react'; import {DoubleRightOutlined} from '@ant-design/icons'; import c from './index.module.scss'; import classnames from 'classnames'; +import KeyboardAction from '../../../components/KeyboardAction'; const PanelControlButton = props => { const { @@ -44,9 +45,13 @@ const PanelControlButton = props => { ); return ( -
+ -
+ ); }; diff --git a/hugegraph-hubble/hubble-fe/src/modules/component/EditElement/index.js b/hugegraph-hubble/hubble-fe/src/modules/component/EditElement/index.js index 78d6d3870..b56a3c31f 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/component/EditElement/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/component/EditElement/index.js @@ -31,6 +31,7 @@ import * as api from '../../../api/index'; import _ from 'lodash'; import c from './index.module.scss'; import classnames from 'classnames'; +import KeyboardAction from '../../../components/KeyboardAction'; const SELECTED_TYPE = {EDGE: 'EDGE', VERTEX: 'VERTEX'}; @@ -161,13 +162,16 @@ const EditElement = props => { <>
{t('analysis.canvas.edit_element.edge_relation')}:
-
+ {showEdgeLabelExpand && (isExpandEdgeLabelType ? : )} {parent_label} {t('analysis.canvas.edit_element.parent_edge')} -
+
{isExpandEdgeLabelType && children?.map(item => diff --git a/hugegraph-hubble/hubble-fe/src/modules/component/NewConfig/index.js b/hugegraph-hubble/hubble-fe/src/modules/component/NewConfig/index.js index e6d14fc99..bd8daa997 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/component/NewConfig/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/component/NewConfig/index.js @@ -52,15 +52,18 @@ const NewConfig = props => { items: [ { key: '1', - label: ({t('analysis.canvas.add_vertex')}), + label: t('analysis.canvas.add_vertex'), + onClick: handleClickNewNode, }, { key: '2', - label: ( handleClickNewEdge(false)}>{t('analysis.canvas.add_in_edge')}), + label: t('analysis.canvas.add_in_edge'), + onClick: () => handleClickNewEdge(false), }, { key: '3', - label: ( handleClickNewEdge(true)}>{t('analysis.canvas.add_out_edge')}), + label: t('analysis.canvas.add_out_edge'), + onClick: () => handleClickNewEdge(true), }, ], }; diff --git a/hugegraph-hubble/hubble-fe/src/modules/component/TaskNavigateView/index.js b/hugegraph-hubble/hubble-fe/src/modules/component/TaskNavigateView/index.js index 9a1028239..fb5097da7 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/component/TaskNavigateView/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/component/TaskNavigateView/index.js @@ -25,6 +25,7 @@ import {useTranslation} from 'react-i18next'; import FinishedIcon from '../../../assets/ic_done_144.svg'; import {useNavigate} from 'react-router-dom'; import c from './index.module.scss'; +import {Button} from 'antd'; const TaskNavigateView = props => { const {t} = useTranslation(); @@ -52,9 +53,9 @@ const TaskNavigateView = props => { {message} {t('analysis.canvas.task_navigation.task_id')}: {taskId} - +
); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Account/account-recovery.test.js b/hugegraph-hubble/hubble-fe/src/pages/Account/account-recovery.test.js new file mode 100644 index 000000000..5075954a7 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/pages/Account/account-recovery.test.js @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {render, screen} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import Account from './index'; +import * as api from '../../api'; + +jest.mock('react-i18next', () => ({ + useTranslation: () => ({t: key => key}), +})); + +jest.mock('../../api', () => ({ + auth: { + getAllUserList: jest.fn(), + delUser: jest.fn(), + }, +})); + +jest.mock('../../utils/user', () => ({getUser: () => ({id: 'admin'})})); +jest.mock('./EditLayer', () => () => null); + +beforeEach(() => { + jest.clearAllMocks(); + window.matchMedia = jest.fn().mockImplementation(query => ({ + matches: false, + media: query, + addListener: jest.fn(), + removeListener: jest.fn(), + })); +}); + +test('does not present a failed account request as an empty user table', async () => { + api.auth.getAllUserList + .mockRejectedValueOnce(new Error('down')) + .mockResolvedValueOnce({ + status: 200, + data: {records: [{user_name: 'analyst'}], total: 1}, + }); + + render(); + + expect(await screen.findByText('account.load.unavailable')).toBeInTheDocument(); + expect(screen.queryByText('analyst')).not.toBeInTheDocument(); + + await userEvent.click(screen.getByRole('button', {name: 'account.load.retry'})); + + expect(await screen.findByText('analyst')).toBeInTheDocument(); + expect(screen.queryByText('account.load.unavailable')).not.toBeInTheDocument(); + expect(screen.getByRole('button', {name: 'common.action.detail'})).toBeInTheDocument(); +}); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Account/index.js b/hugegraph-hubble/hubble-fe/src/pages/Account/index.js index df51f6d6a..160a80fea 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Account/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Account/index.js @@ -17,6 +17,7 @@ */ import { + Alert, PageHeader, Button, Space, @@ -25,7 +26,7 @@ import { Tooltip, Modal, } from 'antd'; -import {useCallback, useEffect, useState} from 'react'; +import {useCallback, useEffect, useRef, useState} from 'react'; import {useTranslation} from 'react-i18next'; import TableHeader from '../../components/TableHeader'; import EditLayer from './EditLayer'; @@ -34,32 +35,41 @@ import {getUser} from '../../utils/user'; const PAGE_ERROR_CONFIG = {suppressBusinessErrorToast: true}; +const RowAction = ({onAction, row, children}) => { + const handleClick = useCallback(() => onAction(row), [onAction, row]); + + return ; +}; + const Account = () => { const {t} = useTranslation(); const [editLayerVisible, setEditLayerVisible] = useState(false); const [op, setOp] = useState('detail'); const [detail, setDetail] = useState({}); const [data, setData] = useState([]); + const [listLoading, setListLoading] = useState(true); + const [listError, setListError] = useState(false); + const listRequest = useRef(null); const [refresh, setRefresh] = useState(false); const [pagination, setPagination] = useState({toatal: 0, current: 1, pageSize: 10}); - const showDetail = row => { + const showDetail = useCallback(row => { setDetail(row); setOp('detail'); setEditLayerVisible(true); - }; + }, []); - const showEdit = row => { + const showEdit = useCallback(row => { setDetail(row); setOp('edit'); setEditLayerVisible(true); - }; + }, []); - const showAuth = row => { + const showAuth = useCallback(row => { setDetail(row); setOp('auth'); setEditLayerVisible(true); - }; + }, []); const showAdd = useCallback(() => { setDetail({}); @@ -75,7 +85,7 @@ const Account = () => { setEditLayerVisible(false); }, []); - const handleDelete = row => { + const handleDelete = useCallback(row => { Modal.confirm({ title: t('account.delete_confirm', {name: row.user_name}), onOk: () => { @@ -89,11 +99,11 @@ const Account = () => { }).catch(() => message.error(t('common.msg.operation_failed'))); }, }); - }; + }, [t]); const handleTable = useCallback(page => { - setPagination({...pagination, ...page}); - }, [pagination]); + setPagination(value => ({...value, ...page})); + }, []); const columns = [ { @@ -127,12 +137,22 @@ const Account = () => { align: 'center', render: row => ( - showDetail(row)}>{t('common.action.detail')} - { showEdit(row)}>{t('common.action.edit')}} - showAuth(row)}>{t('common.action.assign_permission')} + + {t('common.action.detail')} + + + {t('common.action.edit')} + + + {t('common.action.assign_permission')} + {row.user_name !== 'admin' && row.user_name !== getUser().id - && handleDelete(row)}>{t('common.action.delete')}} + && ( + + {t('common.action.delete')} + + )} ), }, @@ -141,21 +161,46 @@ const Account = () => { const rowKey = useCallback(item => item.user_name, []); const {current, pageSize} = pagination; - useEffect(() => { - api.auth.getAllUserList({ - query: '', - page_no: current, - page_size: pageSize, - }, PAGE_ERROR_CONFIG).then(res => { + const loadAccounts = useCallback(async () => { + const token = Symbol('account-list'); + listRequest.current = token; + setListLoading(true); + setListError(false); + setData([]); + try { + const res = await api.auth.getAllUserList({ + query: '', + page_no: current, + page_size: pageSize, + }, PAGE_ERROR_CONFIG); + if (listRequest.current !== token) { + return; + } if (res.status === 200) { setData(res.data.records); setPagination(value => ({...value, total: res.data.total})); return; } + setListError(true); + } + catch (error) { + if (listRequest.current === token) { + setListError(true); + } + } + finally { + if (listRequest.current === token) { + setListLoading(false); + } + } + }, [current, pageSize]); - message.error(t('common.msg.load_failed')); - }).catch(() => message.error(t('common.msg.load_failed'))); - }, [refresh, current, pageSize, t]); + useEffect(() => { + loadAccounts(); + return () => { + listRequest.current = null; + }; + }, [refresh, loadAccounts]); return ( <> @@ -166,6 +211,18 @@ const Account = () => { />
+ {listError && ( + + {t('account.load.retry')} + + )} + /> + )} @@ -178,6 +235,7 @@ const Account = () => { rowKey={rowKey} pagination={pagination} onChange={handleTable} + loading={listLoading} />
diff --git a/hugegraph-hubble/hubble-fe/src/pages/Datasource/index.js b/hugegraph-hubble/hubble-fe/src/pages/Datasource/index.js index 16ec74755..f493688b9 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Datasource/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Datasource/index.js @@ -23,6 +23,7 @@ import EditLayer from './EditLayer'; import TableHeader from '../../components/TableHeader'; import {sourceTypeOptions} from './config'; import * as api from '../../api'; +import RowActionButton from '../../components/RowActionButton'; const Datasource = () => { const {t} = useTranslation(); @@ -33,17 +34,27 @@ const Datasource = () => { const [query, setQuery] = useState(''); const [pagination, setPagination] = useState({pageSize: 10, current: 1}); - const delDatasource = datasourceID => { + const delDatasource = useCallback(datasourceID => { api.manage.delDatasource(datasourceID).then(res => { if (res.status === 200) { message.success(t('common.msg.delete_success')); - setRefresh(!refresh); + setRefresh(value => !value); return; } message.error(res.message); }); - }; + }, [t]); + + const confirmDelete = useCallback(datasourceID => { + Modal.confirm({ + title: t('datasource.delete_title'), + content: t('datasource.delete_content'), + onOk() { + delDatasource(datasourceID); + }, + }); + }, [delDatasource, t]); const delBatchDatasource = useCallback(list => { api.manage.delBatchDatasource(list).then(res => { @@ -107,15 +118,9 @@ const Datasource = () => { render: val => { return ( - Modal.confirm({ - title: t('datasource.delete_title'), - content: t('datasource.delete_content'), - onOk() { - delDatasource(val); - }, - })} - >{t('common.action.delete')} - + + {t('common.action.delete')} + ); }, diff --git a/hugegraph-hubble/hubble-fe/src/pages/Error404/index.js b/hugegraph-hubble/hubble-fe/src/pages/Error404/index.js index b299ab31d..a1ef5f1f7 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Error404/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Error404/index.js @@ -18,14 +18,19 @@ import {Result} from 'antd'; import {Link} from 'react-router-dom'; +import {useTranslation} from 'react-i18next'; -const Error404 = () => ( - 返回首页} - /> -); +const Error404 = () => { + const {t} = useTranslation(); + + return ( + {t('not_found.home')}} + /> + ); +}; export default Error404; diff --git a/hugegraph-hubble/hubble-fe/src/pages/Error404/index.test.js b/hugegraph-hubble/hubble-fe/src/pages/Error404/index.test.js new file mode 100644 index 000000000..dd80aa225 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/pages/Error404/index.test.js @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {render, screen} from '@testing-library/react'; +import {MemoryRouter} from 'react-router-dom'; +import Error404 from './index'; + +jest.mock('react-i18next', () => ({ + useTranslation: () => ({t: key => key}), +})); + +test('uses localized unknown-route recovery copy', () => { + render( + + + + ); + + expect(screen.getByText('not_found.subtitle')).toBeInTheDocument(); + expect(screen.getByRole('link', {name: 'not_found.home'})).toHaveAttribute('href', '/'); +}); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/Card.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/Card.js index d374f59ac..cefebef16 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/Card.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/Card.js @@ -29,15 +29,16 @@ import {isPdEnabled} from '../../utils/config'; import style from './index.module.scss'; import {byteConvert} from '../../utils/format'; -const TitleField = ({item, onClick}) => { +const TitleField = ({item, onClick, onKeyDown}) => { const {t} = useTranslation(); const pdMode = isPdEnabled(); + const graphName = item.nickname || item.name; const displayName = pdMode - ? `${_.truncate(item.graphspace_nickname, {length: 12})}-${_.truncate(item.nickname, {length: 12})}` - : (item.nickname || item.name); + ? `${_.truncate(item.graphspace_nickname, {length: 12})}-${_.truncate(graphName, {length: 12})}` + : graphName; const fullTitle = pdMode - ? `${item.graphspace_nickname}-${item.nickname}` - : (item.nickname || item.name); + ? `${item.graphspace_nickname}-${graphName}` + : graphName; return ( <> @@ -46,6 +47,9 @@ const TitleField = ({item, onClick}) => { ellipsis={{ellipsis: true}} title={fullTitle} onClick={onClick} + onKeyDown={onKeyDown} + role='button' + tabIndex={0} > {displayName} @@ -72,10 +76,30 @@ const GraphCard = ({item, menus}) => { navigate(`/graphspace/${item.graphspace || 'DEFAULT'}/graph/${item.name}/detail`); }, [item, navigate]); + const handleAnalysisKeyDown = useCallback(event => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + handleGotoAnalysis(); + } + }, [handleGotoAnalysis]); + + const handleDetailKeyDown = useCallback(event => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + handleGotoDetail(); + } + }, [handleGotoDetail]); + return ( } + title={( + + )} headStyle={{ paddingLeft: 20, }} @@ -92,17 +116,35 @@ const GraphCard = ({item, menus}) => { )} actions={[ - + {t('graph.col.create_time')}: {moment(item.create_time).format('YYYY-MM-DD')} , - + {t('graph.detail.title')} , ]} > -
+
({ jest.mock('./Card', () => ({menus}) => (
{menus.map(item => ( -
+
{item.label}
))} diff --git a/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js b/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js index b60826159..d6849ed3d 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Graph/index.js @@ -52,6 +52,12 @@ import GraphCard from './Card'; import ClearGraphConfirmModal from './ClearGraphConfirmModal'; import KeyboardAction from '../../components/KeyboardAction'; +const GraphRowAction = ({onAction, graph, children}) => { + const handleClick = useCallback(() => onAction(graph), [graph, onAction]); + + return ; +}; + const Graph = () => { const {t} = useTranslation(); const [data, setData] = useState([]); @@ -96,14 +102,14 @@ const Graph = () => { setSelectGraph(''); }, []); - const editGraph = graph => { + const editGraph = useCallback(graph => { setSelectGraph(graph); setEditLayer(true); - }; + }, []); - const clearData = graph => { + const clearData = useCallback(graph => { setClearSelection({graph}); - }; + }, []); const handleClearSuccess = useCallback(() => { message.success(t('common.msg.success')); @@ -119,12 +125,12 @@ const Graph = () => { return api.manage.clearGraphData(graphspace, clearSelection.graph); }, [clearSelection, graphspace]); - const showSchema = graph => { + const showSchema = useCallback(graph => { setViewLayer(true); setSelectGraph(graph); - }; + }, []); - const deleteGraph = graph => { + const deleteGraph = useCallback(graph => { Modal.confirm({ title: t('graph.delete_confirm.title'), content: t('graph.delete_confirm.irreversible'), @@ -134,7 +140,7 @@ const Graph = () => { hide(); if (res.status === 200) { message.success(t('graph.delete_confirm.success')); - setRefresh(!refresh); + setRefresh(value => !value); return; } @@ -142,9 +148,9 @@ const Graph = () => { }); }, }); - }; + }, [graphspace, t]); - const setDefault = graph => { + const setDefault = useCallback(graph => { const hide = message.loading(t('graph.set_default.setting'), 0); return api.manage.setDefaultGraph(graphspace, graph, { suppressBusinessErrorToast: true, @@ -152,7 +158,7 @@ const Graph = () => { hide(); if (res.status === 200) { message.success(t('graph.set_default.success')); - setRefresh(!refresh); + setRefresh(value => !value); return; } message.error(t('common.msg.operation_failed')); @@ -160,9 +166,9 @@ const Graph = () => { hide(); message.error(t('common.msg.operation_failed')); }); - }; + }, [graphspace, t]); - const handleSetDefault = graph => { + const handleSetDefault = useCallback(graph => { api.manage.getDefaultGraph(graphspace, { suppressBusinessErrorToast: true, }).then(res => { @@ -184,7 +190,7 @@ const Graph = () => { setDefault(graph); }).catch(() => message.error(t('common.msg.operation_failed'))); - }; + }, [graphspace, setDefault, t]); const handleBack = useCallback(() => { if (isPdEnabled()) { @@ -267,18 +273,36 @@ const Graph = () => { {(row.default) ? {t('graph.menu.clear_data')} - : clearData(row.name)}>{t('graph.menu.clear_data')}} + : ( + + {t('graph.menu.clear_data')} + + )} {(row.graphspace === 'neizhianli') ? {t('common.action.delete')} - : deleteGraph(row.name)}>{t('common.action.delete')}} - showSchema(row.name)}>{t('graph.menu.view_schema')} + : ( + + {t('common.action.delete')} + + )} + + {t('graph.menu.view_schema')} + {(row.graphspace === 'neizhianli') ? {t('common.action.edit')} - : editGraph(row.name)}>{t('common.action.edit')}} + : ( + + {t('common.action.edit')} + + )} {graphDefaultMutationEnabled && ( row.default ? {t('graph.menu.set_default')} - : handleSetDefault(row.name)}>{t('graph.menu.set_default')} + : ( + + {t('graph.menu.set_default')} + + ) )} {graphCreateEnabled && ( @@ -302,39 +326,52 @@ const Graph = () => { const getMenus = item => [ { key: '0', - label: handleGotoAnalysis(item)}>{t('graph.menu.enter_analysis')}, + label: t('graph.menu.enter_analysis'), + onClick: () => handleGotoAnalysis(item), }, { key: '1', - label: handleGotoMeta(item)}>{t('graph.menu.meta_config')}, + label: t('graph.menu.meta_config'), + onClick: () => handleGotoMeta(item), }, { key: '2', + disabled: item.default, label: item.default ? {t('graph.menu.clear_data')} - : clearData(item.name)}>{t('graph.menu.clear_data')}, + : t('graph.menu.clear_data'), + onClick: item.default ? undefined : () => clearData(item.name), }, graphDefaultMutationEnabled && { key: '4', + disabled: item.default, label: item.default ? {t('graph.menu.set_default')} - : handleSetDefault(item.name)}>{t('graph.menu.set_default')}, + : t('graph.menu.set_default'), + onClick: item.default ? undefined : () => handleSetDefault(item.name), }, { key: '5', - label: showSchema(item.name)}>{t('graph.menu.view_schema')}, + label: t('graph.menu.view_schema'), + onClick: () => showSchema(item.name), }, { key: '6', + disabled: item.graphspace === 'neizhianli', label: item.graphspace === 'neizhianli' ? {t('common.action.edit')} - : editGraph(item.name)}>{t('common.action.edit')}, + : t('common.action.edit'), + onClick: item.graphspace === 'neizhianli' + ? undefined : () => editGraph(item.name), }, { key: '7', + disabled: item.graphspace === 'neizhianli', label: item.graphspace === 'neizhianli' ? {t('common.action.delete')} - : deleteGraph(item.name)}>{t('common.action.delete')}, + : t('common.action.delete'), + onClick: item.graphspace === 'neizhianli' + ? undefined : () => deleteGraph(item.name), }, graphCreateEnabled && { key: '8', diff --git a/hugegraph-hubble/hubble-fe/src/pages/GraphSpace/Card.js b/hugegraph-hubble/hubble-fe/src/pages/GraphSpace/Card.js index 46008cd6f..6b813d879 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/GraphSpace/Card.js +++ b/hugegraph-hubble/hubble-fe/src/pages/GraphSpace/Card.js @@ -32,7 +32,7 @@ const formatPercent = percent => { return percent >= 100 ? : `${percent}%`; }; -const TitleField = ({item, onClick}) => { +const TitleField = ({item, onClick, onKeyDown}) => { const {t} = useTranslation(); return ( @@ -42,6 +42,9 @@ const TitleField = ({item, onClick}) => { ellipsis={{ellipsis: true}} title={`${item.nickname}`} onClick={onClick} + onKeyDown={onKeyDown} + role='button' + tabIndex={0} >{item.nickname}
@@ -70,6 +73,13 @@ const GraphSpaceCard = ({item, editGraphspace, deleteGraphspace, handleInit}) => deleteGraphspace(item.name); }, [deleteGraphspace, item]); + const handleGotoGraphKeyDown = useCallback(event => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + handleGotoGraph(); + } + }, [handleGotoGraph]); + const getMenu = item => ({ items: item.name === 'neizhianli' ? [ @@ -83,7 +93,8 @@ const GraphSpaceCard = ({item, editGraphspace, deleteGraphspace, handleInit}) => }, { key: '2', - label: {t('common.action.init')}, + label: t('common.action.init'), + onClick: handleInit, }, ] : [ @@ -97,13 +108,16 @@ const GraphSpaceCard = ({item, editGraphspace, deleteGraphspace, handleInit}) => }, { key: '2', - label: {t('common.action.edit')}, + label: t('common.action.edit'), + onClick: handleEdit, }, { key: '3', + disabled: item.default, label: (item.default) ? {t('common.action.delete')} - : {t('common.action.delete')}, + : t('common.action.delete'), + onClick: item.default ? undefined : handleDelete, }, ], }); @@ -116,7 +130,13 @@ const GraphSpaceCard = ({item, editGraphspace, deleteGraphspace, handleInit}) => return ( } + title={( + + )} headStyle={{ backgroundImage: 'linear-gradient(180deg, ' + 'rgba(51,136,255,0.10) 0%, rgba(51,136,255,0.00) 100%)', @@ -158,7 +178,13 @@ const GraphSpaceCard = ({item, editGraphspace, deleteGraphspace, handleInit}) => ] } > -
+
    diff --git a/hugegraph-hubble/hubble-fe/src/pages/GraphSpace/graphspace-recovery.test.js b/hugegraph-hubble/hubble-fe/src/pages/GraphSpace/graphspace-recovery.test.js new file mode 100644 index 000000000..93579744b --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/pages/GraphSpace/graphspace-recovery.test.js @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {render, screen} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import GraphSpace from './index'; +import * as api from '../../api'; + +jest.mock('react-i18next', () => ({ + useTranslation: () => ({t: key => key}), +})); + +jest.mock('../../api', () => ({ + manage: { + getGraphSpaceList: jest.fn(), + delGraphSpace: jest.fn(), + initBuiltin: jest.fn(), + }, +})); + +jest.mock('./Card', () => ({item}) =>
    {item.nickname}
    ); +jest.mock('./EditLayer', () => ({EditLayer: () => null})); + +beforeEach(() => { + jest.clearAllMocks(); + window.matchMedia = jest.fn().mockImplementation(query => ({ + matches: false, + media: query, + addListener: jest.fn(), + removeListener: jest.fn(), + })); +}); + +test('keeps a failed GraphSpace request distinct from a valid empty list', async () => { + api.manage.getGraphSpaceList + .mockRejectedValueOnce(new Error('down')) + .mockResolvedValueOnce({ + status: 200, + data: {records: [{name: 'space-a', nickname: 'Space A'}], total: 1}, + }); + + render(); + + expect(await screen.findByText('graphspace.load.unavailable')).toBeInTheDocument(); + expect(screen.queryByText('Space A')).not.toBeInTheDocument(); + + await userEvent.click(screen.getByRole('button', {name: 'graphspace.load.retry'})); + + expect(await screen.findByText('Space A')).toBeInTheDocument(); + expect(screen.queryByText('graphspace.load.unavailable')).not.toBeInTheDocument(); +}); diff --git a/hugegraph-hubble/hubble-fe/src/pages/GraphSpace/index.js b/hugegraph-hubble/hubble-fe/src/pages/GraphSpace/index.js index f7c6e18eb..60943464c 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/GraphSpace/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/GraphSpace/index.js @@ -17,6 +17,7 @@ */ import { + Alert, Table, Space, Row, @@ -32,7 +33,7 @@ import { Pagination, Spin, } from 'antd'; -import {useState, useEffect, useCallback} from 'react'; +import {useState, useEffect, useCallback, useRef} from 'react'; import {useTranslation} from 'react-i18next'; import {EditLayer} from './EditLayer'; import TableHeader from '../../components/TableHeader'; @@ -48,6 +49,12 @@ const showText = (val, suffix, unlimited, empty) => ( val > 99999 ? (empty === undefined ? unlimited : empty) : `${val}${suffix}` ); +const GraphSpaceRowAction = ({onAction, value, children}) => { + const handleClick = useCallback(() => onAction(value), [onAction, value]); + + return ; +}; + const GraphSpace = () => { const [data, setData] = useState([]); const [detail, setDetail] = useState({}); @@ -58,6 +65,8 @@ const GraphSpace = () => { const [graphspacename, setGraphspacename] = useState(''); const [pagination, setPagination] = useState({toatal: 0, current: 1, pageSize: 11}); const [loading, setLoading] = useState(false); + const [listError, setListError] = useState(false); + const listRequest = useRef(null); const {t} = useTranslation(); const handleCreate = useCallback(() => { @@ -65,6 +74,13 @@ const GraphSpace = () => { setDetail({}); }, []); + const handleCreateKeyDown = useCallback(event => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + handleCreate(); + } + }, [handleCreate]); + const editGraphspace = useCallback(detail => { setDetail(detail); setEditLayer(true); @@ -77,8 +93,12 @@ const GraphSpace = () => { const handleListType = useCallback(e => { setListType(e.target.value); - setPagination({...pagination, current: 1, pageSize: e.target.value === 'image' ? 11 : 10}); - }, [pagination]); + setPagination(value => ({ + ...value, + current: 1, + pageSize: e.target.value === 'image' ? 11 : 10, + })); + }, []); const deleteGraphspace = useCallback(graphspace => { Modal.confirm({ @@ -98,8 +118,8 @@ const GraphSpace = () => { }, [t]); const handlePage = useCallback(current => { - setPagination({...pagination, current}); - }, [pagination]); + setPagination(value => ({...value, current})); + }, []); const handleTable = useCallback(pagination => { setPagination(pagination); @@ -187,17 +207,30 @@ const GraphSpace = () => { {t('common.action.schema_manage')} - {t('common.action.init')} + ) : ( {(row.default) ? {t('common.action.edit')} - : editGraphspace(row)}>{t('common.action.edit')} + : ( + + {t('common.action.edit')} + + ) } {(row.default) ? {t('common.action.delete')} - : deleteGraphspace(row.name)}>{t('common.action.delete')} + : ( + + {t('common.action.delete')} + + ) } {t('common.action.schema_manage')} @@ -209,28 +242,49 @@ const GraphSpace = () => { }, ]; - useEffect(() => { - setLoading(true); + const {current, pageSize} = pagination; - api.manage.getGraphSpaceList({ - create_time: dateData, - query: graphspacename, - page_no: pagination.current, - page_size: pagination.pageSize, - }, PAGE_ERROR_CONFIG).then(res => { - setLoading(false); + const loadGraphspaces = useCallback(async () => { + const token = Symbol('graphspace-list'); + listRequest.current = token; + setLoading(true); + setListError(false); + setData([]); + try { + const res = await api.manage.getGraphSpaceList({ + create_time: dateData, + query: graphspacename, + page_no: current, + page_size: pageSize, + }, PAGE_ERROR_CONFIG); + if (listRequest.current !== token) { + return; + } if (res.status === 200) { setData(res.data.records); - setPagination({...pagination, total: res.data.total}); + setPagination(value => ({...value, total: res.data.total})); return; } - message.error(t('common.msg.load_failed')); - }).catch(() => { - setLoading(false); - message.error(t('common.msg.load_failed')); - }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [refresh, listType, dateData, graphspacename, pagination.current]); + setListError(true); + } + catch (error) { + if (listRequest.current === token) { + setListError(true); + } + } + finally { + if (listRequest.current === token) { + setLoading(false); + } + } + }, [current, dateData, graphspacename, pageSize]); + + useEffect(() => { + loadGraphspaces(); + return () => { + listRequest.current = null; + }; + }, [refresh, listType, loadGraphspaces]); return ( <> @@ -266,13 +320,31 @@ const GraphSpace = () => {
    + {listError && ( + + {t('graphspace.load.retry')} + + )} + /> + )} {listType === 'image' ? ( <>
- + {t('graphspace.create')} diff --git a/hugegraph-hubble/hubble-fe/src/pages/Login/index.js b/hugegraph-hubble/hubble-fe/src/pages/Login/index.js index 86c292665..a00593dde 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Login/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Login/index.js @@ -105,8 +105,10 @@ const Login = () => { form={form} > - - | {t('login.title')} + +

+ | {t('login.title')} +

{ > } + aria-label={t('login.username')} placeholder={t('login.username')} /> @@ -124,6 +127,7 @@ const Login = () => { > } + aria-label={t('login.password')} type="password" placeholder={t('login.password')} /> diff --git a/hugegraph-hubble/hubble-fe/src/pages/Login/login-request-error.test.js b/hugegraph-hubble/hubble-fe/src/pages/Login/login-request-error.test.js index 3bfae819f..48c13279f 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Login/login-request-error.test.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Login/login-request-error.test.js @@ -88,6 +88,20 @@ describe('Login request errors', () => { }; }); + it('labels the standalone login page and its credential fields', () => { + render( + + + + ); + + expect(screen.getByRole('heading', {level: 1, name: /login.title/})) + .toBeInTheDocument(); + expect(screen.getByRole('textbox', {name: 'login.username'})) + .toBeInTheDocument(); + expect(screen.getByLabelText('login.password')).toHaveAttribute('type', 'password'); + }); + it('keeps rejected login requests from escaping the submit handler', async () => { const loginError = new Error('login failed'); api.auth.login.mockRejectedValue(loginError); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/Edge/index.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/Edge/index.js index c433bd23b..e4749510f 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Meta/Edge/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/Edge/index.js @@ -21,9 +21,9 @@ import {EditEdgeLayer} from './EditLayer'; import {useState, useEffect, useCallback} from 'react'; import {useParams} from 'react-router-dom'; import {useTranslation} from 'react-i18next'; -import RowActionButton from '../../../components/RowActionButton'; import useMetaTable from '../common/useMetaTable'; import MetaTableStatus from '../common/MetaTableStatus'; +import RowActionButton from '../../../components/RowActionButton'; import * as api from '../../../api'; const DELETE_REQUEST_CONFIG = {suppressBusinessErrorToast: true}; @@ -157,8 +157,12 @@ const EdgeTable = () => { align: 'center', render: row => ( - handleEdit(row)}>{t('common.edit')} - handleDelete(row)}>{t('common.delete')} + + {t('common.edit')} + + + {t('common.delete')} + ), }, diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/Property/index.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/Property/index.js index 5d6d04203..6fb76612e 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Meta/Property/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/Property/index.js @@ -138,7 +138,11 @@ const PropertyTable = ({noHeader, forceRefresh}) => { title: t('schema.property.col.operation'), width: 120, align: 'center', - render: val => handleDelete(val)}>{t('common.action.delete')}, + render: val => ( + + {t('common.action.delete')} + + ), }, ]; diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/Vertex/index.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/Vertex/index.js index 665c97c78..fe588d5ec 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Meta/Vertex/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/Vertex/index.js @@ -157,8 +157,12 @@ const VertexTable = () => { align: 'center', render: val => ( - handleEdit(val)}>{t('common.edit')} - handleDelete(val)}>{t('common.delete')} + + {t('common.edit')} + + + {t('common.delete')} + ), }, diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/common/RelateProperty.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/common/RelateProperty.js index d56c00009..4d00813fc 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Meta/common/RelateProperty.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/common/RelateProperty.js @@ -18,6 +18,7 @@ import {Space, Form, Select} from 'antd'; import {useTranslation} from 'react-i18next'; +import {FormListAdd, FormListRemove} from '../../../components/FormListAction'; import {attrOptions} from './config'; const RelateProperty = ({propertyList, selectProperty, removeProperty, exist, isEdit}) => { @@ -97,19 +98,19 @@ const RelateProperty = ({propertyList, selectProperty, removeProperty, exist, is onChange={selectProperty} /> - { - remove(index); - removeProperty(); - }} + {t('common.action.delete')} - + ))} -
add()}> + +{t('common.action.add')} -
+ )} @@ -143,19 +144,19 @@ const RelateProperty = ({propertyList, selectProperty, removeProperty, exist, is onChange={selectProperty} /> - { - remove(index); - removeProperty(); - }} + {t('common.action.delete')} - + ))} -
add()}> + +{t('common.action.add')} -
+ )} diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/common/RelatePropertyIndex.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/common/RelatePropertyIndex.js index 0a73e09d3..691c5bd56 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Meta/common/RelatePropertyIndex.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/common/RelatePropertyIndex.js @@ -16,9 +16,10 @@ * under the License. */ -import {Form, Select, Input, Space} from 'antd'; +import {Button, Form, Select, Input, Space} from 'antd'; import {useCallback, useState, useEffect} from 'react'; import {useTranslation} from 'react-i18next'; +import {FormListAdd, FormListRemove} from '../../../components/FormListAction'; import {indexTypeOptions} from './config'; const IndexTypeSelect = ({index, onChange}) => { @@ -36,6 +37,21 @@ const PropertyFieldsSelect = ({options, type}) => { return @@ -170,7 +220,7 @@ const My = () => { {/*
上次更改密码时间:2022-06-24 10:44:22
*/} - )} + ) : null} diff --git a/hugegraph-hubble/hubble-fe/src/pages/My/my-recovery.test.js b/hugegraph-hubble/hubble-fe/src/pages/My/my-recovery.test.js new file mode 100644 index 000000000..49cf4d230 --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/pages/My/my-recovery.test.js @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0. + */ + +import {render, screen} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import My from './index'; +import * as api from '../../api'; + +jest.mock('react-i18next', () => ({ + useTranslation: () => ({t: key => key}), +})); + +jest.mock('../../api', () => ({ + auth: { + getPersonal: jest.fn(), + updatePwd: jest.fn(), + }, +})); + +jest.mock('./EditLayer', () => ({refresh}) => ( + +)); + +jest.mock('../../utils/rules', () => ({ + required: () => ({required: true}), +})); + +beforeEach(() => { + jest.clearAllMocks(); + window.matchMedia = jest.fn().mockImplementation(query => ({ + matches: false, + media: query, + addListener: jest.fn(), + removeListener: jest.fn(), + })); +}); + +const deferred = () => { + let resolve; + const promise = new Promise(resolvePromise => { + resolve = resolvePromise; + }); + return {promise, resolve}; +}; + +test('shows a persistent profile error and retries without stale identity', async () => { + api.auth.getPersonal + .mockRejectedValueOnce(new Error('down')) + .mockResolvedValueOnce({ + status: 200, + data: {user_name: 'admin', user_nickname: 'Administrator'}, + }); + + render(); + + expect(await screen.findByText('my.load.unavailable')).toBeInTheDocument(); + expect(screen.queryByText('Administrator')).not.toBeInTheDocument(); + + await userEvent.click(screen.getByRole('button', {name: 'my.load.retry'})); + + expect(await screen.findByText('Administrator')).toBeInTheDocument(); + expect(screen.queryByText('my.load.unavailable')).not.toBeInTheDocument(); +}); + +test('ignores an old profile response after a newer refresh', async () => { + const oldRequest = deferred(); + api.auth.getPersonal + .mockReturnValueOnce(oldRequest.promise) + .mockResolvedValueOnce({ + status: 200, + data: {user_name: 'admin', user_nickname: 'New profile'}, + }); + + render(); + + expect(screen.getByRole('button', {name: 'common.action.edit'})).toBeDisabled(); + await userEvent.click(screen.getByRole('button', {name: 'mock profile saved'})); + expect(await screen.findByText('New profile')).toBeInTheDocument(); + + oldRequest.resolve({ + status: 200, + data: {user_name: 'admin', user_nickname: 'Old profile'}, + }); + + expect(await screen.findByText('New profile')).toBeInTheDocument(); + expect(screen.queryByText('Old profile')).not.toBeInTheDocument(); +}); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Schema/index.js b/hugegraph-hubble/hubble-fe/src/pages/Schema/index.js index e2370d2bc..3a028288a 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Schema/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Schema/index.js @@ -33,9 +33,9 @@ const SchemaActions = ({row, onView, onEdit, onDelete}) => { return ( - {t('schema_template.action.view')} - {t('schema_template.action.edit')} - {t('schema_template.action.delete')} + + + ); }; diff --git a/hugegraph-hubble/hubble-fe/src/pages/Task/components/ViewLayer.js b/hugegraph-hubble/hubble-fe/src/pages/Task/components/ViewLayer.js index 5d5e2d147..99de3ee66 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Task/components/ViewLayer.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Task/components/ViewLayer.js @@ -17,11 +17,12 @@ */ import { + Alert, + Button, Modal, - message, Spin, } from 'antd'; -import {useCallback, useEffect, useState} from 'react'; +import {useCallback, useEffect, useRef, useState} from 'react'; import * as api from '../../../api'; import ReactJsonView from 'react-json-view'; import {useTranslation} from 'react-i18next'; @@ -30,25 +31,54 @@ const ViewLayer = ({visible, onCancel, task_id}) => { const {t} = useTranslation(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); + const detailRequest = useRef(null); const onFinish = useCallback(() => { onCancel(); }, [onCancel]); - useEffect(() => { - if (!visible) { - return; - } - api.manage.getTaskDetail(task_id).then(res => { + const loadDetail = useCallback(async () => { + const token = Symbol('task-view-detail'); + detailRequest.current = token; + setData(null); + setError(false); + setLoading(true); + try { + const res = await api.manage.getTaskDetail(task_id, { + suppressBusinessErrorToast: true, + }); + if (detailRequest.current !== token) { + return; + } if (res.status === 200) { setData(JSON.parse(JSON.stringify(res.data))); - setLoading(false); return; } - message.error(res.message); - }); + setError(true); + } + catch (requestError) { + if (detailRequest.current === token) { + setError(true); + } + } + finally { + if (detailRequest.current === token) { + setLoading(false); + } + } + }, [task_id]); - }, [visible, task_id]); + useEffect(() => { + if (!visible) { + detailRequest.current = null; + return undefined; + } + loadDetail(); + return () => { + detailRequest.current = null; + }; + }, [visible, task_id, loadDetail]); return ( { destroyOnClose > + {error && ( + + {t('task.view.retry')} + + )} + /> + )} {data && (
({ + useTranslation: () => ({t: key => key}), +})); + +jest.mock('../../../api', () => ({ + manage: {getTaskDetail: jest.fn()}, +})); + +jest.mock('react-json-view', () => ({src}) =>
{src.name}
); + +const deferred = () => { + let resolve; + let reject; + const promise = new Promise((resolvePromise, rejectPromise) => { + resolve = resolvePromise; + reject = rejectPromise; + }); + return {promise, resolve, reject}; +}; + +beforeEach(() => { + jest.clearAllMocks(); + window.matchMedia = jest.fn().mockImplementation(query => ({ + matches: false, + media: query, + addListener: jest.fn(), + removeListener: jest.fn(), + })); +}); + +test('clears stale task data and offers retry for the current task', async () => { + const taskB = deferred(); + api.manage.getTaskDetail + .mockResolvedValueOnce({status: 200, data: {name: 'Task A'}}) + .mockReturnValueOnce(taskB.promise) + .mockResolvedValueOnce({status: 200, data: {name: 'Task B'}}); + + const {rerender} = render( + + ); + expect(await screen.findByText('Task A')).toBeInTheDocument(); + + rerender(); + expect(screen.queryByText('Task A')).not.toBeInTheDocument(); + + taskB.reject(new Error('down')); + expect(await screen.findByText('task.view.unavailable')).toBeInTheDocument(); + + await userEvent.click(screen.getByRole('button', {name: 'task.view.retry'})); + await waitFor(() => expect(screen.getByText('Task B')).toBeInTheDocument()); +}); diff --git a/hugegraph-hubble/hubble-fe/src/pages/TaskEdit/MappingForm/index.js b/hugegraph-hubble/hubble-fe/src/pages/TaskEdit/MappingForm/index.js index 641f2c83d..462e049d6 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/TaskEdit/MappingForm/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/TaskEdit/MappingForm/index.js @@ -34,8 +34,12 @@ const MappingListItem = ({item, index, type, onEdit, onRemove, t}) => { return ( {t('common.action.edit')}, - {t('common.action.delete')}, + , + , ]} > From 838d39a7d1b6d01e5259300af44393a3678de0c3 Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 07:14:18 +0800 Subject: [PATCH 66/68] feat(hubble): add safe Text2GQL preview - add a peer natural-language query tab - block all placeholder execution and network paths - recover rejected query and async task requests - cover zero-call and failure contracts with tests --- .../resources/en-US/modules/analysis.json | 6 + .../resources/zh-CN/modules/analysis.json | 6 + .../src/modules/analysis/Home/index.js | 138 ++++++++++++------ .../src/modules/analysis/Home/index.test.js | 103 +++++++++++++ .../modules/analysis/QueryBar/Home/index.js | 34 ++++- .../analysis/QueryBar/Home/index.module.scss | 11 ++ .../analysis/QueryBar/Home/index.test.js | 35 +++++ .../hubble-fe/src/utils/constants.js | 1 + 8 files changed, 290 insertions(+), 44 deletions(-) create mode 100644 hugegraph-hubble/hubble-fe/src/modules/analysis/Home/index.test.js diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/analysis.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/analysis.json index 398b71e8a..084a7505c 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/analysis.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/modules/analysis.json @@ -6,6 +6,12 @@ "placeholder": "Enter a query statement", "gremlin_tab": "Gremlin", "cypher_tab": "Cypher", + "text2gql_tab": "Natural language", + "text2gql_badge": "Coming soon", + "text2gql_title": "Natural-language graph query", + "text2gql_description": "This is a UI preview for a future Text2GQL workflow. It is not connected to a model or query service.", + "text2gql_placeholder": "Describe the graph question you want to ask", + "text2gql_privacy": "Nothing entered here is sent, generated, saved, or executed.", "execute_query": "Run Query", "execute_task": "Run Task", "execute_mode_desc": "Query mode is for small analyses that return within 30 seconds. Task mode is for larger analyses that take longer; task details are available in Task Management.", diff --git a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/analysis.json b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/analysis.json index 0f7167ca2..ab15ae4b4 100644 --- a/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/analysis.json +++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/zh-CN/modules/analysis.json @@ -6,6 +6,12 @@ "placeholder": "请输入查询语句", "gremlin_tab": "Gremlin 分析", "cypher_tab": "Cypher 分析", + "text2gql_tab": "自然语言", + "text2gql_badge": "待实现", + "text2gql_title": "自然语言图查询", + "text2gql_description": "这是未来 Text2GQL 工作流的界面预览,尚未连接模型或查询服务。", + "text2gql_placeholder": "描述你希望查询的图问题", + "text2gql_privacy": "当前不会发送、生成、保存或执行任何内容。", "execute_query": "执行查询", "execute_task": "执行任务", "execute_mode_desc": "查询模式适合 30 秒内可返回结果的小规模分析,任务模式适合较长时间返回结果的大规模分析,任务详情可在任务管理中查看", diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/Home/index.js index 811675230..16023ffbf 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/analysis/Home/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/Home/index.js @@ -20,7 +20,7 @@ * @file 图分析 Home */ -import React, {useState, useCallback, useEffect, useContext} from 'react'; +import React, {useState, useCallback, useEffect, useContext, useRef} from 'react'; import {useTranslation} from 'react-i18next'; import GraphAnalysisContext from '../../Context'; import QueryBar from '../QueryBar/Home'; @@ -33,7 +33,7 @@ import _ from 'lodash'; const {STANDBY, LOADING, SUCCESS, FAILED} = GRAPH_STATUS; const {QUERY} = GREMLIN_EXECUTES_MODE; -const {GREMLIN} = ANALYSIS_TYPE; +const {GREMLIN, CYPHER, TEXT2GQL} = ANALYSIS_TYPE; const {CLOSED} = PANEL_TYPE; const {CANVAS2D} = GRAPH_RENDER_MODE; const defaultPageParams = {page: 1, pageSize: 10}; @@ -62,9 +62,17 @@ const AnalysisHome = () => { const [search, setSearch] = useState(); const [sortMode, setSortMode] = useState(); const [graphRenderMode, setGraphRenderMode] = useState(CANVAS2D); + const queryRequest = useRef(null); + + useEffect(() => () => { + queryRequest.current = null; + }, []); const getExecutionLogsList = useCallback( async () => { + if (analysisMode === TEXT2GQL) { + return; + } const params = {'page_size': pageSize, 'page_no': pageExecute, 'type': EXECUTION_LOGS_TYPE[analysisMode]}; setLoading(true); const response = await api.analysis.getExecutionLogs(graphSpace, graph, params); @@ -79,6 +87,9 @@ const AnalysisHome = () => { const getFavoriteQueriesList = useCallback( async () => { + if (analysisMode === TEXT2GQL) { + return; + } const params = { page_size: pageSize, page_no: pageFavorite, @@ -170,11 +181,13 @@ const AnalysisHome = () => { const onAnalysisModeChange = useCallback( queryType => { + queryRequest.current = null; setCodeEditorContent(''); setAnalysisMode(queryType); + initQueryResult(); onResetPage(); }, - [onResetPage] + [initQueryResult, onResetPage] ); const resetGraphInfo = useCallback( @@ -187,6 +200,7 @@ const AnalysisHome = () => { ); useEffect(() => { + queryRequest.current = null; if (graphSpace && graph) { resetGraphInfo(); } @@ -213,66 +227,106 @@ const AnalysisHome = () => { const onExecuteQuery = useCallback( async tabKey => { + const request = Symbol('query'); + queryRequest.current = request; setQueryMode(true); setQueryStatus(LOADING); setPanelType(CLOSED); setGraphRenderMode(CANVAS2D); - let response; - if (tabKey === GREMLIN) { - response = await api.analysis.getExecutionQuery(graphSpace, graph, codeEditorContent); - } - else { - response = await api.analysis.getCypherExecutionQuery(graphSpace, graph, {cypher: codeEditorContent}); - } - const {status, data, message} = response || {}; - setQueryResult(data); - setAsyncTaskResult(); - if (status === 200) { - setQueryMessage(message); - setQueryStatus(SUCCESS); + try { + let response; + if (tabKey === GREMLIN) { + response = await api.analysis.getExecutionQuery( + graphSpace, graph, codeEditorContent + ); + } + else { + response = await api.analysis.getCypherExecutionQuery( + graphSpace, graph, {cypher: codeEditorContent} + ); + } + if (queryRequest.current !== request) { + return; + } + const {status, data, message} = response || {}; + setQueryResult(data); + setAsyncTaskResult(); + if (status === 200) { + setQueryMessage(message); + setQueryStatus(SUCCESS); + } + else { + setQueryMessage(t('analysis.query_result.run_failed_action')); + setQueryStatus(FAILED); + } + onExeLogsRefresh(); + onFavoriteRefresh(); + resetGraphInfo(); } - else { + catch { + if (queryRequest.current !== request) { + return; + } + setQueryResult(); + setAsyncTaskResult(); setQueryMessage(t('analysis.query_result.run_failed_action')); setQueryStatus(FAILED); } - onExeLogsRefresh(); - onFavoriteRefresh(); - resetGraphInfo(); }, [graph, graphSpace, codeEditorContent, onExeLogsRefresh, onFavoriteRefresh, resetGraphInfo, t] ); const onExecuteTask = useCallback( async tabKey => { + const request = Symbol('task'); + queryRequest.current = request; setQueryMode(false); setQueryStatus(LOADING); setPanelType(CLOSED); - let response; - if (tabKey === GREMLIN) { - response = await api.analysis.getExecutionTask(graphSpace, graph, {content: codeEditorContent}); - } - else { - response = await api.analysis.getCypherTask(graphSpace, graph, {content: codeEditorContent}); - } - const {status, message, data} = response || {}; - setQueryMessage(message); - if (status === 200) { - setQueryStatus(SUCCESS); - // getExecuteAsyncTask(tabKey === GREMLIN ? ASYNC_GREMLIN : ASYNC_CYPHER); - setAsyncTaskResult(data?.task_id || 0); - setQueryResult(); - onExeLogsRefresh(); - onFavoriteRefresh(); + try { + let response; + if (tabKey === GREMLIN) { + response = await api.analysis.getExecutionTask( + graphSpace, graph, {content: codeEditorContent} + ); + } + else { + response = await api.analysis.getCypherTask( + graphSpace, graph, {content: codeEditorContent} + ); + } + if (queryRequest.current !== request) { + return; + } + const {status, message, data} = response || {}; + setQueryMessage(message); + if (status === 200) { + setQueryStatus(SUCCESS); + setAsyncTaskResult(data?.task_id || 0); + setQueryResult(); + onExeLogsRefresh(); + onFavoriteRefresh(); + } + else { + setQueryStatus(FAILED); + } } - else { + catch { + if (queryRequest.current !== request) { + return; + } + setQueryMessage(t('analysis.query_result.submit_failed')); setQueryStatus(FAILED); } }, - [codeEditorContent, graph, graphSpace, onExeLogsRefresh, onFavoriteRefresh] + [codeEditorContent, graph, graphSpace, onExeLogsRefresh, onFavoriteRefresh, t] ); const onExecute = useCallback( tabKey => { + if (tabKey !== GREMLIN && tabKey !== CYPHER) { + return; + } if (executeMode === QUERY) { onExecuteQuery(tabKey); } @@ -366,7 +420,7 @@ const AnalysisHome = () => { onExecute={onExecute} onRefresh={onFavoriteRefresh} /> - { graphNums={graphNums} graphRenderMode={graphRenderMode} onGraphRenderModeChange={onGraphRenderModeChange} - /> - } + {analysisMode !== TEXT2GQL && { onRefresh={onFavoriteRefresh} onChangeSearchValue={onChangeFavorSearch} onSortChange={onSortChange} - /> + />} ); }; diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/Home/index.test.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/Home/index.test.js new file mode 100644 index 000000000..e10d0274e --- /dev/null +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/Home/index.test.js @@ -0,0 +1,103 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +import {act, fireEvent, render, screen} from '@testing-library/react'; +import AnalysisHome from './index'; +import GraphAnalysisContext from '../../Context'; +import * as api from '../../../api'; + +jest.mock('../../../api', () => ({ + analysis: { + getExecutionLogs: jest.fn(), + fetchFavoriteQueries: jest.fn(), + getGraphData: jest.fn(), + getExecutionQuery: jest.fn(), + getCypherExecutionQuery: jest.fn(), + getExecutionTask: jest.fn(), + getCypherTask: jest.fn(), + }, + manage: { + getMetaEdgeList: jest.fn(), + getMetaVertexList: jest.fn(), + getMetaPropertyList: jest.fn(), + }, +})); +jest.mock('../QueryBar/Home', () => props => ( +
+ + +
+)); +jest.mock('../QueryResult/Home', () => ({queryStatus, queryMessage}) => ( +
query result {queryStatus} {queryMessage}
+)); +jest.mock('../LogsDetail/Home', () => () =>
query history
); +jest.mock('react-i18next', () => ({useTranslation: () => ({t: key => key})})); + +const okList = {status: 200, data: {records: [], total: 0}}; + +beforeEach(() => { + api.analysis.getExecutionLogs.mockResolvedValue(okList); + api.analysis.fetchFavoriteQueries.mockResolvedValue(okList); + api.analysis.getGraphData.mockResolvedValue({ + status: 200, + data: {vertexcount: 0, edgecount: 0}, + }); + api.manage.getMetaEdgeList.mockResolvedValue(okList); + api.manage.getMetaVertexList.mockResolvedValue(okList); + api.manage.getMetaPropertyList.mockResolvedValue(okList); +}); + +afterEach(() => jest.clearAllMocks()); + +it('makes no backend request when switching to the Text2GQL placeholder', async () => { + render( + + + + ); + await act(async () => Promise.resolve()); + Object.values(api.analysis).forEach(mock => mock.mockClear()); + Object.values(api.manage).forEach(mock => mock.mockClear()); + + fireEvent.click(screen.getByRole('button', {name: 'Natural language'})); + await act(async () => Promise.resolve()); + fireEvent.click(screen.getByRole('button', {name: 'Run current'})); + await act(async () => Promise.resolve()); + + Object.values(api.analysis).forEach(mock => expect(mock).not.toHaveBeenCalled()); + Object.values(api.manage).forEach(mock => expect(mock).not.toHaveBeenCalled()); + expect(screen.queryByText('query result')).not.toBeInTheDocument(); + expect(screen.queryByText('query history')).not.toBeInTheDocument(); +}); + +it('turns a rejected synchronous query into a recoverable failed result', async () => { + api.analysis.getExecutionQuery.mockRejectedValue(new Error('offline')); + render( + + + + ); + await act(async () => Promise.resolve()); + + fireEvent.click(screen.getByRole('button', {name: 'Run current'})); + + expect(await screen.findByText(/query result failed/)).toHaveTextContent( + 'analysis.query_result.run_failed_action' + ); +}); diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.js index 9cc995aa2..9e658d594 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.js +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.js @@ -22,13 +22,13 @@ import React, {useCallback, useState} from 'react'; import {useTranslation} from 'react-i18next'; -import {Tabs} from 'antd'; +import {Alert, Input, Tabs, Tag} from 'antd'; import CodeEditor from '../../../../components/CodeEditor'; import {ANALYSIS_TYPE} from '../../../../utils/constants'; import ContentCommon from '../ContentCommon'; import c from './index.module.scss'; -const {GREMLIN, CYPHER} = ANALYSIS_TYPE; +const {GREMLIN, CYPHER, TEXT2GQL} = ANALYSIS_TYPE; const isFavoritePopoverOpen = (visible, activeTab, tabKey) => { return visible && activeTab === tabKey; @@ -108,6 +108,36 @@ const QueryBar = props => { ), }, + { + label: ( + + {t('analysis.query.text2gql_tab')} + + {t('analysis.query.text2gql_badge')} + + + ), + key: TEXT2GQL, + children: ( +
+ + {/* TODO(text2gql): connect a reviewed backend contract before + enabling input, generation, or execution. */} + +

{t('analysis.query.text2gql_privacy')}

+
+ ), + }, ]; return ( diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.module.scss b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.module.scss index 5e33b2304..b59bd7424 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.module.scss +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.module.scss @@ -40,3 +40,14 @@ display: none; } } + +.text2gqlPlaceholder { + display: grid; + gap: 16px; + padding: 16px; + + p { + margin: 0; + color: #595959; + } +} diff --git a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.test.js b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.test.js index 86a9a1585..506744853 100644 --- a/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.test.js +++ b/hugegraph-hubble/hubble-fe/src/modules/analysis/QueryBar/Home/index.test.js @@ -35,6 +35,12 @@ jest.mock('react-i18next', () => ({ useTranslation: () => ({t: key => ({ 'analysis.query.gremlin_tab': 'Gremlin', 'analysis.query.cypher_tab': 'Cypher', + 'analysis.query.text2gql_tab': 'Natural language', + 'analysis.query.text2gql_title': 'Natural-language graph query', + 'analysis.query.text2gql_description': 'This preview is not connected.', + 'analysis.query.text2gql_placeholder': 'Describe the graph question', + 'analysis.query.text2gql_badge': 'Coming soon', + 'analysis.query.text2gql_privacy': 'Nothing is sent or executed.', })[key] || key}), })); @@ -46,6 +52,35 @@ beforeAll(() => { })); }); +it('shows a same-level Text2GQL preview with no executable control', () => { + const onTabsChange = jest.fn(); + const {rerender} = render( + + ); + + fireEvent.click(screen.getByRole('tab', {name: /Natural language/})); + expect(onTabsChange).toHaveBeenCalledWith('Text2GQL'); + + rerender( + + ); + expect(screen.getByRole('textbox', { + name: 'Natural-language graph query', + })).toBeDisabled(); + expect(screen.getByText('Nothing is sent or executed.')).toBeInTheDocument(); + expect(screen.queryByRole('button', {name: /run|execute/i})).not.toBeInTheDocument(); +}); + it('does not transfer an open favorite popover when query tabs change', () => { expect(isFavoritePopoverOpen(true, 'Gremlin', 'Gremlin')).toBe(true); expect(isFavoritePopoverOpen(true, 'Cypher', 'Gremlin')).toBe(false); diff --git a/hugegraph-hubble/hubble-fe/src/utils/constants.js b/hugegraph-hubble/hubble-fe/src/utils/constants.js index 7693fc7cb..2d4ea2f4f 100644 --- a/hugegraph-hubble/hubble-fe/src/utils/constants.js +++ b/hugegraph-hubble/hubble-fe/src/utils/constants.js @@ -94,6 +94,7 @@ export const ANALYSIS_TYPE = { GREMLIN: 'Gremlin', ALGORITHM: 'Algorithms', CYPHER: 'Cypher', + TEXT2GQL: 'Text2GQL', ASYNC_CYPHER: 'Async_Cypher', ASYNC_GREMLIN: 'Async_Gremlin', }; From cadd6624058a47e8d9f920f3b976680fa2eda40e Mon Sep 17 00:00:00 2001 From: imbajin Date: Sun, 12 Jul 2026 12:57:48 +0800 Subject: [PATCH 67/68] fix(hubble): resolve accessibility and mock errors in UI tests --- .../src/pages/Meta/meta-recovery.test.js | 1 - .../hubble-fe/src/pages/Task/index.js | 100 +++++++++++------- 2 files changed, 60 insertions(+), 41 deletions(-) diff --git a/hugegraph-hubble/hubble-fe/src/pages/Meta/meta-recovery.test.js b/hugegraph-hubble/hubble-fe/src/pages/Meta/meta-recovery.test.js index 48c1424bc..a4ce24dd3 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Meta/meta-recovery.test.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Meta/meta-recovery.test.js @@ -27,7 +27,6 @@ jest.mock('../../api', () => ({ jest.mock('./ListView', () => () =>
schema list
); jest.mock('./ImageView', () => () =>
schema image
); -jest.mock('../../components/GraphJourneyNav', () => () => ); beforeEach(() => { jest.clearAllMocks(); diff --git a/hugegraph-hubble/hubble-fe/src/pages/Task/index.js b/hugegraph-hubble/hubble-fe/src/pages/Task/index.js index 171b3bfc6..bb51cfeba 100644 --- a/hugegraph-hubble/hubble-fe/src/pages/Task/index.js +++ b/hugegraph-hubble/hubble-fe/src/pages/Task/index.js @@ -111,6 +111,58 @@ const RunningText = ({status, onClick, data}) => { ); }; +const TaskActions = ({row, onView, onEdit, onEnable, onDisable, onDelete}) => { + const {t} = useTranslation(); + const canEditOrDelete = row.task_schedule_status === 'DISABLE'; + const handleView = useCallback(() => onView(row), [onView, row]); + const handleEdit = useCallback(() => onEdit(row), [onEdit, row]); + const handleDelete = useCallback(() => { + Modal.confirm({ + title: t('common.confirm.delete'), + content: t('common.confirm.delete_irrecoverable'), + onOk: () => onDelete(row.task_id), + }); + }, [onDelete, row.task_id, t]); + + return ( + + +